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' 
发布了50 篇原创文章 · 获赞 39 · 访问量 8257

猜你喜欢

转载自blog.csdn.net/Racheil/article/details/100888842