数据库精选题(三)(SQL语言精选题)(按语句类型分类)

🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀数据库

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光


 目录

前言

创建语句

创建表

创建视图

创建索引

插入语句

一次插入一条

一次插入多条

删除语句 

修改语句

修改表结构

修改表格内容

查询语句 

分类一:没有任何

分类二:至少有一个 

分类三:满足条件一同时满足条件二但不满足条件三

分类五:模糊查询%的使用

分类五:间接关系(祖孙关系、间接先行课关系)

分类六:找出所有

分类七:存在重复项只记录一次(学生多次考试只取最高成绩)

分类八:存在具体数值要求+分组处理

分类九:超过所有

分类十:聚集函数嵌套的转化方法

分类十一:带条件更新

分类十二: 同表格不同角色匹配问题

 总结 


前言

数据库的操作无非就是增、删、改、查+创建

接下来,我将从以上五个角度来对SQL精选题进行分类,并总结相应解法

创建语句

数据库中创建主要包括:创建表、创建视图、创建索引、创建用户

创建的方式有:直接创建(直接指定创建内容)、间接创建(利用已有视图或表创建)

创建表

直接创建:

create table table1(
    sid char(12) not null,
    name varchar(10) not null,
    age int,
    birthday date,
    credit numeric(4,1)
    primary key(sid)
    foreign key(name) references student_name(name)
);

先设定属性;再设定主键、外键等键值 

间接创建:

create table table1 as
select sid,cid,score
from student
where sid='202100202052'

两者比较: 

直接创建:需要用小括号确定表结构范围(注意逗号、分号、括号

间接创建:需要用as,但是会根据查询结果直接创建,不需要用()确定范围(啥也没有

创建视图

视图的创建使用as间接创建,因为视图并不实际存储于数据库中,所以是基于已有表进行的

直接创建:

视图不能直接定义创建。因为视图并不存储在数据库中,而是基于已有表进行的创建

间接创建:

create view test3 as
select sid,cid,pub.course_name,score
from pub.student natural join pub.student_course natural join pub.course
where pub.student_name='李龙'

两者比较: 

视图的创建只能用间接创建法:利用as、不用加()限制范围 

创建索引

索引的创建没有直接创建和间接创建的说法,索引只能定义创建,不能根据已有索引创建

create index index1 on student(sid,name)

插入语句

插入语句分为:一次插入一条记录、一次插入多条记录两种类型

一次插入一条

insert into student values(202100202052,'李华',to_date('19950303 101010','yyyymmdd hh24miss'))

一次插入多条

insert all
    into test1_course values('300002','数据库','300001',2.5)
    into test1_course values('300001','数据结构',null,2)
select * from dual

两者比较:  

1、insert into

2、insert all into

3、date类型的插入利用to_data('20080715 101010‘,‘yyyymmdd hh24miss’)

删除语句 

1、删除语句和插入语句的格式是相对应的

2、本部分的精选题重点在于各种全新的语句用法(不仅仅限于and、from、where等一般语句)

总结如下:

  • regexp_like(sid,'^[0-9]+$')
  • where score between 0 and 100
  • length(sid)
  • like '% %'
  • where 后面跟(cid,tid)这种整体匹配语句

删除语句对应的是插入语句(一个是增一个删),因此两者的语法也类似。insert into和delete from相匹配

题目一:

删除表中的学号不全是数字的那些错误数据,学号应该是数字组成,不能够包含字母空格等非数字字符。方法之一:用substr函数,例如Substr(sid,1,1)返回学号的第一位,判断是否是数字。

delete from test3_01
where sid not in
	(select sid
	from test3_01
	where regexp_like(sid, '^[0-9]+$'))

题目二:

 删除表中的性别有错误的那些错误数据(性别只能够是“男”、“女”或者空值)。

delete from test3_03
where sex <> '男' and sex <> '女' and sex is not null

题目三:

删除表中的院系名称有空格的、院系名称为空值或者院系名称小于3个字的那些错误数据。

delete from test3_04 
where dname like '% %' or
dname is null or
length(dname) < 3

题目四: 

删除其中的错误数据,错误指如下情况:课程号和教师编号在教师授课表pub.teacher_course中不同时存在的,即没有该教师教该课程; 

delete from test3_08 
where (cid, tid) not in(
    select cid, tid
    from pub.teacher_course
)

题目五:

 删除其中的错误数据,错误指如下情况:成绩数据有错误(需要先找到成绩里面的错误)。

delete from test3_09
where score not between 0 and 100

修改语句

在创建数据库表格并往表格内插入数据后,我们可能还需要对表格进行修改,因此修改语句也是必要的。修改语句包括:修改表结构、修改表格内容

修改表结构

alter table test4_02
add avg_score numeric(3,1)
alter table test4_02
drop column avg_score 

修改表格内容

update test4_01 S
  set sum_score=(
    select sum(score)
    from pub.student_course T
    where S.sid=T.sid
  )
update test4_07
set sex= replace( sex,'性','')
update test4_10
set age=(
    select (2012-extract (year from birthday))
    from pub.student_42
    where test4_10.sid=sid
)
where test4_10.age is null;

 两者联系及感悟:  

1、只有修改表结构和创建表结构时需要指定table和view

2、修改表格内容时用update以及set函数

3、replace函数常用来update不规范数据

4、extract函数用来提取date类型数据中的year、month、day都可以


重点来啦!!!数据库SQL语言中最难的部分就是查询。数据库查询大约占数据库语言使用的80%(李晖老师说的),所以查询语句写的好/不好对整体数据库性能的影响是很大的

 

查询语句 

编写语句的思考流程:

1、确定要查询的变量

2、根据要查询的变量确定要查询的关系表(哪几个表、是否要自然连接处理等)

3、写查询的条件(最难的部分)

分类一:没有任何

没有任何=完全否定=全集-只要有一个在里面

使用minus实现

找出至少选修了学号为“200900130417”的学生所选修的一门课的学生的学号、姓名(不包含这名同学)。 

select sid,name
from pub.student
where sid in(
    (
        select distinct sid
        from pub.student_course
        where cid in (
            select cid
            from pub.student_course
            where sid='200900130417'
        )
    )
    minus
    (
        select sid
        from pub.student
        where sid='200900130417'
    )
)

分类二:至少有一个 

in:或关系,只要有一个就是满足的

至少有一个=只要一个就满足=或关系

找出至少选修了一门其先行课程号为“300002”号课程的学生的学号、姓名。

 select sid, name
 from  pub.student
 where sid in(
    select sid
    from pub.student_course
    where cid in ( 
        select cid
        from pub.student_course
        where pcid='300002'
    )
)

分类三:满足条件一同时满足条件二但不满足条件三

满足多个条件/不满足多个条件的处理:

1、对于关系集合用minus、intersect来求交并集;

2、对于在where查询条件后的用and、or等来处理

3、一个属性上多条件——》交并集(minus、intersect);多个属性上多条件(and、or)

找出选修了“操作系统”并且也选修了“数据结构”,但是没有选修“程序设计语言”的学生的学号、姓名。

select sid,name
  from pub.student
  where sid in
  (
    (
      select sid
      from pub.student_course
      where cid=(
        select cid
        from pub.course
        where name='操作系统'
      )
    )
    intersect
    (
      select sid
      from pub.student_course
      where cid=(
        select cid
        from pub.course
        where name='数据结构'
      )
    )
    minus
    (
      select sid
      from pub.student_course
      where cid=(
        select cid
        from pub.course
        where name='程序设计语言'
      )
    )
  )

查询2010级、计算机科学与技术学院、操作系统的学生成绩表,内容有学号、姓名、成绩。

  select sid,name,score
  from pub.student_course natural join pub.student
  where class='2010' and dname='计算机科学与技术学院' and cid=(
    select cid
    from pub.course
    where name='操作系统'
  )

分类五:模糊查询%的使用

%:就是模糊查询;模糊查询与like以及not like绑定使用

条件字符串部分限制、部分自由

查询所有不姓张、不姓李、也不姓王的学生的学号sid、姓名name

select sid,name
from pub.student
where name not like '张%'
and name not like '李%'
and name not like '王%'

分类五:间接关系(祖孙关系、间接先行课关系)

两种方法:

1、利用笛卡尔积实现

2、利用嵌套结构实现

比较和联系:

1、笛卡尔积A*B实现本质就是让A中的每一个元组和B中的每一个元组比较

2、嵌套结构先找出B的所有元组,利用in来将A中的每个元组和B的每个元组比较比较

找出有间接先行课的所有课程的课程号、课程名称。

select cid ,name
from pub.course
where fcid in (
  select cid
  from pub.course
  where fcid is not NULL
)

已知所有的父子关系fstable表,找出里面的爷孙关系的名字

select s1.father,s2.son
from fstable s1,fstable s2
where s1.son=s2.father

分类六:找出所有

所有关系:用除运算实现,除运算找出的就是集合和其子集的关系(所有关系

在SQL中不能使用除运算,改为用not exists实现

找出选修了所有课程的学生的学号、姓名。

select sid,name
from pub.student
where not exists(
  (
    select cid
    from pub.course
  )
  minus
  (
    select cid
    from pub.student_course
    where pub.student_course.sid=pub.student.sid
  )
)

分类七:存在重复项只记录一次(学生多次考试只取最高成绩)

表格1存在重复项,想要计算没有重复项参与的表格1中的数据

1、找中介人:找到一个不存在重复项的表格2,利用表格2实现对表格1的剔除工作。此时,表格2作用为:剔除者、观察者;表格1作用为:实际要找寻的资料原件

使用update语句,利用pub.student_course、pub.course,统计 “总学分”;

(这是需要注意:成绩及格才能够计算所得学分,一门课多个成绩都及格只计一次学分)

update test4_03 S
  set sum_credit=(
    select sum(credit)
    from pub.course
    where cid in(
      select distinct cid
      from pub.student_course SC
      where S.sid=SC.sid
      and SC.score>=60
    )
  )

分类八:存在具体数值要求+分组处理

分组处理:需要用表中的某一个元素将其他信息聚合起来(出版社/会员)

对于每个出版商,找出每个借了该出版商五本书以上的会员的编号和姓名

select memb_no,name
from member m
where memb_no in(
  select memb_no
  from borrowed bw,book bk
  where bw.isbn=bk.isbn
  group by publisher,memb_no
  having (count(*)>5)
)

having:后面跟的应该是bool类型的表达式结果,having和where一样是筛选条件

having的作用范围:分组后的组内

分类九:超过所有

超过所有=超过最大值——》利用max来求解最大值

 找出所有收入超过 "小型银行公司 "每个员工的员工 ID

select id
from work
where salary >
(
  select max(salary)
  from works
  where company_name='Small Bank Corporation'
)

假设一个公司可以在好几个城市有分部。找出位于“Small Bank Corporation”所在城市的所有公司(company_name是主键,所以一家公司只能在一个城市)

Select company_name
From Company
Where city in (
  select city
  From company
  Where company_name = 'Small Bank Corporation'
)

上题的难度在于对题目的理解:位于“Small Bank Corporation”所在城市。

1、找出“Small Bank Corporation”的城市

2、利用in来实现位于动作

分类十:聚集函数嵌套的转化方法

有时候我们会遇到需要使用两个聚集函数的情况,但是在一个关系中聚集函数是不能够嵌套使用的,因此需要用别的方法来代替聚集函数嵌套使用

常见的嵌套场景:count+max(求count元组数中的最大值)

找出雇员最多的公司名称(或公司名称、在最多员工数相同的情况下)的公司名称

1、首先需要求解每个公司的雇员——需要count聚集函数

2、求解雇员数最大的公司——需要max函数对count结果使用

转化:雇员最多=雇员比最多的还多(count+max)=雇员比所有的都多(count+all),成功避开聚集函数的嵌套

select company_name
from works
group by company_name
having count(id)>=all(
  select count(id)
  from works
  group by company_name
)

找出工资总额最小的公司

select company_name
from works
group by company_name
having (
  sum(salary)<all(
    select sum(salary)
    from works
    group by company_name
  )
)

分类十一:带条件更新

存在一类更新是带有条件的,不同条件下的元组更新的方式也不同

更新无非增加/减少

为了防止非法更新两次:需要满足增加时先加大的,减少时先减少的

给 "第一银行公司 "的每位经理加薪 10%,除非其工资超过 100000 美元。在这种情况下,只加薪 3%(这两个update的顺序不可以更换)(增加时先加大的,减少时先减少的;防止有的记录被操作两次)

update works as T
set T.salary=t.salary*1.03
where works.id in (
  select id
  from manages
)
and salary>100000
and company_name='First Bank Corporation'
 
update works as T
set T.salary=t.salary*1.1
where works.id in (
  select id
  from manages
)
and salary<100000
and company_name='First Bank Corporation'

分类十二: 同表格不同角色匹配问题

匹配问题=比较是否相等=比较问题

比较只能发生在两个关系模式之间

1、此时两个角色进行比较,两个角色对应的表格是同一个

2、因此拿相同关系模式当作两个不同的关系模式做笛卡尔积,再比较结果

3、笛卡尔后判断相应的属性是否符合要求

查找与其经理住在同一城市同一条街上的每位员工的 ID 和姓名

select e.id,e.person_name
from employee e natural join managers m,employee e2
where m.manager_id=e2.id and e.city=e2.city and e.street=e2.street

简化写法:

SELECT e.id, e.person_name
FROM employee e
JOIN managers m ON e.id = m.id
JOIN employee e2 ON m.manager_id = e2.id
WHERE e.city = e2.city AND e.street = e2.street;

 总结 

本文的所有知识点、图片均来自《数据库系统概念》(黑宝书)、山东大学李晖老师PPT。不可用于商业用途转发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/733873.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【一】【算法】经典树状数组和并查集,详细解析,初步认识,【模板】树状数组 1,树状数组并查集

【模板】树状数组 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某一个数加上 x x x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n , m n,m n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 第二…

Win11下安装VS2022失败的解决办法

前几天我把我的HP Z840的操作系统换成了Win11&#xff0c;在重装VS2022时遇到了麻烦&#xff0c;提示无法安装 Microsoft.VisualStudio.Devenv.Msi。 查看安装日志提示&#xff1a;Could not write value devenv.exe to key \SOFTWARE\Microsoft\Internet Explorer\Main\Featur…

DataWhale - 吃瓜教程学习笔记(二)

学习视频&#xff1a;第3章-一元线性回归_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 3.1 - 3.2 一元线性回归 - 最小二乘法 - 极大似然估计 - 梯度 多元函数的一阶导数 - 海塞矩阵 多元函数的二阶导数 - 机器学习三要素

SpringBoot 快速入门(保姆级详细教程)

目录 一、Springboot简介 二、SpringBoot 优点&#xff1a; 三、快速入门 1、新建工程 方式2&#xff1a;使用Spring Initializr创建项目 写在前面&#xff1a; SpringBoot 是 Spring家族中的一个全新框架&#xff0c;用来简化spring程序的创建和开发过程。SpringBoot化繁…

qt+halcon实战

注意建QT工程项目用的是MSVC&#xff0c;如果选成MinGW,则会报错 INCLUDEPATH $$PWD/include INCLUDEPATH $$PWD/include/halconcppLIBS $$PWD/lib/x64-win64/halconcpp.lib LIBS $$PWD/lib/x64-win64/halcon.lib#include "halconcpp/HalconCpp.h" #include &quo…

CompletableFuture 基本用法

一、 CompletableFuture简介 CompletableFuture 是 Java 8 引入的一个功能强大的类&#xff0c;用于异步编程和并发处理。它提供了丰富的 API 来处理异步任务的结果&#xff0c;支持函数式编程风格&#xff0c;并允许通过链式调用组合多个异步操作。 二、CompletableFuture中…

尚品汇-(四)

&#xff08;1&#xff09;商品的基本知识 1.1基本信息—分类 一般情况可以分为两级或者三级。咱们的项目一共分为三级&#xff0c;即一级分类、二级分类、三级分类。 比如&#xff1a;家用电器是一级分类&#xff0c;电视是二级分类&#xff0c;那么超薄电视就是三级分类。…

已解决VirtualMachineError: 虚拟机错误的正确解决方法,亲测有效!!!

已解决VirtualMachineError: 虚拟机错误的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 分析错误日志 优化代码 内存泄漏排查 优化递归调用 调整JVM参数 使用监控工具 增加物理内存或升级硬件…

Jmeter5.X性能测试【完整版】

目录 一、Http基础协议和解析 1、浏览器的B/S架构和C/S架构 &#xff08;1&#xff09;CS架构 &#xff08;2&#xff09;BS架构 &#xff08;3&#xff09;URL理解 2、Http超文本传输协议 &#xff08;1&#xff09;含义 # 协议 # json协议 # xml协议 &#xff08;…

mysql分析常用锁、动态监控、及优化思考

这里写自定义目录标题 1.未提交事物&#xff0c;阻塞DDL&#xff0c;继而阻塞所有同表的后续操作,查看未提交事务的进程2.存着正在进行的线程数据。3.根据processlist表中的id杀掉未释放的线程4.查看正在使用的表5.mysql为什么state会有waiting for handler commit6.什么情况导…

简易智能家居系统

文章目录 摘要一、系统设计要求及总体设计方案1.1 设计要求1.2 总体设计方案 二、终端结点的设计及实现2.1单片机最小系统2.2 LED灯的控制与工作状态的显示2.2.1 硬件设计2.2.2 软件设计 2.3 温度的测量与显示2.4 火灾的监测与报警2.5 串口的显示与控制 三、网络传输与控制3.1 …

人工智能在影像组学与放射组学中的最新进展|顶刊速递·24-06-22

小罗碎碎念 本期文献速递的主题——人工智能在影像组学中的最新进展。 小罗一直以来的观点&#xff0c;是把大问题分模块拆解——既然我们想做多模态&#xff0c;那么就先了解单模态的研究套路&#xff0c;再去研究不同模态提取的特征如何融合&#xff0c;搞科研的过程也是管理…

Flutter Android 调试桥 (adb)

客户端&#xff1a;用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。 守护程序adbd&#xff1a;用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。 服务器&#xff1a;用于管理客户端与守护程序之间的通信。服务器在开…

刷代码随想录有感(113):动态规划——爬楼梯plus

题干&#xff1a; 代码&#xff1a; #include<bits/stdc.h> using namespace std;int main(){int n,m;cin>>n>>m;vector<int>dp(n 1, 0);dp[0] 1;for(int j 0; j < n; j){for(int i 1; i < m; i){if(j > i)dp[j] dp[j - i];}}cout<&…

【吊打面试官系列-Mysql面试题】什么是存储过程?用什么来调用?

大家好&#xff0c;我是锋哥。今天分享关于 【什么是存储过程&#xff1f;用什么来调用&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是存储过程&#xff1f;用什么来调用&#xff1f; 答&#xff1a;存储过程是一个预编译的 SQL 语句&#xff0c;优点是…

PyScada(三)后端应用

PyScada 的后端应用 使用后端 要使用后端&#xff0c;请在浏览器中打开http://127.0.0.1 &#xff08;将 127.0.0.1 替换为 PyScada 服务器的 IP 或主机名&#xff09;&#xff0c;然后使用安装过程 中定义的管理员帐户登录 &#xff08;TODO 链接到创建超级用户文档&#xf…

【数据分享】《中国法律年鉴》1987-2022

而今天要免费分享的数据就是1987-2022年间出版的《中国法律年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 自1987年起&#xff0c;《中国法律年鉴》作为一部全面记录中国法律发展进程的重要文献&#xff0c;见证了中国法治建设的每…

G7易流赋能化工物流,实现安全、环保与效率的共赢

近日&#xff0c;中国物流与采购联合会在古都西安举办了备受瞩目的第七届化工物流安全环保发展论坛。以"坚守安全底线&#xff0c;追求绿色发展&#xff0c;智能规划化工物流未来"为主题&#xff0c;该论坛吸引了众多政府部门、行业专家和企业代表的参与。G7易流作为…

unity中使用commandbuffer将自定义画面渲染到主相机上

CommandBuffer 保存渲染命令列表&#xff08;例如设置渲染目标或绘制给定网格&#xff09;。您可以指示 Unity 在内置渲染管线中的各个点安排和执行这些命令&#xff0c;因此&#xff0c;您可以自定义和扩展 Unity 的渲染功能。 这句话意味着你可以通过command buffer让相机渲…

数组和链表的区别是什么?

引言&#xff1a;本文旨在深入探讨数组和链表之间的区别&#xff0c;分析它们在不同情境下的优缺点&#xff0c;并探讨如何根据应用需求选择合适的数据结构。通过深入理解数组和链表的内部工作原理和应用场景&#xff0c;读者将能够更好地应用这些知识解决实际问题&#xff0c;…