【原创】复杂sql语句
参考:
⼀,理解:
1,复杂sql语句,⼀般是⽤⼦查询嵌套和 join 连接导致的,结合in, not in, any, all, exists,  not exists;
2,⼦查询是分为关联⼦查询和⾮关联⼦查询,⼦查询的where是否与外部查询的表字段有关联;
3,⼦查询的返回有4种情况(单⼀值,⼀⾏,⼀列,多⾏多列的⼦表)对应不同的查询条件
(1)单⼀值可以⽤在where⼦句中的 =、 >、>=、<、<=、!=查询条件,select ⼦句中作为⼀个字段返回,order by⼦句中作为排序条件
(2)⼀列⽤在where⼦句中的 in,any,all等查询条件
(3)⼀⾏的时候,可以当做批量单⼀值来⽤,只能使⽤ = 条件。
SELECT*FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2);//不⽀持!=,<,<=,>,>=
SELECT*FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);
(4)⼦表可以⽤在where⼦句中的 exists,not exists的查询条件;或者from⼦句后⾯(此时⼦表必须命名,并且不能为有关联的⼦查询)
4,join的使⽤:
(1)mysql中没有full outer join;只有left outer join或者right outer join
(2)mysql中left join和left outer join效果⼀样,right也是;left 或 right的作⽤是连接字段可以在另⼀个表中不存在
(3)mysql有⼀个cross join ,相当于inner join 不加on,或者 from两个表的效果:from A, B
(4)join都是笛卡尔积,关键是要理解连接字段在表中的存在情况
(5)join和group by⼀起使⽤作⽤会⼤增
//1
select*from A inner join B on A.key_a = B.key_b;//AB交集的笛卡尔积,可能⽐A或B的⾏数还多
//2
select*from A left join B on A.key_a = B.key_b;//A全部的笛卡尔积
//3
select*from A right join B on A.key_a = B.key_b;//B全部的笛卡尔积
//4
select*from A left join B on A.key_a = B.key_b where B.key_b is null;//在A中不在B中的⾏数,笛卡尔积//此时left join可以替换为left outer
//5
select*from A right join B on A.key_a = B.key_b where A.key_a is null;//在B中不在A中的⾏数,笛卡尔积
//6:结合4和5
select*from A left join B on A.key_a = B.key_b where B.key_b is null;
union
select*from A right join B on A.key_a = B.key_b where A.key_a is null;//要么在A中要么在B中,这个说法也不具体,具体是连接的字段的值要么在A中存在,要么在B中存在//7:
select*from A inner join B;//不加on条件, 就是A表⾏数和B表⾏数的笛卡尔乘积多个结果
5,union和union all的使⽤
(1)⽤于合并两个或多个 SELECT 语句的结果集
(2)每个 SELECT 语句必须拥有相同数量的列
sql语句查询不包含(3)列也必须拥有相似的数据类型
(4)每个 SELECT 语句中的列的顺序必须相同
(5)union会去重,union all不会去重,去重的规则是⼀⾏中所有列都对应相同才去重
6,复杂sql语句可能有多种实现写法;
⼆,实战举例
参考:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。