1:limit的用法:1,2,3,4,5,6,7,8,9,10,11
select * from employees order by id limit 10,1 > 11
select * from employees oeder by id limit 1 > 1
select * from employees order by id limit 1 offset 3 > 4
2:eg:查找不是manager的员工
select * from employees where id not in (select id from manager );
3:多表联查的问题:
inner join ; left join ; right join (我感觉我用这个比较少,都是两个表互换位置,然后使用left join)
inner join 两个表中都有的数据
left join 左表的数据全部都有,如果b表也有,那就取对应的值,如果b表没有,那就取null
4:嵌套查询
select * from (select * from **)where ***·····
5:order by 是排序,group by 是分组
order by DESC 倒序
如果不使用group 会有很多重复的项出来
id salary
1 100
1 100
2 200
使用后
id salary
1 100
2 200
having在group by 后面
6:DISTINCT 去重
7:不等于 <>
select * from employees where id.1 <> id.2
8:SQL语句中可以有计算 where emp_no % 2 == 1
9:聚集函数中可以有distent eg: count (diatent emp_no)
10:三张表链接可以使用两次 left join 不用加括号
11:如果要多个列排名,可以用两个表来相比较,然后统计另一个表比自身多的记录数,(count)但是后面要加group by 不加的话则只会输出一条数据
12:【对于employees表,在对first_name进行排名后,选出奇数排名对应的first_name】。
select e4.first_name from (select e3.first_name ,e3.id from (select e1.first_name,count (e2.first_name) as id from employees as e1,employees as e2 where e1.first_name >= e2.first_name group by e1.first_name )as e3 where e3.id % 2 =1)as e4;
13:这个问题我也觉得很有意思,在数据库中增加一列的做法
select e1.emp_no ,e1.salary,count(distinct e2.salary) as rank from salaries as e1,salaries as e2 where e1.to_date ='9999-01-01' and e2.to_date='9999-01-01' and e1.salary >= e2.salary group by e1.salary order by e1.emp_no;
要注意 取得S2中比S1大的数量。然后形成一列rank,然后排序。
14:获取员工其当前的薪水比其manager当前薪水还高的相关信息
这个题的有意思程度是**,重点就在于创建两张表,一张是当前所有员工的薪水(员工号,部门号,薪水)另一张是当前所有manager的薪水(员工号,部门号,薪水)然后再过滤条件,要部门号相等,然后员工的salary大于manager的salary