DQL多表关联,查询。

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);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值