1. Mysql中表student_table(id,name,birth,sex),插入如下记录:
('1001' , ' ' , '2000-01-01' , '男');
('1002' , null , '2000-12-21' , '男');
('1003' , NULL , '2000-05-20' , '男');
('1004' , '张三' , '2000-08-06' , '男');
('1005' , '李四' , '2001-12-01' , '女');
执行 select count(name) from student_table 的结果是()?
A 5
B 4
C 3
D 2
正确答案:C
解析:
count()函数有两种使用方式:
1、使用count(*)对表中的行数进行计数,此种用法不忽略null值;
2、使用count(column)对特定列中具有值的行进行计数,此种用法忽略null值。 ... 展开
2. 有三张表,分别是departments部门表(注:dept_no是主键):
dept_emp部门-员工表:
以及salaries工资表:
现在统计各个部门的工资条数,按照dept_no、dept_name、sum(工资条数)输出,并按dept_no升序排列会得到如下结果:
所以下列MySQL语句正确的是:
A
SELECT
d.dept_no,d.dept_name,COUNT(salary) sum
FROM
departments d,dept_emp e,salaries s
WHERE
d.dept_no=e.dept_no AND e.emp_no=s.emp_no
GROUP BY d.dept_no;
B
SELECT
d.dept_no, d.dept_name, COUNT(s.salary) AS sum
FROM
salaries s
JOIN
dept_emp e
ON
s.emp_no = e.emp_no
JOIN
departments d
ON
d.dept_no = e.dept_no
GROUP BY
d.dept_no,d.dept_name
ORDER BY
d.dept_no;
C
SELECT
d.dept_no, d.dept_name, SUM(s.salary) AS sum
FROM
salaries s
JOIN
dept_emp e
ON
s.emp_no = e.emp_no
JOIN
departments d
ON
d.dept_no = e.dept_no
GROUP BY
d.dept_no
ORDER BY
d.dept_no;
D
SELECT
d.dept_no, d.dept_name, COUNT(s.salary) AS sum
FROM
salaries s
JOIN
dept_emp e
ON
s.emp_no = e.emp_no
JOIN
departments d
ON
d.dept_no = e.dept_no
GROUP BY
d.dept_no;
正确答案:B
解析:
由于要统计各个部门的工资条数,
- 首先要把三张表连接起来,而连接三张表的点就是salaries的emp_no对应dept_emp表格的emp_no,这样就拿到了每个员工所在的部门id和对应的工资;
- 接下来用department的dept_no连接dept_emp表的dept_no,就能拿到员工对应所在的部门名称;
- 然后对各个部门分组并统计salary条数,就会用到GROUP BY dept_no方法(这里因为dept_no是主键,所以可以用它进行分组)和COUNT(salary);
- 最后是利用ORDER BY 进行升序排序即可。
因此B是正确的;
A和D选项没有进行最后的排序;
C错在用错统计函数,统计数目应该用COUNT()而不是SUM()求和。
3. 积分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
正确答案:CD
解析:
case when 判断条件 then 成功结果 then 不成功结果 end
4. 在SQL中如何删除触发器?
A DROP TRIGGER
B DISABLE TRIGGER
C REMOVE TRIGGER
D DELETE TRIGGER
正确答案:A
解析:
删除触发器: DROP TRIGGER
输入 : DROP TRIGGER newproduct;
newproduct :触发器名称
5. 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 count(t1.birth) as c1
from (
select * from student_table where sex = '男' ) t1
right join
(select * from student_table where sex = '女') t2
on t1.birth = t2.birth and t1.name = t2.name ;
的结果行数是()?
A 2
B 1
C 3
D 4
正确答案:B
解析:
- 连接后的新表只有一条数据相同。
- null=null不算,所以李四不在。
6. 查询运动员表中运动员的所有信息,按照年龄升序,成绩降序排列。下列SQL语句正确的是()
A SELECT * FROM 运动员 ORDER BY 年龄,成绩
B SELECT * FROM 运动员 ORDER BY 1 ASC,2 DESC
C SELECT * FROM 运动员 ORDER BY 年龄 ASC,成绩 DESC
D SELECT * FROM 运动员 ORDER BY 年龄 DESC,成绩 ASC
正确答案:C
解析:
关键字DESC指降序,ASC为升序,默认为升序。A选项,皆为默认升序,不符题意;B选项为按位排序,但题目中未指明年龄和成绩两个字段的具体位置;D选项,所得结果与题意相反。
7. 有一张订单表orders,包含如下数据:
现要查找order_num不为NULL的所有数据,下面语句正确的是:
A SELECT * FROM orders WHERE order_num != NULL;
B SELECT * FROM orders WHERE order_num <> NULL;
C SELECT * FROM orders WHERE order_num IS NOT NULL;
D SELECT * FROM orders WHERE order_num NOT IS NULL;
正确答案:C
解析:
在MySQL中不能使用 = NULL 或 != NULL 等比较运算符在列中查找 NULL 值 。
要用IS NULL 或 IS NOT NULL才会进行NULL值或非NULL值得查找。
所以上面AB错在使用了比较运算符;
D错在对NULL语法不熟悉,应该是IS NOT NULL才对
8. 下列命令中,可以删除视图的是()
A DELETE
B DROP
C CLOSE
D REVOKE
正确答案:B
解析:
A选项,可用于删除表中的行数据;C选项,可用于关闭游标;D选项,可用于收回语句或对象许可。
9. Mysql中表student_table(id,name,birth,sex),查询name重复的id最大的记录,比如'张三'重复2次,id分别是1、2,则结果是id=2的记录。如下SQL错误的是()?
A
select t4.*
from (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
inner join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name
)t3
right join
student_table t4
on t3.id = t4.id ;
B
select t4.*
from (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
inner join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name
)t3
inner join
student_table t4
on t3.id = t4.id ;
C
select t4.*
from (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
inner join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name
)t3
left join
student_table t4
on t3.id = t4.id ;
D
select t4.*
from (
select t2.*
from
(select name,count(*) as c1 from student_table GROUP BY name having c1 > 1)t1
left join
(select name, max(id) as id from student_table group by name ) t2
on t1.name = t2.name
)t3
left join
student_table t4
on t3.id = t4.id ;
正确答案:A
解析:
A中【right join 】是以右表为主表,结果会包含name不重复的记录,则A错误。BCD结果均正确。
10. 批处理是指包含一条或多条T-SQL语句的语句组,下列选项中,关于批处理的规则描述正确的是()
A 定义一个check约束后,可以在同一个批处理中使用
B 修改一个表中的字段名后,不可以在同一个批处理中引用这个新字段
C Create default,Create rule等语句同一个批处理中可以同时提交多个
D 把规则和默认值绑定到表字段或自定义字段上之后,可以在同一个批处理中使用
正确答案:B
解析:
A选项
不能定义一个CHECK约束后,立即在同一个批处理中使用。
这意味着当你在SQL批处理中定义了一个表的CHECK约束后,你不能在同一组SQL命令中立即尝试插入或更新数据来测试这个约束是否生效。这是因为SQL Server需要先完成整个批处理的编译和执行计划准备,包括约束的创建,之后才能应用这些改变。因此,如果你想测试刚创建的约束,需要在新的批处理中执行数据操作语句。
C选项
Create default, Create rule, Create trigger, Create procedure, Create view等语句同一个批处理中只能提交一个。
这条说明在同一个SQL批处理中,你不能连续编写多个创建不同数据库对象(如默认值约束、规则、触发器、存储过程、视图等)的语句。每个这样的创建语句必须单独提交执行。这是因为每种创建操作都是数据库结构的一个更改,数据库需要分别处理并确认这些更改,而不是作为一个整体。尽管在某些数据库版本或环境下可能存在例外,但通常遵循这一原则以避免潜在的编译或执行错误。
D选项
不能把规则(Rules)和默认值(Defaults)绑定到表字段或自定义字段上之后,立即在同一个批处理中使用。
这类似于A选项的解释,指出在为表字段添加规则或默认值约束后,不能立刻在同一批处理中尝试利用这些约束进行数据操作。数据库需要先完成约束的创建和应用,之后新的约束才能在后续的查询或数据操作中生效。因此,任何测试新约束的行为都应放在一个新的批处理中执行。
总结来说,这些选项强调了在SQL Server中进行数据库设计和管理时,对批处理中操作顺序和执行时机的限制,特别是涉及到数据库对象创建和约束定义时,需要注意操作的隔离性和顺序性