SQL实战笔记

最近学了一下SQL的基本使用,就使用了牛客网上面的SQL实战编程进行了练习

下面是题目的总结:

1:

查找最晚入职员工的所有信息
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 * from employees
where hire_date=(
    select max(hire_date) from employees
)

也可以使用排序的方式,但是最晚入职的员工有很多,可能存在bug

2:

查找入职员工时间排名倒数第三的员工所有信息
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`));

思路就是逆序排序然后使用LIMIT 2 1

SELECT *
FROM employees
WHERE hire_date = (SELECT DISTINCT hire_date
                   FROM employees
                   ORDER BY hire_date DESC
                   LIMIT 2,1);

3:

查找各个部门当前(to_date='9999-01-01')领导当前薪水详情以及其对应部门编号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`));
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`));

思路如果有两个表如何处理:方法一:将两个表通过主键进行连接 方法二:将两个join成一个表

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

或者也可以通过:主键将两个值连接起来

select q.*,p.dept_no from salaries as q
inner join dept_manager as p on p.emp_no=q.emp_no
where p.to_date='9999-01-01' and q.to_date="9999-01-01"


4:

查找所有已经分配部门的员工的last_name和first_name
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 `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 p.last_name, p.first_name ,q.dept_no from employees p , dept_emp q
where p.emp_no=q.emp_no

另外一种思路是通过该将两个表连接起来

select p.last_name,p.first_name,q.dept_no from employees as p
inner join dept_emp as q on p.emp_no=q.emp_no


5:

查找所有员工的last_name和first_name以及对应部门编号dept_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 `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`));

这题的解决思路就是需要显示所有分配和未分配的都要显示,使用连接的时候 采用left join即可

select p.last_name, p.first_name ,q.dept_no from employees p 
left join dept_emp q
on p.emp_no=q.emp_no


6:

查找所有员工入职时候的薪水情况,给出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 p.emp_no,q.salary from employees as p,salaries as q 
where p.hire_date=q.from_date and p.emp_no=q.emp_no
order by p.emp_no desc

方法二:

select p.emp_no,q.salary from employees as p
inner join salaries as q on p.emp_no=q.emp_no
where p.hire_date=q.from_date
order by p.emp_no desc


7:

查找薪水涨幅超过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(salary) as t FROM salaries
GROUP BY emp_no
HAVING count(salary)>15

HAVING和where的区别在于HAVING是在选择后判断,where是在选择前判断;


8:

获取所有部门当前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`));

实现方式两种一种就是通过将两个表inner join 起来进行分析

select p.dept_no,p.emp_no,q.salary from dept_manager as p
inner join salaries as q  on p.emp_no=q.emp_no
where p.to_date='9999-01-01' and q.to_date=q.to_date

也可以通过直接在两个表中进行查找:

select p.dept_no,p.emp_no,q.salary from dept_manager as p,salaries as q  
where p.to_date='9999-01-01' and q.to_date="9999-01-01" and p.emp_no=q.emp_no


9:

获取所有非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`));

思路将两个表连接起来  采用的是左连接,(left join 和 inner join 的区别)

SELECT p.emp_no from employees as p
left join dept_manager as q on p.emp_no=q.emp_no
where q.dept_no is NULL



9:

获取所有员工当前的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`));

使用的是left join的方式然后结合当前时间进行约束

select p.emp_no,q.emp_no as manager_no from dept_emp as p
left join dept_manager as q on p.dept_no=q.dept_no
where p.emp_no<>q.emp_no and p.to_date="9999-01-01" and q.to_date="9999-01-01"

10:

获取所有部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary
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 `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`));

思路很简单 首先将两张表inner join起来 然后将 按照dept_no group by 起来然后进行取max

select p.dept_no,p.emp_no,max(q.salary) as salary from dept_emp as p
inner join salaries as q on p.emp_no=q.emp_no
where p.to_date='9999-01-01'
and q.to_date='9999-01-01'
group by dept_no


11:

从titles表获取按照title进行分组,每组个数大于等于2,给出title以及对应的数目t。
注意对于重复的emp_no进行忽略。
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);


group by的使用和Having的使用;

select title ,count(Distinct emp_no) as t from titles
group by title 
having count(title)>=2


12:

查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
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 * from employees
where emp_no%2=1 and last_name<>'Mary'
order by hire_date DESC

13:

统计出当前各个title类型对应的员工当前薪水对应的平均工资。结果给出title以及平均工资avg。
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`));
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);

解题思路,首先将相应的title和salary的值选取出来;

代码实现:

select curr.title,avg(curr.salary) from(
select p.title,q.salary from titles as p,salaries as q
where p.emp_no=q.emp_no and p.to_date="9999-01-01" and q.to_date="9999-01-01") as curr
group by curr.title 

14:

查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by
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`));

解题思路:一种是直接采用排序的方式,但是题目中要求不能排序的思想,所以使用max函数选取相应的第二大的值

代码如下:

select p.emp_no,max(q.salary),p.last_name,p.first_name from employees as p
inner join salaries as q on p.emp_no=q.emp_no
where to_date='9999-01-01'
and salary<(
    select max(salary) from salaries
    where to_date='9999-01-01'
)

15:

查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,

PRIMARY KEY (`dept_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 `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`));

多个表之间的是使用:

思路需要统计所有的员工包括分配和没有分配部门的员工,所以使用的是left join的实现方式

select p.last_name,p.first_name,dd.dept_name from
(employees as p left join dept_emp as d on p.emp_no=d.emp_no)
left join departments as dd on dd.dept_no=d.dept_no
#三个表怎么进行操作的首先哦啊将表进行连接 然后再进行查找!

16:

查找所有员工入职时候的薪水情况,给出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`));

代码实现:两种思路一种是直接选取,另外一种是通过inner join的方式将两个表连接起来

select p.emp_no,q.salary from employees as p
inner join salaries as q on p.emp_no=q.emp_no
where p.hire_date=q.from_date
order by p.emp_no desc
select p.emp_no,q.salary from employees as p,salaries as q where p.hire_date=q.from_date and  p.emp_no=q.emp_no
order by p.emp_no desc

17:

查找薪水涨幅超过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`));

实现思路简单:

直接通过对其group by 之后对数据进行排序

SELECT emp_no,count(salary) as t FROM salaries
GROUP BY emp_no
HAVING count(salary)>15


18:

获取所有非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`));

思路还是比较简单,将两张表连接起来,使用left join的方式连接选取dept_no值为NULL的emp_no

SELECT p.emp_no from employees as p
left join dept_manager as q on p.emp_no=q.emp_no
where q.dept_no is NULL

19:

查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_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 `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`));

多张表如何进行连接,使用left join 方式首先加括号两两连接起来

select p.last_name,p.first_name,dd.dept_name from
(employees as p left join dept_emp as d on p.emp_no=d.emp_no)
left join departments as dd on dd.dept_no=d.dept_no
#三个表怎么进行操作的首先哦啊将表进行连接 然后再进行查找!



20:

查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_noy以及其对应的薪水涨幅growth,并按照growth进行升序
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 cur.emp_no,cur.salary-beg.salary  as growth from 
(select s.salary,s.emp_no from employees as e,salaries as s where s.emp_no=e.emp_no and s.to_date='9999-01-01') as cur,
(select s.salary,s.emp_no from employees as e,salaries as s where s.emp_no=e.emp_no and e.hire_date=s.from_date) as beg
where  cur.emp_no=beg.emp_no
order by growth


20:

统计各个部门对应员工涨幅的次数总和,给出部门编码dept_no、部门名称dept_name以及次数sum
CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_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 `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`));

遇到比较复杂的其实很简单,一点点解析,首先 将salaries中的count计算出来 然后inner join 到dept_emp 上,然后在选取

select d.dept_no,d.dept_name,s.sum from departments as d,
(select p.dept_no,count(q.salary) as sum from dept_emp as p 
inner join salaries as q on p.emp_no=q.emp_no
group by  p.dept_no) as s
where s.dept_no=d.dept_no


21:

获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'

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`));
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) N
OT 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 d.dept_no,d.emp_no,s.salary from dept_emp 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'
and d.emp_no not in(
    select emp_no from dept_manager
) #如果使用d.emp_no<>()则出错  不能这么搞 这是个bug


21:

获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01',
结果第一列给出员工的emp_no,
第二列给出其manager的manager_no,
第三列给出该员工当前的薪水emp_salary,
第四列给该员工对应的manager当前的薪水manager_salary
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`));
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 sem.emp_no,smm.emp_no,sem.salary, smm.salary from
(select p.emp_no,p.dept_no ,q.salary from dept_emp as p inner join salaries as q on p.emp_no=q.emp_no where p.to_date="9999-01-01" and q.to_date="9999-01-01") as sem,
(select d.emp_no,d.dept_no,q.salary from dept_manager as d inner join salaries as q on d.emp_no=q.emp_no where d.to_date="9999-01-01" and q.to_date="9999-01-01") as smm
where sem.dept_no=smm.dept_no and sem.salary>smm.salary


22:

给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。

提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)


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 s2.emp_no, s2.from_date, (s2.salary - s1.salary) AS salary_growth
FROM salaries AS s1, salaries AS s2
WHERE s1.emp_no = s2.emp_no 
AND salary_growth > 5000
AND (strftime("%Y",s2.to_date) - strftime("%Y",s1.to_date) = 1 
     OR strftime("%Y",s2.from_date) - strftime("%Y",s1.from_date) = 1 )
ORDER BY salary_growth DESC
#使用两张表,一张表示的是使用薪资涨幅之前的表,另外一张表示薪资涨幅之后的表,然后将表进行约束


23:

查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部

CREATE TABLE IF NOT EXISTS film (
film_id smallint(5)  NOT NULL DEFAULT '0',
title varchar(255) NOT NULL,
description text,
PRIMARY KEY (film_id));
CREATE TABLE category  (
category_id  tinyint(3)  NOT NULL ,
name  varchar(25) NOT NULL, `last_update` timestamp,
PRIMARY KEY ( category_id ));

CREATE TABLE film_category  (
film_id  smallint(5)  NOT NULL,
category_id  tinyint(3)  NOT NULL, `last_update` timestamp);

代码实现:

select c.name,count(curr.film_id) from category as c,
(
select p.film_id,p.title,q.category_id from film as p,film_category as q
where p.description like '%robot%') as curr
where c.category_id=curr.category_id
group by c.category_id
having count(curr.film_id)>=5

24:

接上题:

统计出没有分类的电影名称和电影的id(不是分类的id)使用两个表就可以了

SELECT f.film_id, f.title FROM film f LEFT JOIN film_category fc
ON f.film_id = fc.film_id WHERE fc.category_id IS NULL

25:使用子查询的方式找出属于Action分类的所有电影对应的title,description 解上题中的内容

#比较简单首先使用两个选择将相应的catelogy_id 选择出来
select s.title,s.description from film as s,
(select q.film_id from film_category as q,(select category_id from category 
where name="Action") as p 
where p.category_id=q.category_id) as ss//这里表示的是子查询
where s.film_id=ss.film_id

如果使用inner join的方式来进行使用;其实就是分多步来进行,先取出其中的一小部分,然后再在小部分中再进行查找;

select  s.title ,s.description from film as s,
(select q.film_id from category as p inner join film_category as q 
on p.category_id=q.category_id 
where name='Action' ) as ss
where ss.film_id=s.film_id


下面都是一些细枝零散的东西了

26:使用语句来描述表的细节

EXPLAIN SELECT * FROM employees
27:将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分
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 (p.last_name||' '||p.first_name) as Name from employees as p

28:

创建一个actor表,包含如下列信息

列表 类型 是否为NULL 含义
actor_id smallint(5) not null 主键id
first_name varchar(45) not null 名字
last_name varchar(45) not null 姓氏
last_update timestamp not null 最后更新时间,默认是系统的当前时间

CREATE TABLE actor
(
actor_id smallint(5) NOT NULL,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update timestamp NOT NULL DEFAULT (datetime('now','localtime')),
PRIMARY KEY(actor_id)
)

在表中插入相应的内容 insert into table_name values (),(),(),(),()插入多条信息内容;

Insert into actor values(1,'PENELOPE','GUINESS',"2006-02-15 12:34:33" ),(2,'NICK','WAHLBERG','2006-02-15 12:34:33')
#插入一条数据,如果是数据已经存在那么就是将其忽略,使用关键字 insert or ignore into table_name values(),(),() 插入多条数据;
insert or ignore into actor
values(3,'ED','CHASE','2006-02-15 12:34:33')
#学习使用如何插入带有重复操作的数据条目

29:

对于如下表actor,其对应的数据为:

actor_id first_name last_name last_update
1 PENELOPE GUINESS 2006-02-15 12:34:33
2 NICK WAHLBERG 2006-02-15 12:34:33

创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。 actor_name表结构如下:
列表 类型 是否为NULL 含义
first_name varchar(45) not null 名字
last_name varchar(45) not null 姓氏

create table actor_name (
    first_name varchar(45) not null,
    lasr_name varchar(45) not null
);
insert into actor_name select first_name,last_name from actor
#语法之间的差别,其实使用select first_name,last_name into 新表 from 旧表
基本语法是:create table table_name(添加各种约束);insert into 新表名 +select * from 旧表名;

猜你喜欢

转载自blog.csdn.net/hufanglei007/article/details/80145042