【数据库】SQL牛客练习关键点复习

1.最晚入职的时间

select * from employees order by hire_date desc limit 1

limit应放在最后 

order by默认升序asc。降序是desc

最晚入职的时间应该使用降序,这样年份偏大 ,时间最晚。

2.倒数第三入职

select * from employees order by hire_date desc limit 2,1

limit用法 后面1个参数 表示 几行

后面2个参数 表示 偏移量,几行(limit 5,2)的意思就是展示6-7行数据

因为mysql初始偏移量是从0开始的。limit 5 相当于 limit 0,5

 

 倒数第三入职就是从第二个开始的第一行数据。

3.领导薪水

select s.*,d.dept_no from salaries s,dept_manager d
where s.to_date="9999-01-01"
and d.to_date="9999-01-01"
and s.emp_no=d.emp_no

 两表进行笛卡尔积。其中硬性规定todate是因为当有员工辞职,todate会更新为离职时间。

只有9999-01-01才是在职的人。

笛卡尔乘积是类似全排列。

 普通的多表查询,内部还是笛卡尔积的逐行的搜索机制,如果查询的几张表数据量大的话会降低性能;
第二种是内连接。两种方式得到的结果是一致的。
两者没什么区别,在执行方式和效率上都是一样的,只是书写的方式不同,

基本上inner join 是为了区别 left join ,right join等的一个写法,而另外那种不是join的写法,只能等同于inner join

4.已分配部门的人

select e.last_name,e.first_name,d.dept_no
from employees e, dept_emp d
where d.to_date="9999-01-01"
and e.emp_no=d.emp_no

5.已分配的人 没分配用null

select e.last_name,e.first_name,d.dept_no
from employees e left join dept_emp d
on e.emp_no=d.emp_no

左连接典型题目。

 

 

7.薪资变动

select emp_no, count(*)t
from salaries
group by emp_no
having t>15

计算行数count函数。其中利用group by进行分组 having进行分组的筛选。

如何计算涨薪变化

select a.emp_no,count(*) t
from salaries a inner join salaries b
on a.emp_no=b.emp_no and a.to_date = b.from_date
where a.salary<b.salary
group by a.emp_no
having t>15

使用一个内连接。这样在同一个编号下 且离职时间和入职时间相同。新入职时间薪水大于离职时的。

8.查询不同的薪水 且按降序排列

select distinct salary
from salaries
order by salary desc

考察distinct关键字以及降序desc

10.非部门领导

select e.emp_no
from employees e left join dept_manager d
on e.emp_no=d.emp_no
where d.dept_no is null

考虑左连接后 无法对上的是null

11.职工与其对应的部门领导(非自己)

select de.emp_no,dm.emp_no as manager
from dept_emp de inner join dept_manager dm
on de.dept_no = dm.dept_no
where de.emp_no<>dm.emp_no

12

13.请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列

select emp_no,birth_date,first_name,last_name,gender,hire_date
from employees
where emp_no % 2=1 and last_name <> "Mary"
order by hire_date desc

在这道题可以看出 在where条件里面可以用 计算符号。

12.请你统计出各个title类型对应的员工薪水对应的平均工资avg。结果给出title以及平均工资avg,并且以avg升序排序,

select t.title ,avg(s.salary)
from titles t inner join salaries s
where t.emp_no=s.emp_no AND s.to_date = '9999-01-01' AND t.to_date = '9999-01-01'
group by t.title

因为select后面没写逗号 导致提交了12次也是没谁了

13.请你获取薪水第二多的员工的emp_no以及其对应的薪水salary

select emp_no,salary
from salaries
order by salary desc
limit 1,1

取正数第二名 需要降序排列+隔一个取

14.请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成

15.将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分

select concat(last_name," ",first_name) as Name
from employees

concat函数的考察 如果指定的是列 不需要+双引号。加了双引号就是字符串的意思了。

16.

create table if not exists `actor`(
actor_id smallint(5) primary key not null comment '主键id',
first_name varchar(45) not null comment '名字',
last_name varchar(45) not null comment '姓氏',
last_update date not null comment '日期'
)engine=innodb default charset=utf8;

注意if not exists要放在表名前面。

comment是含义的意思

MySQL的数据类型

 

 

17.插入2条数据 只用1个insert

insert into actor
values(1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'),
(2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33')

或者

insert into actor
select 1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'
union
select 2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33'

18.插入数据 如果已经存在则忽略

insert IGNORE into actor
values(3,'ED','CHASE','2006-02-15 12:34:33');

考验ignore的用法

19。创建表 并插入别表数据(两条sql不要忘记加分号啊啊啊啊)

create table actor_name(
first_name varchar(45) not null comment '名字',
last_name varchar(45) not null comment'姓氏'
);

insert into actor_name select first_name , last_name from actor

20.mysql创建索引

alter table actor add unique uniq_idx_firstname (first_name);
alter table actor add index idx_lastname (last_name);

原文地址:https://www.cnblogs.com/cckong/p/14406876.html