之前找工作参加了几个面试,发现软件测试的笔试都有一道关于SQL的简答题,今天就把必考的题型及参考答案汇总一下。
基础SQL例子
1、创建表,如创建学生表Student,要求有学生姓名name,年龄age,班级class
大致写法是:
字段名 类型 是否为空 主键
CREATE TABLE Student (
name VARCHAR ( 255 ) not null primary key,
age INT NOT NULL,
class VARCHAR ( 255 ) NOT NULL
)
2、修改字段名,基本语法是:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
如把上表的name改为name1
ALTER TABLE Student CHANGE name name1 VARCHAR (255);
3、向Student表插入一条数据“小红,11,3年(2)班”
INSERT INTO student VALUES( '小红',12, '3年(2)班');
4、删除Student表中name为“小红”的记录
delete from Student where name="小红";
5、将Student表中name为小红,改为小小丽
UPDATE Student1 SET `name` = '小小丽' WHERE `name` = '小红'
6、求出每个年龄层的人数
SELECT age,COUNT(*) FROM `Student` GROUP BY age
如果将上面的要求改成求出11岁的学生人数有几个,那么SQL语句就是
SELECT age,COUNT(*) FROM `Student` GROUP BY age having age=11
如果说求出班级的学生人数,也就是求学生表的总数
SELECT COUNT(*) FROM `Student`
7、简单去重,求出去除重复名字后的名字列
SELECT DISTINCT `NAME` FROM Student1
8、求出年龄字段有重复的
select age,count(*) from Student group by age having count(*) > 1
创建有默认值且限定字段值的表
例子:创建一个员工表,要求有sex字段,且sex仅限男女两种值,默认是男
(1)如果是以下创建方式,sex字段插入非男或者非女值,是不会报错的,原因未知
CREATE TABLE employee (
id INT ( 255 ) NOT NULL PRIMARY KEY,
NAME VARCHAR ( 10 ) NOT NULL,
sex CHAR ( 1 ) DEFAULT '男' CHECK (sex IN ( '男', '女' )),
phone INT ( 13 ) NOT NULL
)
(2)如果是以下这种创建方式,sex字段插入非男或者非女值,是会报错的
CREATE TABLE employee (
id INT ( 255 ) NOT NULL PRIMARY KEY,
NAME VARCHAR ( 10 ) NOT NULL,
`sex` enum('男','女') default '男',
phone INT ( 13 ) NOT NULL
)
select * from `employee` a where a.id in
(SELECT MAX(id) FROM `employee`
GROUP BY employee.sex)
上述的SQL虽然实现了效果,但是呢,执行速度是比较慢的,经过一番调整,所以就有了另外一种呈现方式
SELECT b.* FROM (SELECT a.* FROM `employee` a ORDER BY a.id DESC LIMIT 10000) b
GROUP BY
b.sex
多表联合查询
这是学生表student,其中sex字段的1代表男生,0代表女生
这是班级表class
这是学生班级表student_class
1、求出“1年1班”的学生名字和对应分数
SELECT a.s_name,a.score FROM student a
WHERE a.s_id IN (SELECT s_id FROM student_class
WHERE c_id IN (SELECT c_id FROM
class WHERE c_name="1年1班"))
查询结果如下
如果是上述的结果,感觉和题干不是很贴切,没有把班级名称c_name给返回,所以严谨点,sql语句查询如下
SELECT s.s_id,s.s_name,s.score,sc.c_id,c.c_name
from student s JOIN student_class sc on
s.s_id = sc.s_id JOIN
class c on sc.c_id=c.c_id and
c.c_name='1年1班';
2、求出c_id为201的平均分
SELECT AVG(a.score) FROM student a JOIN
student_class b on a.s_id=b.s_id AND
b.c_id=201
再来一个比较相对复杂的,也是最近从同事那里学习到的。
class表结构如下
class_id | class_name |
---|---|
101 | 1年1班 |
201 | 2年1班 |
301 | 3年1班 |
401 | 4年1班 |
teacher表结构如下 | |
teacher_id | teacher name |
– | – |
1 | 王老师 |
2 | 张老师 |
通过上面两个表,求出张老师分别教哪些班级 |
SELECT teacher.teacder_name,class.class_id,class.class_name FROM teacher,`class` WHERE
FIND_IN_SET (
class_id,
( SELECT class_id FROM teacher WHERE teacher.teacder_name="张老师")) AND teacher.teacder_name="张老师"
2022-12-02补充:
获取当前时间戳
select current_timestamp(),格式为日期时间"2022-12-02 09:40:02"
获取当前日期
select current_date(),格式为“2022-12-02”;