sql常见50道查询练习题

sql常见50道查询练习题

1. 表创建

在这里插入图片描述

1.1 表创建

#–1.学生表 
#Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别
CREATE TABLE `Student` (
    `s_id` VARCHAR(20),
    s_name VARCHAR(20) NOT NULL DEFAULT '',
    s_brith VARCHAR(20) NOT NULL DEFAULT '',
    s_sex VARCHAR(10) NOT NULL DEFAULT '',
    PRIMARY KEY(s_id)
);

#–2.课程表 
#Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号 
create table Course(
    c_id varchar(20),
    c_name VARCHAR(20) not null DEFAULT '',
    t_id VARCHAR(20) NOT NULL,
    PRIMARY KEY(c_id)
);

/*
–3.教师表 
Teacher(t_id,t_name) –教师编号,教师姓名 
*/
CREATE TABLE Teacher(
    t_id VARCHAR(20),
    t_name VARCHAR(20) NOT NULL DEFAULT '',
    PRIMARY KEY(t_id)
);

/*
–4.成绩表 
Score(s_id,c_id,s_score) –学生编号,课程编号,分数
*/
Create table Score(
    s_id VARCHAR(20),
    c_id VARCHAR(20) not null default '',
    s_score INT(3),
    primary key(`s_id`,`c_id`)
);

1.2 数据插入

#--插入学生表测试数据
#('01' , '赵雷' , '1990-01-01' , '男')
insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
insert into Student values('02' , '钱电' , '1990-12-21' , '男');
insert into Student values('03' , '孙风' , '1990-05-20' , '男');
insert into Student values('04' , '李云' , '1990-08-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
insert into Student values('08' , '王菊' , '1990-01-20' , '女');

#--课程表测试数据
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');

#--教师表测试数据
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');

#--成绩表测试数据
insert into Score values('01' , '01' , 80);
insert into Score values('01' , '02' , 90);
insert into Score values('01' , '03' , 99);
insert into Score values('02' , '01' , 70);
insert into Score values('02' , '02' , 60);
insert into Score values('02' , '03' , 80);
insert into Score values('03' , '01' , 80);
insert into Score values('03' , '02' , 80);
insert into Score values('03' , '03' , 80);
insert into Score values('04' , '01' , 50);
insert into Score values('04' , '02' , 30);
insert into Score values('04' , '03' , 20);
insert into Score values('05' , '01' , 76);
insert into Score values('05' , '02' , 87);
insert into Score values('06' , '01' , 31);
insert into Score values('06' , '03' , 34);
insert into Score values('07' , '02' , 89);
insert into Score values('07' , '03' , 98);

2. 简单查询例题(3题)

2.1 查询"李"姓老师的数量

SELECT
	count(1) as cnt
FROM
	teacher
WHERE
	t_name like "李%"

2.2 查询男生、女生人数

SELECT
	s.s_sex,
	count(1) as 人数
FROM
	student s
group by
	s.s_sex

2.3 查询名字中含有"风"字的学生信息

SELECT
	*
FROM
	student
WHERE
	s_name like "%风%"

3. 日期相关例题(6题)

3.1 查询各学生的年龄

  • (按照出生日期来算,当前月日 < 出生年月的月日则,年龄减一)
    -- if函数
    
    select
    	a.*,
    	year(NOW())-year(a.s_brith)-if(DATE_FORMAT(now(),"%m%d") >DATE_FORMAT(a.s_brith,"%m%d"),0,1) as age
    FROM
    	student a
    
    -- case函数
     
    select s_brith,
    	(DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(s_brith,'%Y') - (case when DATE_FORMAT(NOW(),'%m%d')>DATE_FORMAT(s_brith,'%m%d') then 0 else 1 end)) as age
    from student;
    

3.2 查询本周过生日的学生

SELECT
	*
FROM
	student
WHERE
	WEEKOFYEAR(STR_TO_DATE(concat(year(NOW()),DATE_FORMAT(s_brith,'%m%d')),"%Y%m%d"))=WEEKOFYEAR(NOW())
-- 	WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))=WEEK(s_birth)

3.3 查询下周过生日的学生

SELECT
	*
FROM
	student
WHERE
	WEEKOFYEAR(STR_TO_DATE(concat(year(NOW()),DATE_FORMAT(s_brith,'%m%d')),"%Y%m%d"))=WEEKOFYEAR(NOW()+interval "7" day)
-- 	WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1=WEEK(s_birth)

3.4 查询本月过生日的学生

SELECT
	*
FROM
	student
WHERE
	MONTH(now())=month(s_brith)

3.5 查询下月过生日的学生

SELECT
	*
FROM
	student
WHERE
	MONTH(now()+interval "1" month)=month(s_brith)

3.6 查询1990年出生的学生名单

SELECT
	*
FROM
	student
WHERE
	s_brith like "1990%"
-- 	left(s_brith,4)="1990"
-- 	year(s_brith)="1990"

4. 开窗函数查询(7题)

4.1 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

  • 方法一:开窗函数
    select
    	a.*,
    	avg(a.s_score) over(PARTITION by a.s_id) as avg_score
    FROM
    	score a
    
  • 方法二:临时表连接
    SELECT
    	a.*,
    	t.avg_score
    FROM
    	score a,
    	(SELECT
    		a.s_id,
    		round(avg(a.s_score),2) as avg_score
    	FROM
    		score a
    	group by
    		a.s_id) t
    WHERE
    	a.s_id=t.s_id
    order by
    	t.avg_score desc
    
  • 方法三:长型数据转为宽型数据
    SELECT
    	a.s_id,
    	ifnull((select s_score from score where s_id=a.s_id and c_id="01"),0) as "语文",
    	ifnull((select s_score from score where s_id=a.s_id and c_id="02"),0) as "数学",
    	ifnull(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荼靡~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值