首页 > 数据库 >SQL刷题笔记day5

SQL刷题笔记day5

时间:2024-05-28 22:01:49浏览次数:25  
标签:de no day5 dept emp SQL id film 刷题

SQL218题目

我的错误代码:

select de.dept_no,de.emp_no,s.salary
from employees e
join dept_emp de on de.emp_no = e.emp_no
join salaries s on s.emp_no = e.emp_no
where de.dept_no not in dept_manager.dept_no #not in 好像不能直接这样用 这里报错

正确代码

SELECT de.dept_no, de.emp_no, s.salary
FROM dept_emp AS de, salaries AS s
WHERE de.emp_no = s.emp_no 
AND de.to_date = '9999-01-01' 
AND s.to_date = '9999-01-01'
AND s.emp_no NOT IN 
(SELECT emp_no FROM dept_manager dm WHERE dm.to_date = '9999-01-01');

我的代码改正 

select de.dept_no,de.emp_no,s.salary
from employees e
join dept_emp de on de.emp_no = e.emp_no  
join salaries s on s.emp_no = e.emp_no 
where de.emp_no not in (SELECT emp_no FROM dept_manager dm WHERE dm.to_date = '9999-01-01') 

复盘:难点是找非manager员工,涉及not in的用法, not in后面是个范围,而不是dept_manager.dept_no这个某个值。如:

 where subject not in ('Chemistry','Medicine')

如果后面括号只有一个,就要用等于了,如:

where continent = 'South America' 

SQL219题目

我的错误代码

select de.emp_no,m.emp_no as manager_no,
       s1.salary as emp_salary,s2.salary as manager_salary
from dept_emp de 
join dept_manager m on de.dept_no  = m.dept_no 
join salaries s1 on s1.emp_no = de.emp_no and to_date = '9999-01-01'
join salaries s2 on s1.emp_no = m.emp_no and to_date = '9999-01-01'
where s1.salary>s2.salary

正确代码

SELECT es.emp_no,ms.emp_no manager_no,
es.salary emp_salary,ms.salary manager_salary FROM
# es表:员工薪资表 
(SELECT de.dept_no,de.emp_no,s.salary FROM dept_emp de INNER JOIN salaries s
 ON de.emp_no=s.emp_no WHERE s.to_date='9999-01-01') es,

(SELECT dm.dept_no,dm.emp_no,s.salary FROM dept_manager dm INNER JOIN salaries s
 ON dm.emp_no=s.emp_no WHERE s.to_date='9999-01-01') ms
 
WHERE es.dept_no=ms.dept_no 
AND es.salary>ms.salary

理解思路后改正我的代码:

select es.emp_no,ms.emp_no as manager_no,
       es.salary as emp_salary,ms.salary as manager_salary
from 
(select de.emp_no,de.dept_no ,s.salary from dept_emp de join salaries s on s.emp_no = de.emp_no and de.to_date = '9999-01-01')es,
(select m.dept_no,m.emp_no,s.salary from dept_manager m join salaries s on s.emp_no = m.emp_no and m.to_date = '9999-01-01')ms
where es.salary > ms.salary and es.dept_no = ms.dept_no 

复盘:知道要引用两个不同的薪资,分别建立员工和经理的薪资表,不知道咋写,淦!
/*这个正确代码大结构就是:
select ,,,
from ()es,()ms #陌生点就在这里不知道怎么写
where.. 
*/

SQL220题目

我的错误代码

select d.dept_no,d.dept_name,t.title,count(t.title) as count
from departments d
join dept_emp de on d.dept_no = de.dept_no and de.to_date='9999-01-01'
join titles t on t.emp_no = de.emp_no and t.to_date='9999-01-01'
group by d.dept_no # 不知道按照什么进行分组
order by d.dept_no asc,t.title desc

正确代码

select d.dept_no,d.dept_name,t.title,count(t.title) as count
from departments d
join dept_emp de on d.dept_no = de.dept_no and de.to_date='9999-01-01'
join titles t on t.emp_no = de.emp_no and t.to_date='9999-01-01'
group by d.dept_no,t.title # 多字段分组
order by d.dept_no ,t.title #两个都是升序啦(默认也是升序)

复盘:这道题根据 多个字段 进行分组,将三张表内连接,通过 dept_no 和 title 为依据进行分组,然后计算count。因为可能会有下面这种情况:所以还要按照title也进行分组

 SQL223题目

我的代码

select film_id,title 
from film
where ('film_id','title') not in 
(select f.film_id,f.title from film f join film_category fc on f.film_id=fc.film_id )

正确代码1

select film_id,title 
from film
where film_id not in #film_id不应该写成字符串的形式,这里表示的相当于数组名
(select fc.film_id from  film_category fc join category c
 on c.category_id = fc.category_id) #后面这两个表一个是关于类别的

 正确代码2

SELECT film.film_id,film.title
FROM film
LEFT JOIN film_category
on film.film_id = film_category.film_id
where film_category.category_id is null;

复盘:电影如果有分类,那么应该在 类别表category+电影分类表film_category 中有非空信息。

SQL224题目

我的代码

select title,description
from film ,
(select c.name from category c join film_category fc on c.category_id=fc.category_id) mc
where  mc.name='Action'

我这种思路的正确代码

select title ,description 
from film_category ,film
where film_category.category_id = 
( select category_id  from category where name = 'Action') 
and film_category.film_id= film.film_id

不用子查询的直白方法:

select title, description
from film left 
join film_category as fc on film.film_id=fc.film_id
join category as c on c.category_id=fc.category_id
where c.name="Action";

复盘:其实这个题直接3个表连接起来,然后输出就行,但是题目要用子查询。

SQL226题目——拼接字符串(SQLlite平台)

我的代码

select ('first_name'| |'last_name') from employees

题目要求的方法:

select last_name||" "||first_name as name from employees

使用concat函数:

SELECT CONCAT(last_name,' ',first_name) as name from   employees 

 复盘:'first_name'和'last_name'不应该加引号!不是字符串,是相当于数组名的变量!

SQL227题目——创建表

我的代码

CREATE TABLE actor(
actor_id smallint(5)  NOT NULL DEFAULT '0',
first_name	varchar(45) NOT NULL,
last_name	varchar(45) NOT NULL,
last_update	date not null, 
PRIMARY KEY (actor_id))

完美代码:

create table if not exists actor (
    actor_id smallint(5) not null primary key COMMENT'主键id',
    first_name varchar(45) not null COMMENT'名字',
    last_name varchar(45) not null COMMENT '姓氏',
    last_update date not null COMMENT '日期' 
)

复盘:注意创建数据表时,表名和字段名不需要用引号' '括起来。日期是date,其他类型都不变,照着写。 

SQL228——插入数据

我的代码

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

复盘:插入的是什么就是什么,不能多复制,哪怕是空格也不能多,因为类型可能不同和报错。

SQL229——插入数据部分已存在的情况

我的代码

insert  ignore into actor
value('3','ED','CHASE','2006-02-15 12:34:33')

复盘:

mysql中常用的三种插入数据的语句

1. insert into - 插入数据

2. replace into - 插入替换数据

3. insert ignore into - 如果已存在,忽略当前新数据

 

标签:de,no,day5,dept,emp,SQL,id,film,刷题
From: https://blog.csdn.net/qq_47966193/article/details/139277087

相关文章

  • MYSQL之ddl
    数据定义语言主要用于定义数据库对象。创建数据库createdatabase数据库名;选择数据库use数据库名;删除数据库dropdatabase数据库名;以上是基本数据库的一系列操作接下来是表的操作,首先,先要知道数据类型都有什么?字符串类型:char(L),描述的是一个定长为L的字符串。取......
  • 【SQL学习进阶】从入门到高级应用(一)
    文章目录熟悉测试数据初始化测试数据开始练习吧......
  • MySQL四种主要的存储引擎,约束条件null not null,严格模式,基本字段类型之整型,浮点型,
    ⅠMySQL之存储引擎【一】什么是存储引擎日常生活中文件格式有很多,并且针对不同的文件格式会有对应不同的存储方式和处理机制针对不同的数据应该有对应的不同的处理机制存储引擎就是不同的处理机制【二】MySQL四种主要的存储引擎【1】Innodb是MySQL5.5版本之后的默认存......
  • SQL历理 neirongxitong数据库结构
    /*SQLyog企业版-MySQLGUIv8.14MySQL-5.6.28:Database-neirongxitong**********************************************************************//*!40101SETNAMESutf8*/;/*!40101SETSQL_MODE=''*/;/*!40014SET@OLD_UNIQUE_CHECKS=@@UNI......
  • Web安全:SQL注入大方向知识总结
    1.SQL注入简介:SQL注入(SQLInjection)是Web安全中常见的一种攻击手段。攻击者通过在Web应用的输入字段中插入恶意的SQL代码片段,使得后端数据库执行非预期的SQL命令,从而窃取数据、篡改数据或进行其他恶意操作。 2.如何发生SQL注入:**不安全的编程习惯**:开发者直接将用户输......
  • 【MySQL】MySQL语句优化
    一、嵌套查询优化当SLQ语句存在嵌套查询时,MySLQ会生成临时表来存储子查询的结果数据,外层查询会从临时表中读取数据,待整个查询完毕后,会删除临时表,在这个过程中是非常耗时的。方案:使用JOIN语句进行联表查询来代替,提升查询性能。例如这里查询t_goods数据表中t_category字段......
  • 【MySQL】MySQL语句优化
    一、嵌套查询优化当SLQ语句存在嵌套查询时,MySLQ会生成临时表来存储子查询的结果数据,外层查询会从临时表中读取数据,待整个查询完毕后,会删除临时表,在这个过程中是非常耗时的。方案:使用JOIN语句进行联表查询来代替,提升查询性能。例如这里查询t_goods数据表中t_category字段不在t_g......
  • PostgreSQL数据库实战:轻松修改字段名称
    哈喽,大家好,我是木头左!在本文中,将深入探讨PostgreSQL数据库中的一个强大功能,即如何轻松修改字段名称。无论你是一个新手开发者,还是一个经验丰富的DBA,这篇文章都将为你提供实用的技巧和建议。一、为什么需要修改字段名称?在开发过程中,经常会遇到需要修改表结构的情况,比如添加新......
  • 升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0 uniapp、vue、android、web 框
    升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0uniapp、vue、android、web框架:Vue3+SpringBoot3),界面功能(二)    客户订货---订货模板      客户订货模板      ......
  • SQL Server2008 r2数据库备份还原与导入导出
    备份还原        在使用数据库时,数据丢失或损坏是一件非常糟糕的事,为了应对这类事情的发生,我们可以对数据库进行备份,数据丢失或损坏时,可以还原数据。数据的备份     1.创建备份设备    在“服务器对象”中找到“备份设备”,右键点击后选取“新......