目錄
復合查詢
回顧基本查詢
多表查詢
自連接
子查詢?
where 字句中使用子查詢
單行子查詢
多行子查詢
多列子查詢
from 字句中使用子查詢
合并查詢
實戰OJ
查找所有員工入職時候的薪水情況
獲取所有非manager的員工emp_no
獲取所有員工當前的manager
表的內外連
內連接
外連接
左連接
右外連接
實戰OJ
分數排名
換座位
復合查詢
回顧基本查詢
????????查詢工資高于500或崗位為MANAGER的雇員,同時還要滿足他們的姓名首字母為大寫的J
????????按照部門號升序而雇員的工資降序排序
????????使用年薪進行降序排序
????????顯示工資最高的員工的名字和工作崗位
????????顯示工資高于平均工資的員工信息
????????顯示每個部門的平均工資和最高工資
????????顯示(按照每個部門)平均工資低于2000的部門號和它的平均工資
????????顯示每種崗位的雇員總數,平均工資
多表查詢
????????實際開發中往往數據來自不同的表,所以需要多表查詢
? ? ? ? 使用 select * from 連接兩張表時用逗號隔開,結果是兩張表的所有記錄組合,稱為笛卡爾積
????????顯示雇員名、雇員工資以及所在部門的名字
????????顯示部門號為10的部門名,員工名和工資
????????顯示各個員工的姓名,工資,及工資級別
自連接
????????自連接是指在同一張表連接查詢
????????顯示員工FORD的上級領導的編號和姓名(mgr是員工領導的編號 empno是公司員工編號)
子查詢?
????????子查詢是指嵌入在其他sql語句中的select語句,也叫嵌套查詢
where 字句中使用子查詢
單行子查詢
? ? ? ? 返回一行記錄的子查詢
????????顯示SMITH同一部門的員工
多行子查詢
? ? ? ??返回多行記錄的子查詢
????????查詢和10號部門的工作崗位相同的雇員的名字,崗位,工資,部門號,但是不包含10自己的(使用 in 關鍵字)
????????顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號(可以使用 all 關鍵字)
????????顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(比部門30的最小工資大即可)(使用 any 關鍵字)
多列子查詢
????????單行子查詢是指子查詢只返回單列,單行數據;多行子查詢是指返回單列多行數據,都是針對單列而言的,而多列子查詢則是指查詢返回多個列數據的子查詢語句
????????查詢和SMITH的部門和崗位完全相同的所有雇員的名字,崗位和部門,不含SMITH本人
from 字句中使用子查詢
????????顯示每個高于自己部門平均工資的員工的姓名、部門、工資、平均工資
????????查找每個部門工資最高的人的姓名、工資、部門、最高工資(太長省略as關鍵字)
????????顯示每個部門的信息(部門名,編號,地址)和人員數量
合并查詢
????????在實際應用中,為了合并多個select的執行結果,可以使用集合操作符 union,union all找并集
????????將工資大于2500或職位是MANAGER的人找出來(使用 union 把不出現重復行)
? ? ? ? 使用union all 可出現結果重復(出現交集的地方允許重復)
實戰OJ
查找所有員工入職時候的薪水情況
select s.emp_no,s.salary from employees e,salaries s
where e.emp_no=s.emp_no and e.hire_date=s.from_date
order by emp_no desc;
獲取所有非manager的員工emp_no
select emp_no from employees where emp_no not in (select emp_no from dept_manager);
獲取所有員工當前的manager
select e.emp_no,m.emp_no from dept_emp e,dept_manager m
where e.dept_no=m.dept_no and e.emp_no!=m.emp_no;
表的內外連
內連接
????????內連接實際上就是利用where子句對兩種表形成的笛卡兒積進行篩選,我們前面的多表查詢都是內連接,也是在開發過程中使用的最多的連接查詢
????????顯示SMITH的名字和部門名稱
外連接
? ? ? ? 外連接分為左連接與右連接
左連接
? ? ? ? 多表查詢,左側的表顯示所有信息我們就說是左外連接
? ? ? ? 建兩張表:學生表與成績表并在里面插入對應的數據
????????查詢所有學生的成績,如果這個學生沒有成績,也要將學生的個人信息顯示出來
右外連接
? ? ? ? 多表查詢,右側的表顯示所有信息我們就說是右外連接
????????對stu表和stu_exam表聯合查詢,把所有的成績都顯示出來,即使這個成績沒有學生與它應,也要顯示出來
????????列出部門名稱和這些部門的員工名,同時列出沒有員工的部門
實戰OJ
分數排名
相同的表查詢:
第一張a表中我們對分數進行降序排序;
第二張b表中我們去除重復的分數后得到集合X:在X中找到比a表的分數大于等于的數的元素個數,此時該元素個數就是a表的分數在表中的排名,比如:最高為98,在集合X中找到的分數有98,99,100:此時元素個數為3也就是98分的排名
select a.score score,
(select count(distinct b.score) from Scores b where b.score>=a.score) 'rank'
from Scores a order by a.score desc;
換座位
遇到id遇到偶數-2 / 偶數-1,奇數+1
select rank() over(order by if(id%2=0,id-2,id)) as id,student from Seat;
-- select id,student from Seat order by if(id%2=0,id-2,id);
以上便是全部內容,有問題歡迎在評論區指正,感謝觀看!