2021年09月22日 SQL专项练习
考点1:数据库分类
MySQL是一种( )数据库管理系统。
- A 层次型
- B 联盟链
- C 关系型
- D 对象型
显示答案/隐藏答案
正确答案: C层次型数据库管理系统是紧随网状数据库而出现的。现实世界中很多事物是按层次组织起来的。层次数据模型的提出,首先是为了模拟这种按层次组织起来的事物。
最著名最典型的层次数据库系统是IBM公司的IMS(Information Management System)
MySQL就是一种普通的关系型数据库,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库中。
比较流行的数据库模型有三种,分别为层次式数据库、网状数据库和关系型数据库。而在当今的互联网中,最常见的数据库模型主要是两种,即SQL关系型数据库和NoSQL非关系型数据库。关系型数据库的代表包括Oracle, Sql Server, Mysql。
考点2:分组查询语句
SQL中属于分组查询的语句是?()
- A Where
- B 联盟链
- C Group By
- D Having
显示答案/隐藏答案
正确答案: C区块链分类
区块链大致可以分为公有链(Public Blockchain)、私有链(Private Blockchain)以及联盟链(Consortium Blockchain)三大类。
因此,联盟链属于区块链的一种。
SQL各语句的作用
- where筛选、
- group by分组、
- having与group by连用,用于筛选。
考点3:group by having
若要“查询选修了3门以上课程的学生的学号”,则正确的SQL语句是( )
- A
SELECT S# FROM SC GROUP BY S# WHERE COUNT(*)> 3
- B
SELECT S# FROM SC GROUP BY S# HAVING COUNT(*)> 3
- C
SELECT S# FROM SC ORDER BY S# WHERE COUNT(*)> 3
- D
SELECT S# FROM SC ORDER BY S# HAVING COUNT(*)> 3
显示答案/隐藏答案
正确答案: Bcount(*)
计算了有多少行,由于group by学号,则count(*)
计算了每个学号有多少行
order by排序
1.order by 从英文里理解就是行的排序方式,默认的为升序。 order by 后面必须列出排序的字段名,可以是多个字段名。
group by必须搭配聚合函数使用
2.group by 从英文里理解就是分组。必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
注意:聚合函数是—sum()、count()、avg()等都是“聚合函数”
having子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。
SQL HAVING语法如下:
1 | SELECT column_name, aggregate_function(column_name) |
执行顺序 where->group by->聚合->having,
where无论如何不能拿到聚合
where 聚合函数 having的执行顺序
where、聚合函数、having 在from后面的执行顺序:
1 | where>聚合函数(sum,min,max,avg,count)>having |
若须引入聚合函数来对group by结果进行过滤 则只能用having。
HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。
HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。
1、where 后不能跟聚合函数,因为where执行顺序先于聚合函数。
2、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
3、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
https://blog.csdn.net/qq_35269216/article/details/90812872
SQL HAVING 子句
https://www.w3cschool.cn/sql/bxfh1oza.html
HAVING
子句使你能够指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面。
WHERE
子句对被选择的列施加条件,而 HAVING
子句则对 GROUP BY
子句所产生的组施加条件。
语法
下面可以看到 HAVING
子句在 SEL ECT
查询中的位置:
1 | SELECT |
在SELECT
查询中,HAVING
子句必须紧随GROUP BY
子句,并出现在ORDER BY
子句(如果有的话)之前。
带有 HAVING
子句的 SELECT
语句的语法如下所示:
1 | SELECT column1, column2 |
示例
考虑 CUSTOMERS
表,表中的记录如下所示:
1 | +----+----------+-----+-----------+----------+ |
下面是一个有关 HAVING
子句使用的实例,该实例将会筛选出出现次数大于或等于 2 的所有记录。
1 | SQL > SELECT ID, NAME, AGE, ADDRESS, SALARY |
其执行结果如下所示:
1 | +----+----------+-----+---------+---------+ |
考点4:多对多
某学院包含多个专业如计算机科学、信息管理、软件工程、网络工程。每个专业每年都招收一个班级的学生。在招生过程中就已明确规定,一个学生只能就读于该学院的一个班级,但是一个班级可以招收不超过60个学生。那么,学生和班级之间是________的关系。
- A 一对多
- B 多对多
- C 一对一
- D 多对一
显示答案/隐藏答案
正确答案: D- 多个学生在一个班级,限定条件:一个学生只能在一个班级,所以多对一
- 如果限定条件改变:一个学生可以读不同的班级,那么就是多对多
考点5:SQL Server datediff函数 getdate函数
请取出 BORROW表中日期(RDATE字段)为当天的所有记录?(RDATE字段为datetime型,包含日期与时间)。SQL语句实现正确的是:( )
- A
select * from BORROW where datediff(dd,RDATE,getdate())=0
- B
select * from BORROW where RDATE=getdate()
- C
select * from BORROW where RDATE-getdate()=0
- D
select * from BORROW where RDATE>getdate()
显示答案/隐藏答案
正确答案: ASQL Server DATEDIFF() 函数
https://www.w3cschool.cn/mysql/func-datediff.html
MySQL DATEDIFF() 函数
https://www.w3cschool.cn/mysql/func-datediff-mysql.html
定义和用法
DATEDIFF() 函数返回两个日期之间的天数。
语法
1 | DATEDIFF(date1,date2); |
date1 和 date2 参数是合法的日期或日期/时间表达式。
注释:只有值的日期部分参与计算。
实例
下面是 SELECT 语句:
1 | SELECT DATEDIFF('2008-11-30','2008-11-29') AS DiffDate; |
结果如下所示:
1 | mysql> SELECT DATEDIFF('2008-11-30','2008-11-29') AS DiffDate; |
SQL Server getdate函数
https://www.w3cschool.cn/mysql/func-getdate.html
getdate()得出的是当前日期+时间(精确到毫秒) RDATE也是datetime型,与getdate无法准确比较 故用datediff(dd, date1, date2)=0,datepart以日为单位,比较rdate和当前的日期,使之相隔0天即为当天。
SQL Server 和 MySQL 中的 Date 函数
https://www.w3cschool.cn/sql/zh6t9fpu.html
考点6:select case条件语句
积分result表中有A B C D四列,要求:
1)当A列值大于等于B列时,选择A列否则选择B列
2)当C列值大于等于D列时,选择C列否则选择D列
用SQL语句实现正确的是:( )
- A
select ( when A>=B then A else B ) MAX_AB, ( when C>=D then C else D ) MAX_CD from result
- B
select (case when A>=B then A else B ) MAX_AB, (case when C>=D then C else D ) MAX_CD from result
- C
select (case when A>=B then A else B end) MAX_AB, (case when C>=D then C else D end) MAX_CD from result
- D
select case when A>=B then A else B end MAX_AB, case when C>=D then C else D end MAX_CD from result
显示答案/隐藏答案
正确答案: CSQL 查询:SELECT CASE 条件赋值
https://www.cnblogs.com/richardzhu/p/3571670.html
https://zhuanlan.zhihu.com/p/63333847
https://segmentfault.com/a/1190000020877471
https://www.gairuo.com/p/sql-select-case-when-then
1 | select c_1, |
MySQL CASE语句
https://www.yiibai.com/mysql/case-statement.html
https://www.yiibai.com/mysql/case-function.html
https://www.yiibai.com/plsql/plsql_searched_case.html
考点7:多变联查
运动会比赛信息的数据库,有如下三个表:
运动员ATHLETE(运动员编号 Ano,姓名Aname,性别Asex,所属系名 Adep), 项目 ITEM (项目编号Ino,名称Iname,比赛地点Ilocation), 成绩SCORE (运动员编号Ano,项目编号Ino,积分Score)。
写出目前总积分最高的系名及其积分,SQL语句实现正确的是:( )
A
1
2
3
4
5SELECT Adep,SUM(Score)
FROM ATHLETE,SCORE
WHERE ATHLETE.Ano=SCORE.Ano GROUP BY Adep HAVING SUM(Score)>=ANY
(SELECT SUM(Score) FROM ATHLETE,SCORE
WHERE ATHLETE.Ano=SCORE.Ano GROUP BY Adep);B
1
2
3SELECT Adep,SUM(Score) FROM ATHLETE,SCORE
WHERE ATHLETE.Ano=SCORE.Ano GROUP BY Adep HAVING SUM(Score)>=SOME
(SELECT SUM(Score) FROM ATHLETE,SCORE WHERE ATHLETE.Ano=SCORE.Ano GROUP BY Adep);C
1
2SELECT Adep,SUM(Score) FROM ATHLETE,SCORE WHERE ATHLETE.Ano=SCORE.Ano GROUP BY Adep HAVING SUM(Score) IN
(SELECT SUM(Score) FROM ATHLETE,SCORE WHERE ATHLETE.Ano=SCORE.Ano GROUP BY Adep);D
1
2SELECT Adep,SUM(Score) FROM ATHLETE,SCORE WHERE ATHLETE.Ano=SCORE.Ano GROUP BY Adep HAVING SUM(Score)>=ALL
(SELECT SUM(Score) FROM ATHLETE,SCORE WHERE ATHLETE.Ano=SCORE.Ano GROUP BY Adep);
显示答案/隐藏答案
正确答案: D考点8:最可能导致sql注入的字符
下面哪些字符最可能会导致sql注入?
- A
'
(单引号) - B
/
- C
"
(双引号) - D
$
显示答案/隐藏答案
正确答案: A防止SQL注入,需要注意以下几个要点:
- 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和**双”-“**进行转换等。
- 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
- 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
- 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
- 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
- sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
考点9:多表联查
雇员表EMP 结构如下
1 | ( 雇员编号 EMPNO , 姓名 ENAME , |
下列操作语句正确的是:( )
- A 显示在10和30部门工作并且工资大于5500元的雇员的姓名和工资,列标题显示为Employee和Monthly Salary 语句:
SELECT ENAME EMPLOYEE ,SAL “MONTHLY SALARY” FROM EMP WHERE DEPTNO IN(10,30)AND SAL>5500;
- B 显示受雇时间在2010年1月1日和2012年12月31日之间的雇员的姓名、工资、及受雇时间,并以受雇时间升序排列。 语句:
SELECT ENAME,SAL,HIREDATE FROM EMP WHERE HIREDATE BETWEEN ‘2010-01-01’ AND ‘2012-12-31’ ORDER BY HIREDATE;
- C 显示奖金比工资多10%以上的雇员的姓名、工资及奖金。 语句:
SELECT ENAME,SAL ,COMM FROM EMP WHERE COMM>SAL*1.1;
- D 查询没有奖金且工资低于6500并工作岗位是经理、普通员工、销售员的所有员工信息。 语句:
SELECT * FROM EMP WHERE SAL<6500 AND COMM IS NULL AND JOB IN (‘经理’,‘普通员工’,‘销售员’);
显示答案/隐藏答案
正确答案: AC选项 where子句中不能使用*
考点10:delete和truncate的区别
下面有关sql 语句中 delete truncate的说法正确的是?()
- A 论清理表数据的速度,truncate一般比delete更快
- B truncate命令可以用来删除部分数据。
- C truncate只删除表的数据不删除表的结构
- D delete能够回收高水位
显示答案/隐藏答案
正确答案: AC1、处理效率:drop>trustcate>delete
2、drop删除整个表;trustcate删除全部记录,但不删除表;delete删除部分记录
3、delete不影响所用extent,高水线保持原位置不动;trustcate会将高水线复位。
truncate之所以快是因为,truncate不删除数据,只是将当前表重新映射一段存储空间,并把旧空间标记为可用,并未覆盖数据。
oracle数据库中高水位的概念,通俗的讲就是将存储空间想象成水库,插入数据水位线就会上升,但是删除操作并不会造成最高水位线下降。
执行truncate语句需要拥有表的drop权限,从逻辑上讲,truncate table类似于delete删除所有行的语句或drop table然后再create table语句的组合。为了实现高性能,它绕过了删除数据的DML方法,因此,它不能回滚。尽管truncate table与delete相似,但它被分类为DDL语句而不是DML语句
MySQL truncate table语句
https://www.yiibai.com/mysql/truncate-table.html
SQL Truncate Table
https://www.yiibai.com/sql/sql-truncate-table.html
- SQL TRUNCATE TABLE与DELETE逻辑上,TRUNCATE TABLE语句和不带WHERE子句的DELETE语句提供了从表中删除所有数据的相同效果。 但是,它们确实存在一些差别:
使用DELETE语句时,数据库系统会记录操作。 通过一些努力,可以回滚已删除的数据。 但是,当使用TRUNCATE TABLE语句时,除非在尚未提交的事务中使用它,否则无法回滚。
要从外键约束引用的表中删除数据,不能使用TRUNCATE TABLE语句。 在这种情况下,必须使用DELETE语句。
如果表具有与之关联的触发器,则TRUNCATE TABLE语句不会触发delete触发器。
执行TRUNCATE TABLE语句后,某些数据库系统会将自动增量列(或标识,序列等)的值重置为其起始值。 DELETE语句不是这种情况。带有WHERE子句的DELETE语句从表中删除部分数据,而TRUNCATE TABLE语句始终从表中删除所有数据。//原文出自【易百教程】,商业转载请联系作者获得授权,非商业请保留原文链接:https://www.yiibai.com/sql/sql-truncate-table.html
2. SQL TRUNCATE TABLE与DELETE
逻辑上,TRUNCATE TABLE
语句和不带WHERE
子句的DELETE
语句提供了从表中删除所有数据的相同效果。 但是,它们确实存在一些差别:
- 使用
DELETE
语句时,数据库系统会记录操作。 通过一些努力,可以回滚已删除的数据。 但是,当使用TRUNCATE TABLE
语句时,除非在尚未提交的事务中使用它,否则无法回滚。 - 要从外键约束引用的表中删除数据,不能使用
TRUNCATE TABLE
语句。 在这种情况下,必须使用DELETE
语句。 - 如果表具有与之关联的触发器,则
TRUNCATE TABLE
语句不会触发delete
触发器。 - 执行
TRUNCATE TABLE
语句后,某些数据库系统会将自动增量列(或标识,序列等)的值重置为其起始值。DELETE
语句不是这种情况。 - 带有
WHERE
子句的DELETE
语句从表中删除部分数据,而TRUNCATE TABLE
语句始终从表中删除所有数据。