牛客网-SQL专项训练17

①SQL查询中使用WHere子句指出的是:查询条件

②Mysql中表student_table(id,name,birth,sex),查询重复姓名、重复次数,并按重复次数降序排列,正确的是(A)?

 

 解析:

MySQL的运算顺序:

(1)首先运算的是FROM子句,根据FROM子句中指定的一个或多个表创建工作表;

(2)如果存在WHERE子句,则WHERE子句对步骤1获得的工作表进行条件筛选,删除不符合条件的记录,注意where后面不能使用聚合函数,故C错

(3)如果存在GROUP BY子句,则对步骤2生成的结果表按指定字段进行分组,生成一份新的结果表;

(4)如果存在HAVING子句,则对步骤3的结果表按指定条件进行筛选,删除掉不满足筛选条件的记录,注意select中自定义的字段用在having后面,故D错

(5)执行SELECT子句,删除不包含在SELECT 字段名,所指定的字段。如果SELECT子句中包含关键字DISTINCT,则执行去重复运算

(6)如果有ORDER BY子句,则按指定的排序规则对结果表进行排序操作,不指定默认为ASC升序,降序为DESC,【B错在升序了】;

(7)如果需要找前几名,用LIMIT名次。

③下列关于视图说法错误的是?D

 解析:

视图是虚表,它在存储时只存储视图的定义,而没有存储对应的数据符合题意,

创建视图用CREATE VIEW

修改视图用ALTER VIEW

删除视图用DROP VIEW

④下列选项中都属于关系代数运算符中集合运算符的是(A)

∪:并 (Union)    
 − :差 (Difference)
 ∩:交(Intersection)
 ×:笛卡尔积(Cartesian Product)
非¬、与∧、或∨是逻辑关系运算符,选取σ、投影π是专门的关系运算符。

⑤Mysql(版本8.0.25)中表student_table(id,name,birth,sex),插入如下记录:
('1004' , '张三' ,'2000-08-06' , '男');
('1009' , '李四', '2000-01-01', '男');
('1010' , '李四', '2001-01-01', '男');
('1006' , '王五', '2000-08-06' , '女');
('1008' , '张三', '2002-12-01', '女');
('1012' , '张三', '2001-12-01', '女');
('1011' , '李四', '2002-08-06' , '女');
('1013' , '赵六' ,'2000-09-06' , '男');
现有SQL:
select t1.*,t2.*
from (
select * from student_table where sex = '男' ) t1 
full join 
(select * from student_table where sex = '女')t2 
on  t1.name = t2.name ; 
如下SQL中与上述SQL实现的语义和结果一致的是()?

首先Mysql(版本8.0.25)是不支持full join的。

但是full join:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值。

结果应该为:

 A选项: t1.name=null意思就是说在保证男名字全为null的情况下,还要保留女的所有信息,故最最终得到的结果为:4条女信息+男全空信息 union all  4条男女信息+一条男信息(赵六)+女空信息

 D选项:一条男生空信息+女生王五 union all 五个男的信息+女空信息

B选项:where t1.name=null,只输出一条女信息+男空信息 union all  右边4条男女信息+1条男信息+女空信息

 C选项:一条男空+女生王五信息再加4条男女信息 union all  右边是一条男信息(赵六)+女空信息

 其实我觉得BC选项结果都是正确的,只是排列顺序不一样,而C选项 的结果就与full join结果顺序一致。

posted on 2022-09-19 20:14  我不想一直当菜鸟  阅读(168)  评论(0编辑  收藏  举报