子查询
子查询是嵌套在较大查询中的 SQL 查询,也称内部查询或内部选择,包含子查询的语句也称为外部查询或外部选择。简单来说,子查询就是指将一个 select 查询(子查询)的结果作为另一个 SQL 语句(主查询)的数据来源或者判断条件。
子查询可以嵌入 SELECT、INSERT、UPDATE 和 DELETE 语句中,也可以和 =、<、>、IN、BETWEEN、EXISTS 等运算符一起使用。
子查询常用在 WHERE 子句和 FROM 子句后边:
- 当用于
WHERE子句时,根据不同的运算符,子查询可以返回单行单列、多行单列、单行多列数据。子查询就是要返回能够作为WHERE子句查询条件的值。 - 当用于
FROM子句时,一般返回多行多列数据,相当于返回一张临时表,这样才符合FROM后面是表的规则。这种做法能够实现多表联合查询。
注意:MYSQL 数据库从 4.1 版本才开始支持子查询,早期版本是不支持的。
用于 WHERE 子句的子查询的基本语法如下:
select column_name [, column_name ]
from table1 [, table2 ]
where column_name operator(select column_name [, column_name ]from table1 [, table2 ][where])
- 子查询需要放在括号
( )内。 operator表示用于 where 子句的运算符。
用于 FROM 子句的子查询的基本语法如下:
select column_name [, column_name ]
from (select column_name [, column_name ]from table1 [, table2 ][where]) as temp_table_name
where condition
用于 FROM 的子查询返回的结果相当于一张临时表,所以需要使用 AS 关键字为该临时表起一个名字。
子查询的子查询
SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_idFROM ordersWHERE order_num IN (SELECT order_numFROM orderitemsWHERE prod_id = 'RGAN01'));
内部查询首先在其父查询之前执行,以便可以将内部查询的结果传递给外部查询。执行过程可以参考下图:
WHERE
WHERE子句用于过滤记录,即缩小访问数据的范围。WHERE后跟一个返回true或false的条件。WHERE可以与SELECT,UPDATE和DELETE一起使用。- 可以在
WHERE子句中使用的操作符。
| 运算符 | 描述 |
|---|---|
| = | 等于 |
| <> | 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 != |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| BETWEEN | 在某个范围内 |
| LIKE | 搜索某种模式 |
| IN | 指定针对某个列的多个可能值 |
SELECT 语句中的 WHERE 子句
SELECT * FROM Customers
WHERE cust_name = 'Kids Place';
UPDATE 语句中的 WHERE 子句
UPDATE Customers
SET cust_name = 'Jack Jones'
WHERE cust_name = 'Kids Place';
DELETE 语句中的 WHERE 子句
DELETE FROM Customers
WHERE cust_name = 'Kids Place';
IN 和 BETWEEN
IN操作符在WHERE子句中使用,作用是在指定的几个特定值中任选一个值。BETWEEN操作符在WHERE子句中使用,作用是选取介于某个范围内的值。
IN 示例
SELECT *
FROM products
WHERE vend_id IN ('DLL01', 'BRS01');
BETWEEN 示例
SELECT *
FROM products
WHERE prod_price BETWEEN 3 AND 5;
AND、OR、NOT
AND、OR、NOT是用于对过滤条件的逻辑处理指令。AND优先级高于OR,为了明确处理顺序,可以使用()。AND操作符表示左右条件都要满足。OR操作符表示左右条件满足任意一个即可。NOT操作符用于否定一个条件。
AND 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
OR 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';
NOT 示例
SELECT *
FROM products
WHERE prod_price NOT BETWEEN 3 AND 5;
LIKE
LIKE操作符在WHERE子句中使用,作用是确定字符串是否匹配模式。- 只有字段是文本值时才使用
LIKE。 LIKE支持两个通配符匹配选项:%和_。- 不要滥用通配符,通配符位于开头处匹配会非常慢。
%表示任何字符出现任意次数。_表示任何字符出现一次。
% 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '%bean bag%';
_ 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE '__ inch teddy bear';