mysql表连接
表連接
1.表連接的分類
(1)表連接分為兩種:內連接和外連接。
(2)內連接是結果集中只保留符合連接條件的記錄。
(3)外連接是不管符不符合連接條件,記錄都要保留在結果接種。
2.內連接
select … from 表1
[inner] join 表2 on 條件
[inner] join 表3 on 條件
…
內連接的多種語法形式
select … from 表1 join 表2 on 連接條件;
select … from 表1 join 表2 where 連接條件;
select … from 表1,表2 where 連接條件;
tips:內連接的數據表中不一定必須有同名字段,只要字段之間符合邏輯關系就可以
#查詢與scott相同部門的員工都有誰? select e2.ename from t_emp e1 join t_emp e2 on e1.deptno=e2.deptno where e1.ename = "scott" and e2.ename!="scott"; #查詢底薪超過公司平均底薪的員工信息? select e.empno,e.ename,e.sal from t_emp e join (select avg(sal) avg from t_emp) t on e.sal>=t.avg;#查詢research部門的人數、最高底薪、最低底薪、平均底薪、平均工齡? select count(*),max(e.sal),min(e.sal),avg(e.sal), avg(datediff(now(),e.hiredate)/365) from t_emp e join t_dept d on e.deptno=d.deptno where d.name="research"select floor(28.9) select ceil(1.1)floor() 強制舍去
ceil() 強制進位
3.外連接簡介
外連接與內連接的區別在于,除了符合條件的記錄之外,結果集中還會保留不符合條件的記錄。
select e.empno,e.ename,dname from t_emp e left join t_dept d on e.deptno = d.deptno;(1)左連接和右連接
左外連接就是保留左表所有的記錄,與右表做連接。如右表有符合條件的記錄就與左表連接。如果右表沒有符合條件的記錄,就用null與左表相連。右外連接也是如此。
select e.empno,ename,d.name from t_dept d right join t_emp e on e.deptno=d.deptno;UNION關鍵字可以將多個查詢語句的結果集進行合并
(查詢語句) UNION (查詢語句)UNION (查詢語句)…
外連接的注意事項
內連接只保留符合條件的記錄,所以查詢條件寫在on子句和where子句中的效果是相同的。但是外連接里,條件寫在where子句里,不符合條件的記錄是會被過濾掉,而不是保留下來。
3.子查詢簡介
(1)子查詢是一種查詢中嵌套查詢的語句
#查詢底薪超過公司平均底薪的員工的信息 select empno,ename,sal from t_emp where sal>=(select avg(sal) from t_emp);(2)子查詢的分類
子查詢可以寫在三個地方:where子句、from子句、select子句,但是只有from子句子查詢最可取
where子查詢
1)子查詢最簡單,最容易理解,但是卻效率很低的子查詢
#查詢底薪超過公司平均底薪的員工的信息 select empno,ename,sal from t_emp where sal>=(select avg(sal) from t_emp);from子查詢
這種子查詢只會執行一次,所以查詢效率很高
select e.empno,e.ename,e.sal,t.avg from t_emp e join(select deptno,avg(sal) as avgfrom t_emp group by deptno) t on e.deptno=t.deptno and e.sal>=t.avg;select 子查詢
這種子查詢每輸出一條記錄的時候都要執行一次,查詢效率很低。
select e.empno,e.ename, (select dname from t_dept where deptno = e.deptno) from t_emp e;單行子查詢和多行子查詢
- 單行子查詢的結果集之后一條記錄,多行子查詢結果集有多行記錄。
- 多行子查詢只能出現在where子句和from子句中。
where 子句中的多行子查詢
- where 子句中,可以使用in,all,any,exists關鍵字來處理多行表達式結果集的條件判斷
all 所有
any 任一
exists關鍵字
- exists關鍵字是把原來在子查詢之外的條件判斷,寫到了子查詢里面。
select … from 表名 where [not] exists(子查詢);
總結
- 上一篇: Mybatis-Plus讲义
- 下一篇: oracle数据库HugePages配置