最近学了一下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 employees27:将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 旧表名;