牛客网-SQL专项训练11

①有一张订单表orders,包含如下数据:

 现要查找order_num不为NULL的所有数据,SQL语句是:SELECT * FROM orders WHERE order_num IS NOT NULL; 

解析:

在MySQL中不能使用 = NULL 或  != NULL 等比较运算符在列中查找 NULL 值 。

要用IS NULL 或 IS NOT NULL才会进行NULL值或非NULL值得查找。

知识点:MySQL的NULL值处理方法

②一张学生成绩表score,部分内容如下:
name       course     grade
张三        操作系统      67
张三        数据结构      86
李四        软件工程      89
用一条SQL 语句查询出每门课都大于80 分的学生姓名,SQL语句为:

解析:

从部分表就可以看出一个学生有多门课,先找出成绩小于等于80的学生姓名,然后再在表里排除这些小于等于80的学生

select distinct name from score where name not in(select name from score where grade <= 80);

或者:

 Select name from score group by name having min(grade) > 80;     最低一科的分数都要大于80=每门课都大于80

③下列关于SQL Server中使用存储过程的优点叙述不正确的是(D)

存储过程的优点:
A.执行速度快
存储过程只在创造时进行编译,已经通过语法检查和性能优化,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
B.允许组件式编程
经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。只需创建存储过程一次并将其存储在数据库中,以后即可在程序中调用该过程任意次。在代码上看,SQL语句和程序代码语句的分离,可以提高程序代码的可读性。
存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。
C.减少网络流量
一个需要数百行Transact-SQL代码的操作由一条执行过程代码的单独语句就可实现,而不需要在网络中发送数百行代码。
对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。
D.提高系统安全性
可将存储过程作为用户存取数据的管道。可以限制用户对数据表的存取权限,建立特定的存储过程供用户使用,避免非授权用户对数据的访问,保证数据的安全。

存储过程缺点:
A.移植性差。依赖于数据库厂商,难以移植(当一个小系统发展到大系统时,对数据库的要求也会发生改变);
B.难以调试、维护。业务逻辑大的时候,封装性不够,难调试难以维护;
C.服务器不能负载均衡。复杂的应用用存储过程来实现,就把业务处理的负担压在数据库服务器上了。没有办法通过中间层来灵活分担负载和压力.均衡负载等。 

Mysql中表student_table(id,name,birth,sex),插入如下记录:
('1004' , '张三' , '2000-08-06' , '男');
('1005' , NULL , '2001-12-01' , '女');
('1006' , '张三' , '2000-08-06' , '女');
('1007' , ‘王五’ , '2001-12-01' , '男');
('1008' , '李四' , NULL, '女');
('1009' , '李四' , NULL, '男');
('1010' , '李四' , '2001-12-01', '女');
执行
select t1.*,t2.*
from (
select * from student_table where sex = '男' ) t1 
left  join 
(select * from student_table where sex = '女')t2 
on t1.birth = t2.birth and t1.name = t2.name ; 
的结果行数是(3)?
题中语句的结果表为:

 解析:

本题的关键是左右表中的birth、name都不为NULL时才会匹配上,无法匹配t2中一个字段为NULL或两个字段都为NULL的记录。

Mysql(版本8.0.25)中表student_table(id,name,birth,sex),插入如下记录:
('1004' , '张三' , '2000-08-06' , '男');
('1005' , NULL , '2001-12-01' , '女');
('1006' , '张三' , '2000-08-06' , '女');
('1007' , ‘王五’ , '2001-12-01' , '男');
('1008' , '李四' , NULL, '女');
('1009' , '李四' , NULL, '男');
('1010' , '李四' , '2001-12-01', '女');
执行
select count(t2.birth) as c1
from (
select * from student_table where sex = '男' ) t1 
full  join 
(select * from student_table where sex = '女') t2 
on t1.birth = t2.birth and t1.name = t2.name ; 
的结果行数是()?
会报错:Mysql(版本8.0.25)不支持full join,执行报错【1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'full  join 】
posted on 2022-09-14 14:55  我不想一直当菜鸟  阅读(116)  评论(0编辑  收藏  举报