SQL-DQL语句
DQL 单表关键字执行顺序
- select
- 我们要显示 哪些列的数据,就select 哪列。
- from
- 从哪中表中获取数据。
- where
- 从表中获取数据的时候进行行级的数据过滤。
- group by
- 对数据进行分组处理, 一组获取对应的结果。
- having
- 组级过滤, 组级过滤的数据必须是分组条件或者是组函数。
- order by
- 排序
- asc 升序(系统默认) desc 降序
- 执行的顺序
- from —> where —> group by —> havnig —> select —> order by
- like 判断字符串中含不含某个字符
- is not full 判断是不是0
多表查询
-
查询的两张表如果出现同名的列,我们需要将表名标注在列名前面。
-
如果是非同名的列,表明可加可不加,推荐加上。
- 为了书写方便, 可以给表添加别名。
- 一般情况下取首字母,特殊情况下取他所代表的含义。
- 表的别名只在本次查询中生效。
-
如果表与表进行关联查询的时候,如果不添加关联的条件,查询的总记录数就是a*b = 笛卡尔积
- a 15 b 10 c 10 -----> 1500条
-
多表查询的时候必须要加条件
- 等值
- 非等值
--查询每个员工所在的部门名称 select ename, deptno from emp; select deptno, dname from dept; select emp.ename, emo.deptno, dept.deptno, dept,dname from emp, dept; --等值关联查询 select emp.ename, emp.deptno, dept,dname, deot.deptno from emp, dept where emp.deptno = dept.deptno; select emp.ename, dept.dname from emp. dept where emp.deptno = dept.deptno; --添加别名 select e.name, d.dname from emp e, dept d where e.deptno = d.deptno;
表与表关联的方式 join
-
自然连接 natural join
-
会自动选择列名相同并且类型相同的列进行连接。
-
select * from emp natural join dept;
-
-
using
-
不需要mysql帮我们选择等值连接的列,是由我们自己指定等值连接的列。
select * from emp join dept using(deptno) where sal > 2000;
-
-
on
-
可以指定两张表的关联条件, 可以是非等值连接的列。
-
select * from emp e join salgrade s on(e.sal between s.losal and s.hisal); select * from emp e join dept d on(e.deptno = d.deptno) where sal > 2000; --查询员工的部门名称和薪资等级 select e.name, d.dname, s.grade from emp e join dept d using(deptno) join salgrade s on(e.sal berween s.losal and s.hisal);
-
-
关联条件和普通条件写在一起是92,没写在一起是95.
-
--查询名字中带有A字母的员工姓名,部门名称和薪资等级 --92写法 select e.ename, d.dname, s.grade from emp e, dept d, salgrade s where e.deptno = d.deptno and e.sal between s.losal and s.hisal and e.ename like '%A%'; --95写法 select e.ename, d.dname, s.grade from emp e join dept d using(deptno) join salgrade s on(e.sal between s.losal and s.hisal) where e.ename like '%A%';
-
表与表的外连接
- 对两张表进行关联查询的时候,基于数据的原因导致其中一张表中的数据没办法被完全查询出来。
- 外连接可以让没查询出来的数据也显示出来
- 因为在写SQL的时候表总有左右之分,外连接也分为
- 左外连接:显示左面表所有的数据
- 右外连接:显示右面表所有的数据
左右外连接
-
--统计每个部门的人数 select deptno, count(empno) from emp group by deptno; select * from emp e join dept d using(deptno); select * from emp e left join dept d using(deptno); select * from emp e right join dept d using(deptno); select deptno, count(e,empno) from emp e right join dept d using(deptno) group by deptno;
union(拼接)与全外连接
-
union可把查询的结果进行一个累加,会自动去重。
-
union all就是直接累加,不去重。
-
--全外连接 select deptno, e.name, d.dname from emp e right join dept d using(deptno) union select deptno, e.ename from emp e left join dept d using(deptno);
-
left join (左连接,左外连接):返回包括左表中的所有记录和右表中连接字段相等的记录。
right join (右连接,右外连接):返回包括右表中的所有记录和左表中连接字段相等的记录。
inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。
full join (全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录。
表与表的自连接
-
查询的两个字段同时处于一张表上,我们只能将一张表当作含有不同意义的两张表去处理。
-
给相同的表去不同的别民(按其代表的不同含义去取)
-
--查询每个员工于其直属领导的名字 select e.ename, m.ename from emp e, emp m, where e.mgr = m.empno; select e.ename, m.ename from emp join emp m on(e.mgr = m.empno);
表与表的子连接
-
把一个SQL语句的查询结果当成另外一个SQL语句查询的条件
-
all 代表所有:大于或小于全部, sal < all ()… 就是小于其所有数据。
-
any 任意: 大于或小于其中一个。
-
some 一些: 满足其中一部分(和any一样)。
-
in : 在一个区间内。
-
--查询工资比公司平均薪资高的人 select * from emp where sal > (select avg(sal) from emp); --查询谁的薪资低于20部门所有人的薪资 select * from emp where sal < all(select sal from emp where deprno = 20); --查询谁的薪资高于20部门员工的薪资 select ename, sal from emp where sal > all(select sal from emp where deptno = 20); select ename, sal from emp where sal > some(select sal from emp where deptno = 20); select ename, sal from emp where sal in(select sal from emp where deptno = 20);
表与表的伪表连接
-
需要的查询条件,需要别的SQL语句提供。
-
只需要一个条件,可以使用子查询来完成
-
需要多个查询条件,要将所有的查询结果当作伪表进行管理
-
需要把一些含有特殊符号的列名设置为别名,然后给伪表设置一个别名(见明知意)。
-
--查询员工信息 (高于自己部门的平均薪资的员工(每个部门都不一样)) select * from emp e join (select deptno, avg(sal) avgsal from emp group by deptno) da on (e,deptno = da.deptno and e. sal > da.avgsal);