1、基本查詢
1.基本語法格式
語法格式
指定按某字段進行排序,默認增序asc,降序desc
2.常見查詢
2.1 select 指定展現結果集
1. #導入了3個sql文件,老師給的!
2. #1.查詢emp表中全部的員工信息
3. select * from emp;
4. #2.在emp表中查詢全部員工的姓名和職位信息
5. select ename, job from emp;
2.2 where指定檢索條件:關係運算符、邏輯運算符、in關鍵詞、是否空值、範圍查詢between and
1. #3.在emp表中查詢全部的20號部門的員工信息
2. select * from emp where deptno=20;
3. #4.在emp表中查詢工做大於2000的員工的姓名和工資
4. select ename, sal from emp where sal > 2000;
5. #5.在emp表中查詢工做在1000到2000之間的員工信息(範圍查詢)
6. select * from emp where sal > 1000 and sal < 2000;
7. select * from emp where sal between 1000 and 2000;
8. #6.在emp表中查詢員工編號爲7788,7369,7521的員工信息
9. select * from emp where empno = 7788 or empno = 7369 or empno = 7521;
10. select * from emp where empno in (7788,7369,7521);
11. #9.在emp表中查詢全部沒有獎金的員工信息。(comm值爲空)
12. select * from emp where comm is null;
13. select * from emp where comm is not null;
2.3 去重distinct 關鍵字
1. #7.在emp表中查詢全部的職位信息(去重)
2. select distinct job from emp;
2.4 取別名
1. #8.在emp中查詢工資提高5%後的員工姓名及工資(別名:字段、表達式、表、結果集等)
2. # 別名格式:[as] 別名
3. select ename,sal * 1.05 nsal from emp;
4. select emp.ename,emp.sal from emp;
5. select e.ename,e.sal from emp e;
2.5 排序 order by 和限制結果查詢 limit
1. #10.在emp中查詢工資最高的員工信息
2. #方法一:使用SQL提供的函數
3. #方法二:倒序排序取第一個
4. #排序:order by 排序的字段(默認升序,asc 升序,desc 降序)
5. #先按照工資降序排序,若是工資同樣,則按照編號降序排序
6. select * from emp order by sal desc, empnodesc;
7. #限制結果查詢(格式:limit 開始索引, 長度,其中索引從0開始,若是是從0開始,則索引能夠不
8. #寫,直接寫 limit 5,表示去前5條),限制結果查詢功能僅適用於mysql。
9. select * from emp order by sal desc limit 1;
2.6 模糊查詢
關鍵字和通配符:
· 模糊查詢:like
· %:表明0到多個字符
· _:表明1位字符
示例代碼:
1. #11.查詢名稱中包含s的員工信息(模糊查詢:like %:表明0到多個字符 _:表明1位字符)
2. select * from emp where ename like '%s%';
3. select * from emp where ename like 's%';
4. select * from emp where ename like '%s';
5. #查詢名稱第3個字符是L的員工信息
6. select * from emp where ename like '__L%';
2、高級查詢
1.關聯查詢(也稱爲鏈接查詢)
1.1 定義:查詢多張表或結果集
1.2 分類:內鏈接和外鏈接
1.3 內鏈接
語法格式:
1. #在emp查詢全部的員工及其所在部門信息
2. #語法一:
3. #where的條件至關於從笛卡爾積中進行檢索
4. select * from emp,dept where emp.deptno = dept.deptno;
5. #語法二:inner join … on
6. select * from emp inner join dept on emp.deptno = dept.deptno;
7. #語法三:存在通用列,因此能夠這樣寫
8. select * from emp inner join dept using(deptno);
特色總結:
· 多張關聯表共有的記錄才能出如今結果集中。
· 內鏈接的結果與鏈接順序無關。
1.4 外鏈接
語法格式:
· 左外鏈接:left [outer] join … on …
· 右外鏈接:right [outer] join … on …
示例代碼:
1. #查詢全部的部門及其部門下的員工信息(內鏈接就解決不了了)
2. select * from dept left join emp on emp.deptno = dept.deptno;
3. select * from dept left join emp on dept.deptno = emp.deptno;
4.
5. #天然鏈接(天然鏈接都是等值鏈接,等值鏈接不必定是天然鏈接)
6. select * from emp natural join dept;
7.
8. #查詢20號部門全部員工及其所在部門信息
9. select * from emp , dept where emp.deptno = dept.deptno and emp.deptno=20;
10. select * from (select * from emp where deptno = 20) e,dept wheree.deptno=dept.deptno;
11.
12. #查詢全部員工及其上級領導(mgr)的名稱(自鏈接)
13. select e1.ename '姓名', e2.ename '領導' from emp e1 left join emp e2 on e1.mgr=e2.empno;
特色總結:
· 外鏈接結果與鏈接順序有關。
· 有主從表之分,依次遍歷主表每條記錄並與關聯表進行匹配,若匹配成功則關聯展現到結果集,若匹配失敗則以null填充。
2.子查詢
1.1 定義
將一個查詢結果做爲另外一個查詢的條件或組成繼續進行檢索。
2.2 分類
單行子查詢:子查詢返回的結果是一條記錄
多行子查詢:子查詢返回的結果是多條記錄
2.3 單行子查詢
示例代碼:
1. #查詢編號爲7788的員工所在部門的信息
2. #方法一:關聯查詢實現
3. select dept.* from (select * from emp where empno = 7788) e, dept where e.deptno=dept.deptno;
4. #方法二:子查詢(或嵌套查詢)實現
5. #查詢7788員工的部門編號,將條件和結果放到一張表中(查找通用列)
6. select * from dept where deptno = (select deptno from emp where empno = 7788);
7.
8. #查詢工資>20號部門平均工資的員工信息
9. select * from emp where sal > (select avg(sal) from emp where deptno = 20);
10. #查詢工資>20號部門平均工資而且不在20號部門的員工信息
11. select * from emp where sal > (select avg(sal) from emp where deptno = 20) and deptno<>20;
2.4 多行子查詢
2.4.1 關鍵詞: any 與all
1. # 關鍵詞:any / all:
2. # =any:至關於in >any:大於最小值 <any:小於最大值
3. # >all:大於最大值 <all:小於最小值
4.
5. #查詢工資大於2000的員工所在部門信息
6. select * from dept where deptno in (select distinct deptno from emp where sal > 2000);
7.
8. #查詢工資大於所在部門的平均工資的員工信息
9. #關聯查詢實現
10. select emp.* from emp , (select deptno , avg(sal) avg from emp group by deptno) e where
11. emp.deptno = e.deptno and sal > e.avg;
12. #子查詢實現
13. #步驟:
14. #1.主查詢將deptno傳給子查詢
15. #2.子查詢根據主查詢的deptno查詢指定部門的平均工資
16. #3.子查詢將該部門平均工資返回給主查詢
17. #4.主查詢根據返回結果進行最後檢索。
18. select * from emp e1 where sal > (
19. select avg(sal) from emp e2 where e2.deptno = e1.deptno
20. );
2.4.2 關鍵詞:exists
示例代碼:
1. #查詢工資>2000的員工所在的部門信息
2. #exists:
3. #1.將主查詢的記錄一次次交給子查詢
4. #2.在子查詢中匹配記錄,若是可以找到匹配的記錄,返回true,此時將展現主查詢該條記錄;如
5. #果不匹配則返回false,主查詢該條記錄不展現
6. select * from dept where exists (
7. select * from emp where sal > 2000 and emp.deptno =dept.deptno
8. );
in和exsits的區別:
· in先執行子查詢,exists先執行主查詢
· in須要關注子查詢返回值的字段信息;exists不須要關心返回字段
· exists將主查詢的記錄依次在子查詢中匹配,若是匹配返回true展現。
2.5 總結
何時使用關聯查詢?何時使用子查詢?
· 當查詢結果存在多張表,使用關聯查詢;當查詢結果存在於一張表,用子查詢。
· 關聯查詢資源消耗高,子查詢資源消耗低但可能存在屢次查詢。
3.聯合查詢:合併結果集
3.1 條件
多個結果集的字段必須保持一致,才能進行聯合查詢
3.2 關鍵詞
union:聯合結果集並去重
union all:聯合結果集但不去重
3.3 爲何使用聯合查詢?
理論上能夠用or關鍵詞代替聯合查詢,但or關鍵詞會致使索引失效故此使用聯合查詢。
3.4 示例代碼
1. #查詢20號部門以及工資>2000的員工信息
2. select * from emp where deptno = 20 or sal > 2000;
3. select * from emp where deptno = 20 union select * from emp where sal > 2000;
4. select * from emp where deptno = 20 union all select * from emp where sal > 2000;
|