MySQL之Sql語句總結

一、基本查詢

 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 表中第 高的薪水(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' 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章