一、前言
这边是sql总结的第二篇文章,比基础篇稍微复杂一点点的sql总结,我们的查询要有两张或者两张以上的表。
二、sql的进阶之路
userinfo表,字段及数据如下
department表,字段及数据如下
newuserinfo表,userinfo表复制之后,进行数据修改,为测试union关键字
2.1 in关键字:IN (value1,value2,...)
查询年龄为22,25,40的人员信息
select * FROM userinfo where age in(22,24,40);
查询年龄不是22,25,40的人员信息
select * FROM userinfo where age not in(22,24,40);
2.2 别名 as :给表或者列取个别名
列别名
select username as xingming,age as nianling,sex as '性别' FROM userinfo;
查询结果如下:
表别名
select u.username as username,u.age as age,u.sex as sex FROM userinfo u;
2.3 join
inner join ... on :在表中存在至少一个匹配时,返回行,on后面放的是两张表值相同的字段,也就是两张表链接的条件
select u.*,d.*
FROM userinfo u
INNER JOIN department d
ON u.departmentid=d.id;
查询结果如下:
left join ... on:关键字会从左表 (userinfo表) 那里返回所有的行,即使在右表 (department表) 中没有匹配的行。
select u.*,d.*
FROM userinfo u
LEFT JOIN department d
ON u.departmentid=d.id;
查询结果如下:
right join ... on:会右表 (department表) 那里返回所有的行,即使在左表 (userinfo表) 中没有匹配的行。
select u.*,d.*
FROM userinfo u
RIGHT JOIN department d
ON u.departmentid=d.id
where d.higherdeptid>0;
2.4 union 和 union all
union:用于合并两个或多个 SELECT 语句的结果集;UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。默认地,UNION 操作符选取不同的值。
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
select username,age from userinfo
union
select username,age from newuserinfo;
查询结果如下:可以看出,union查询的是两张表username或者age不同的数据。
union all :不会去掉重复数据。完全两个表的数据取和
select username,age from userinfo
union all
select username,age from newuserinfo;
结果为29条数据。