软件测试面试必考的SQL语句

之前找工作参加了几个面试,发现软件测试的笔试都有一道关于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 
)

求出最大id的男女两条数据
employee表如下:
在这里插入图片描述

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_idclass_name
1011年1班
2012年1班
3013年1班
4014年1班
teacher表结构如下
teacher_idteacher 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”;

2024-2-21更新:
求出base表操作时间在过去30天内的记录

SELECT * FROM base  WHERE operatime >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
  • 1
    点赞
  • 162
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁太太的小站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值