ITPub博客

首页 > 数据库 > MySQL > 子查询学习笔记1

子查询学习笔记1

原创 MySQL 作者:dongyu2013 时间:2013-12-25 19:26:11 0 删除 编辑
子查询必须包含括号。
子查询的好处:
子查询允许结构化的查询,这样就可以把一个查询语句的每个部分隔开。
子查询提供了另外一种方法来执行有些需要复杂的join和union 来实现的操作。
在许多人看来,子查询可读性较高。而实际上,这也是子查询的又来。
子查询的限制,目前用户不能即在一个子查询中修改一个表,又在同一个表中进行选择,虽然这样的操作可用于普通的delete,insert,replace和update语句中 ,但是对于子查询不可以同时进行这样的操作。
以下是一个常见的子查询的比较例子,其中不能使用join来完成此类比较。表t1中的某些值与表t2中最大值相同,该子查询可以查询出所有这些行数。
select column1 from t1
where column1 = ( select Max(column2) from t2);
不能使用join来得到结果, 因为该例子涉及到对其中一个表进行统计。表t1中的有些行含有的值会在给定的列中出现两次,该例子可以查找出所有这些行。
select * from t1 as t
where 2 = ( select count(*) from t1 where t1.id=t.id);
any和some关键词是相同。
如表t2为空表,以下语句为true
select * from t1 where 1 > all (select s1 from t2);
如果t2为空表,以下语句为NULL
select * from t1 where 1> (select s1 from t2);
如果t2为空表,以下语句为NULL
select * from t1 where 1 > all (select max(s1) from t2);
NOT IN 和 <>ALL 相同。
例子,每个美国员工至少处理过一个订单的所有客户。
SELECT customerid
FROM orders
WHERE employeeid IN
(SELECT employeeid FROM employees WHERE country = 'USA')
GROUP BY customerid
HAVING COUNT(employeeid) = 
( SELECT COUNT(*) FROM employees WHERE country = 'USA');
例子,返回每个月最后实际订单日期发生的订单
SELECT orderid,customerid,employeeid,orderdate
FROM orders
WHERE orderdate IN 
(SELECT MAX(orderdate) FROM orders
                               GROUP BY (DATE_FORMAT(orderdate,'%Y%mhm')))
EXISTS 二值返回
例子,查询返回来自西班牙且发生过订单的消费者。
SELECT customerid,companyname
FROM customers AS A
WHERE country = 'Spain'
    AND EXISTS (SELECT * FROM orders AS B 
                        WHERE A.customerid=B.customerid);
注:尽管通常不建议在SQL语句中使用*,因为可能会引起一些问题,但是在EXITS子查询中*可以放心使用。EXISTS只关心是否存在,而不会去取各列的值。
列表中含有NULL值时,IN总是返回TRUE和UNKNOWN,所以NOT IN返回FALSE和UNKNOWN。
NOT EXISTS 总是返回TRUE和FALSE 这是和NOT IN的最大区别。














来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29012686/viewspace-1064405/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-12-25

  • 博文量
    263
  • 访问量
    238065