sql错题(1)
遇到的错题。
1:
A:在 MySQL 里,AS关键字的用途是为查询结果中的列赋予一个新的名称,也就是列别名。、
B:在 SQL 查询语句里,=
一般是用于比较操作或者赋值操作,并非用于列重命名。
C: AS 可以省略
D: 同样是使用了=
进行比较操作,并非对列名进行重命名。
2:
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 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;
查询name
重复的id
最大的记录。
步骤:
1 找到name重复记录
2 在这些记录中找到id最大记录
A:此查询中,t1子查询找出了name重复的记录,t2子查询找出了每个name对应的最大id记录,二者通过inner join关联得到name重复且id最大的记录。但最后使用right join连接student_table t4,right join会返回右表(student_table t4)中的所有记录,即使左表(t3)中没有匹配的记录,这样就可能会返回一些不符合 “name重复的id最大的记录” 这一条件的记录。
B:t1
找出name
重复的记录,t2
找出每个name
对应的最大id
记录,二者关联后再与student_table t4
通过inner join
连接,只会返回name
重复且id
最大的记录。
C:left join会返回左表(t3)中的所有记录,以及右表(student_table t4)中匹配的记录。t3已经是name重复且id最大的记录,使用left join可能会引入一些不必要的空值记录(当右表中没有匹配记录时)。
D: 类似B
3:
在 MySQL 中,并不直接支持 FULL OUTER JOIN 操作。
FULL OUTER JOIN 的作用是返回两个表中的所有记录,无论是否存在匹配项。当在 MySQL 中尝试使用 FULL OUTER JOIN 时,会导致语法错误。
4:
ABCD
主键索引
主键是一种特殊的唯一索引,用于唯一标识表中的每一行记录。在创建表时,如果指定了主键,MySQL 会自动创建主键索引。主键索引可以确保表中不会存在重复的主键值,并且可以提高根据主键进行查询的速度。
CREATE TABLE students (id INT PRIMARY KEY,name VARCHAR(50)
);
id
列被指定为主键,MySQL 会自动为 id
列创建主键索引。所以主键索引属于 MySQL 索引类型。
唯一索引
唯一索引用于确保索引列中的值是唯一的,但可以为 NULL
。与主键索引不同的是,一个表中可以有多个唯一索引。唯一索引可以提高根据唯一索引列进行查询的性能,同时保证数据的唯一性。
CREATE TABLE users (id INT,email VARCHAR(100),UNIQUE (email)
);
email 列创建了唯一索引,确保 email 列中的值是唯一的。
普通索引
普通索引是最基本的索引类型,它没有任何限制,只用于提高查询的速度。可以在任意列上创建普通索引,以加快对该列的查询操作。
CREATE TABLE products (id INT,name VARCHAR(50)
);
CREATE INDEX idx_name ON products (name);
为 products 表的 name 列创建了普通索引。
全文索引
全文索引主要用于在文本数据中进行全文搜索,它可以快速定位包含特定关键词的文本记录。在 MySQL 中,全文索引可以用于 CHAR、VARCHAR 和 TEXT 类型的列。
CREATE TABLE articles (id INT,content TEXT,FULLTEXT (content)
);
为 articles 表的 content 列创建了全文索引
5:
游标是一种从包括多条数据记录的结果集中每次提取一条记录以便处理的机制,可以看做是查询结果的记录指针。A选项,游标允许定位在结果集的特定行;B选项,从结果集的当前位置检索一行或一部分行;C选项,支持对结果集中当前位置的行进行数据修改。
6:
在单列多值嵌套查询中,子查询会返回一个包含多个值的单列结果集,父查询使用IN
运算符来判断某个列的值是否在子查询返回的结果集中。
SELECT * FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);
子查询(SELECT department_id FROM departments WHERE location_id = 1700)会返回一个部门 ID 的列表,父查询通过IN运算符来查找属于这些部门的员工记录。
7:
MySQL [test]> select * from name;
+----+-------+
| id | name |
+----+-------+
| 1 | abbob |
| 2 | cabob |
| 3 | bbob |
| 4 | bob |
| 5 | dbob |
+----+-------+
5 rows in set (0.00 sec)
MySQL [test]>
MySQL [test]>
MySQL [test]>
MySQL [test]> select * from name where name REGEXP '[^abc]bob';
+----+------+
| id | name |
+----+------+
| 5 | dbob |
+----+------+
1 row in set (0.00 sec)
解析:[^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
8:
在关系型数据库中,左连接(left outer join)会返回左表(在此情况下是表A)的所有行,以及右表(表B)中匹配的行。如果右表中没有与左表某行匹配的行,则结果集中对应的右表部分会包含NULL值。
给定表A的行数为m,表B的行数为n,且连接的列是两表的唯一索引,我们可以这样分析:
- 表A的每一行都会出现在结果集中,因为左连接会返回左表的所有行。
- 对于表A中的每一行,如果表B中有与之匹配的行,则表B中的该行也会出现在结果集中;如果没有,则结果集中对应的表B部分会是NULL。
所以,无论表B有多少行(n的值),结果集的行数都将至少为m(表A的行数),并且可能更多(如果表B中有与表A匹配的多行)。但是,由于连接列是唯一索引,因此每个表A的行最多只能与表B的一个行匹配(或者不匹配)。
因此,左连接的结果集的行数至少为m,但不可能少于m。基于这个分析,我们可以确定答案是C:m。
9:
Charindex()返回字符或字符串在另一个字符的起始位置CHARINDEX(查找字符,被查字符,开始位置)
SubString()截取字符串中的一部分字符。SUBSTRING(字符串,开始位置,截取长度)
Stuff()删除指定长度的字符,并在指定的起点处插入另一组字符。STUFF(列名,开始位置,长度,替代字符串)
Soundex()返回表示字符串声音的一串字符
10:
Mysql中表student_table(id,name,birth,sex),score_table(stu_id,subject_name,score),查询每个学生的分数最高的学科以及对应分数、学生明细记录,如下SQL正确的是()?
A:
select t3.*,t2.subject_name,t2.score
from (
select stu_id,max(score) as c1 from score_table group by stu_id order by c1 desc limit 1
) t1
inner join
(
select * from score_table
)t2 on t1.stu_id = t2.stu_id and t1.c1 = t2.score
inner join student_table t3
on t1.stu_id = t3.id;
B:
select t3.*,t2.subject_name,t2.score
from (
select stu_id,max(score) as c1 from score_table group by stu_id
) t1
inner join
(
select * from score_table
)t2 on t1.stu_id = t2.stu_id
inner join student_table t3
on t1.stu_id = t3.id;
C:
select t3.*,t2.subject_name,t2.score
from (
select stu_id,max(score) as c1 from score_table group by stu_id
) t1
inner join
(
select * from score_table
)t2 on t1.c1 = t2.score
inner join student_table t3
on t1.stu_id = t3.id;
D:
select t3.*,t2.subject_name,t2.score
from (
select stu_id,max(score) as c1 from score_table group by stu_id
) t1
inner join
(
select * from score_table
)t2 on t1.stu_id = t2.stu_id and t1.c1 = t2.score
inner join student_table t3
on t1.stu_id = t3.id;
A、max(score) as c1后又对c1进行了order by然后limit取一个,相当于取的是所有学生中所有学科的最高分(只有一个结果),题目要求是每个学生的所有学科最高分
B、t1查询完后跟t2进行连接时只给出了一个学生id相等t1.stu_id = t2.stu_id条件,缺少分数相等的条件(t1.c1 = t2.score)
C、与B选项相反,t1跟t2连接时只给出了分数相等的条件t1.c1 = t2.score
D、符合正确答案,查询成绩表中每人的最高成绩;返回成绩表中(学生id相同,成绩score相同)的这个人的行;和学生表联合,返回 id相同的行