一、基本查詢
Test1
找出所有員工當前(to_date='9999-01-01')具體的薪水salary情況,對於相同的薪水只顯示一次,並按照逆序顯示
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
select salary from salaries
where to_date = '9999-01-01' group by salary order by salary desc;
Test2
查找最晚入職員工的所有信息
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
select emp_no,birth_date,first_name,last_name,gender,hire_date
from employees order by hire_date desc limit 0,1
總結:
1. 當limit後面跟兩個參數的時候,第一個數表示要跳過的數量,後一位表示要取的數量
2. 當 limit和offset組合使用的時候,limit後面只能有一個參數,表示要取的的數量,offset表示要跳過的數量
Test3
查找入職員工時間排名倒數第三的員工所有信息
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
select emp_no,birth_date,first_name,last_name,gender,hire_date from employees
order by hire_date desc limit 1 offset 2;
//offset 2 跳過兩個,取第三個
Test4
查找薪水漲幅超過15次的員工號emp_no以及其對應的漲幅次數t
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
select emp_no,count(emp_no)as t from salaries group by emp_no
having count(emp_no) > 15
總結: group by 一般與 having 搭配 聚合函數使用
聚合函數:
Test5
獲取所有部門當前manager的當前薪水情況,給出dept_no, emp_no以及salary,當前表示to_date='9999-01-01'
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
select d.dept_no,d.emp_no,s.salary from dept_manager as d,salaries as s
where d.emp_no = s.emp_no and s.to_date = '9999-01-01'and d.to_date = '9999-01-01'
Test6
從titles表獲取按照title進行分組,每組個數大於等於2,給出title以及對應的數目t。
CREATE TABLE IF NOT EXISTS "titles" (
`emp_no` int(11) NOT NULL,
`title` varchar(50) NOT NULL,
`from_date` date NOT NULL,
`to_date` date DEFAULT NULL);
select title,count(title) as t from titles group by title having t >= 2
總結:group by 用於按照列進行分組(即列數據相同的分爲一組,並且可以去重),having 用於聚合函數的相關判斷 (即對分組後的數據進行操作,比如統計該組所有數據中某列數據相關查詢(count(某列),max(某列),min(某列))
Test7
編寫一個 SQL 查詢,查找 Person 表中所有重複的電子郵箱。
+-----+-----------+
| Id | Email |
+------+----------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
+------+----------+
select Email from Person group by Email having count(Email) > 1
Test8
如果一個國家的面積超過300萬平方公里,或者人口超過2500萬,那麼這個國家就是大國家。
編寫一個SQL查詢,輸出表中所有大國家的名稱、人口和麪積。
select name,population,area from World
where area > 3000000 or population >25000000
Test9
編寫一個 SQL 查詢,獲取
Employee
表中第 n 高的薪水(Salary)
select distinct Salary from Employee order by Salary limit 1 offset N
二、內置函數
查找字符串'10,A,B' 中逗號','出現的次數cnt
select length('10,A,B') - length(replace('10,A,B',',','')) as cnt
三、複合查詢
Test1
查找所有員工入職時候的薪水情況,給出emp_no以及salary, 並按照emp_no進行逆序
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
select e.emp_no,s.salary from employees as e,salaries as s
where e.emp_no = s.emp_no and e.hire_date = s.from_date
order by s.emp_no desc
Test2
獲取所有非manager的員工emp_no
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
select emp_no from employees where emp_no not in (select emp_no from dept_manager)
Test3
獲取所有員工當前的manager,如果當前的manager是自己的話結果不顯示,當前表示to_date='9999-01-01'。
結果第一列給出當前員工的emp_no,第二列給出其manager對應的manager_no。
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `dept_manager` (
`dept_no` char(4) NOT NULL,
`emp_no` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));
select distinct e.emp_no as emp_no,m.emp_no as manager_no
from dept_emp as e,dept_manager as m
where e.emp_no != m.emp_no and e.dept_no = m.dept_no
and e.to_date = '9999-01-01' and m.to_date ='9999-01-01'