ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql学习笔记(六)92语法和99语法

2022-06-12 16:35:15  阅读:147  来源: 互联网

标签:99 join -- 语法 emp mysql deptno 连接 select


  • 关联查询
sql分为1992语法和1999语法。首先来看92语法的连接:
规则:select table1.colm,table2.colm from table1,table2 where table1.colum = table2.colum;
在where子句中写入连接条件。当表中有重名的列时,必须在列的名字前加上表名作为前缀。
连接的类型:
  1.等值连接--equal join
  2.非等值连接--non-equal join
  3.外连接--outer join
  4.自连接--self join
在进行连接的时候可以使用等值连接,也可以使用非等值连接。
--查询雇员名称以及自己的薪水等级(非等值连接)
select e.sal,e.ename,sg.grade from emp e,salgrade sg where e.sal between sg.losal and sg.hisal;
--等值连接:两个表中包含相同的列明
--非等值连接:两个表中没有相同列名,但是某一个列在另一张表的列范围内。
--外连接:利用等值连接只会把关联到的数据显示,没有关联到的数据不会显示,此时需要外连接。
--分类:左外连接(左表全部数据显示)和右外连接(右边数据全部显示)
  select * from emp e,dept d where e.deptno = d.deptno;//等值连接
  select * from emp e,dept d where e.deptno = d.deptno(+);//谓词,左外连接
  select * from emp e,dept d where e.deptno(+) = d.deptno;//右外连接
--自连接:将一张表当成不同的表来看待,自己关联自己。
  如,将雇员和他经理的名称查出来。
  select e,ename,m,ename from emp e,emp m where e.mgr = m.empno;
--笛卡尔积,当关联多张表,但是不指定连接条件的手,会进行笛卡尔积,关联后的总记录条数为m*n;m和n表示两张表的列数,一般不使用。
  select * from emp e,dept d;
  • 92语法有什么问题?
    答:在92语法中,多张表的连接条件会放到where子句中,同时where需要对表进行条件过滤,因此相当于过滤条件和连接条件揉到一起,太乱了,所以出现了99语法。
  • 99语法修正了整个缺点,把连接条件,过滤条件分开来,并引入了新的table join语法结构。
--cross join,交叉连接等同于92中的笛卡尔积。
select * from emp cross join dept;
--natural join,自然连接相当于92中的等值连接。
  不需要写连接条件,会从两张表中找到相同列做连接。
  当两张表中不具有相同的列名时,会进行笛卡尔积操作。
  select * from emp e natural join dept d;等值连接
  select * from emp e natural join salgrade sg;笛卡尔积
--on子句,添加连接条件(可以等值连接,也可以非等值连接) 
  select * from emp e join dept d on e.deptno = d.deptno;//等值连接
  select * from emp e join salgrade sg on e.sal between sg.losal and sg.hisal;//非等值连接
--left (outer)join,左外连接,outer可省略
  select * from emp e left outer join dept d on e.deptno = d.deptno;
  select * from emp e ,dept d where e.deptno = d.deptno(+);
--right(outer)join,右外连接,outer可省略
--full outer join 全连接,相当于左外连接和右外连接的合集。
  select * from emp full outer join dept d on e.deptno = d.deptno;
--inner join 内连接,两张表的连接查询,只会查询出右匹配记录的数据。
  select * from emp e inner join dept d on e.deptno = d.deptno;
  select * from emp e join dept d on e.deptno = d.deptno;
--using 除了使用on表示连接条件外,也可以使用using作为连接条件,此时连接条件的列不再归属于任何表。(与On的区别就是这个)
  select d.deptno(错)应改为deptno  from emp e join dept d using (deptno);
  select d.deptno from emp e join dept d on e.deptno = d.deptno;
  using子句引用的列在sql任何地方都不能使用表名或别名做前缀,natural子句同样适合。
--检索雇员名字,所在单位,薪水等级。
  select e.ename,d.loc,sg.grade from emp e join dept d on e.deptno = d.deptno join salgrade sg on e.sal between sg.losal and sg.hisal;

标签:99,join,--,语法,emp,mysql,deptno,连接,select
来源: https://www.cnblogs.com/shaokai7878/p/16368212.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有