MySQL小题

                                                                  文章目录

一、按条件表达式筛选

二、按逻辑表达式筛选

三、模糊查询

1️⃣like

2️⃣between and

3️⃣in

4️⃣is null

5️⃣安全等于 <=>

is null 与 <=> 区别

四、order by 子句

1)按单个字段排序

2)添加筛选条件再排序

3)按表达式排序

4)按别名排序

5)按函数排序

6)按多个字段排序

 🤷‍♀️排序练习


过滤查询案例所用表⬇⬇⬇⬇

一、按条件表达式筛选

案例1:查询工资>12000的员工信息

SQL语句:select * from t_mysql_employees where salary > 12000

 

 案例2:查询部门编号不等于90号的员工名和部门编号

SQL语句:select last_name,department_id from t_mysql_employees where department_id <> 90

                  select last_name,department_id from t_mysql_employees where not(department_id = 90)

二、按逻辑表达式筛选

案例1:查询工资z在10000到20000之间的员工名、工资以及奖金

SQL语句:select last_name,salary,commission_pct from t_mysql_employees where salary between 10000 and 20000

                  select last_name,salary,commission_pct from t_mysql_employees where salary >10000 and salary <20000

 案例2:查询部门编号不等于90号的员工名和部门编号

SQL语句:select * from t_mysql_employees where not(department_id between 90 and 110) or salary > 15000

三、模糊查询

1️⃣like

案例1:查询员工名中包含字符a的员工信息

SQL语句:select * from t_mysql_employees where last_name like '%a%'

 

 案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资

SQL语句:select * from t_mysql_employees where last_name like '_e_a%'

 

 案例3:查询员工名中第二个字符为_的员工名

SQL语句:select * from t_mysql_employees where last_name like '_$_%' escape '$'

  

2️⃣between and

 案例1:查询员工编号在100到120之间的员工信息

SQL语句:select * from t_mysql_employees where employee_id between 100 and 120

3️⃣in

案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号

SQL语句:select * from t_mysql_employees where job_id in ('IT_PROG','AD_VP','AD_PRES')

  

4️⃣is null

案例1:查询没有奖金的员工名和奖金率

SQL语句:select last_name,commission_pct from t_mysql_employees where commission_pct is null 

案例2:查询有奖金的员工名和奖金率

SQL语句: select last_name,commission_pct from t_mysql_employees where commission_pct = 0.4 

                  select last_name,commission_pct from t_mysql_employees where commission_pct <=> 0.4

  

5️⃣安全等于 <=>

案例1:查询没有奖金的员工名和奖金率

SQL语句:SELECT last_name,commission_pct FROM t_mysql_employees WHERE commission_pct <=>NULL

 案例2:查询工资为12000的员工信息

SQL语句:select last_name,salary from t_mysql_employees where salary=12000

 

is null 与 <=> 区别

is null:仅仅可以判断null值,可读性较高,建议建议使用
<=>:既可以判断null值又可以判断普通的数值,可读性较低

四、order by 子句

1)按单个字段排序

案例:按员工表薪资排序

SQL语句:select * from t_mysql_employees ORDER BY salary

 

2)添加筛选条件再排序

案例:查询部门编号>=90的员工信息,并按员工编号降序

SQL语句:SELECT * FROM t_mysql_employees where department_id >=90 ORDER BY employee_id desc

  

3)按表达式排序

案例:查询员工信息 按年薪降序

SQL语句:select em.salary*12*(1+IFNULL(commission_pct,0)),em.* from t_mysql_employees em ORDER BY em.salary*12*(1+IFNULL(commission_pct,0)) desc

  

4)按别名排序

案例:查询员工信息 按年薪升序

SQL语句:select count(1) as n from t_mysql_employees 

 

 SQL语句:select em.salary*12*(1+IFNULL(commission_pct,0)),em.* from t_mysql_employees em ORDER BY em.salary*12*(1+IFNULL(commission_pct,0)) asc

5)按函数排序

案例:查询员工名,并且按名字的长度降序

SQL语句:select last_name,CONCAT(first_name,last_name),LENGTH(CONCAT(first_name,last_name)) from t_mysql_employees ORDER BY LENGTH(CONCAT(first_name,last_name)) desc

  

6)按多个字段排序

案例:查询员工信息,要求先按工资降序,再按employee_id升序

SQL语句:select * from t_mysql_employees ORDER BY salary desc,employee_id asc

 

 🤷‍♀️排序练习

1.查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序

SQL语句:select em.salary*12*(1+IFNULL(commission_pct,0)),em.* from t_mysql_employees em   order by salary*12*(1+IFNULL(commission_pct,0)) DESC , last_name ASC

2.选择工资不在8000到17000的员工的姓名和工资,按工资降序

SQL语句:select last_name,salary from t_mysql_employees  where salary not between 8000 and 17000;

3.查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序

 SQL语句:select LENGTH(email) from t_mysql_employees
select em.* ,LENGTH(email)  from t_mysql_employees em   order by LENGTH(email)  desc ,department_id ASC

 扩展练习⬇⬇⬇⬇⬇

表结构

1.学生表-t_student
-- sid 学生编号,sname 学生姓名,sage 学生年龄,ssex 学生性别

2.教师表-t_teacher
-- tid 教师编号,tname 教师名称

3.课程表-t_course
-- cid 课程编号,cname 课程名称,tid 教师名称

4.成绩表-t_score
-- sid 学生编号,cid 课程编号,score 成绩

 表数据

-- 学生表
insert into t_student values('01' , '赵雷' , '1990-01-01' , '男');
insert into t_student values('02' , '钱电' , '1990-12-21' , '男');
insert into t_student values('03' , '孙风' , '1990-12-20' , '男');
insert into t_student values('04' , '李云' , '1990-12-06' , '男');
insert into t_student values('05' , '周梅' , '1991-12-01' , '女');
insert into t_student values('06' , '吴兰' , '1992-01-01' , '女');
insert into t_student values('07' , '郑竹' , '1989-01-01' , '女');
insert into t_student values('09' , '张三' , '2017-12-20' , '女');
insert into t_student values('10' , '李四' , '2017-12-25' , '女');
insert into t_student values('11' , '李四' , '2012-06-06' , '女');
insert into t_student values('12' , '赵六' , '2013-06-13' , '女');
insert into t_student values('13' , '孙七' , '2014-06-01' , '女');

-- 教师表
insert into t_teacher values('01' , '张三');
insert into t_teacher values('02' , '李四');
insert into t_teacher values('03' , '王五');

-- 课程表
insert into t_course values('01' , '语文' , '02');
insert into t_course values('02' , '数学' , '01');
insert into t_course values('03' , '英语' , '03');

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

 题目

01)查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数

 SQL语句及运行效果

select * from t_student right join (
select a.sid from 
(select * from t_score where cid='01') as a,
(select * from t_score where cid='02')as b where a.sid=b.sid and a.score>b.score)x on t_student.sid=x.sid

 02)查询同时存在" 01 "课程和" 02 "课程的情况

 SQL语句及运行效果

select a.*,b.cid,c.cid from t_student a,t_score b,t_score c where a.sid=b.sid and a.sid=c.sid and b.cid='01' and c.cid='02'

select a.*,b.score 01score,c.score 02score from t_student as a inner join t_score as b
on a.sid = b.sid
inner join t_score as c
on a.sid = c.sid and b.cid ='01' and c.cid='02'

03)查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null ) 

 SQL语句及运行效果

select * from 
    (select * from t_score s where s.cid='01' ) as a1
where a1.sid not in (select sid from t_score s where s.cid ='02')

  

04)查询不存在" 01 "课程但存在" 02 "课程的情况

 SQL语句及运行效果

select * from 
    (select * from t_score s where s.cid = '02') as a1
where a1.sid not in (select sid from t_score s where s.cid = '01')

 

05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

 SQL语句及运行效果

select a.sid,a.sname,AVG(b.score) from t_student a,t_score b where a.sid = b.sid GROUP BY b.sid HAVING AVG(b.score)>=60

 06)查询在t_score表存在成绩的学生信息

 SQL语句及运行效果

select * from t_student where sid in (select sid from t_score group by sid )

  

 07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

 SQL语句及运行效果

select a.sid,a.sname,COUNT(b.cid),SUM(b.score) from t_student a,t_score b where a.sid = b.sid GROUP BY b.sid

 08)查询「李」姓老师的数量

 SQL语句及运行效果

select count(*) from t_teacher where tname like '李%'

 

 09)查询学过「张三」老师授课的同学的信息

 SQL语句及运行效果

select a.*,c.tname  from t_student a , t_score b ,t_teacher c ,t_course d where a.sid=b.sid and b.cid = d.cid and d.tid = c.tid and b.cid='02'

10)查询没有学全所有课程的同学的信息 

 SQL语句及运行效果

select * from t_student  where sid not in(select a.sid from t_student a,t_score b,t_score c,t_score d where a.sid=b.sid and a.sid=c.sid and b.cid='01' and c.cid='02' and d.cid='03') 

 11)查询没学过"张三"老师讲授的任一门课程的学生姓名
select s.sname from t_student s where sid not in (select sid from t_course c join t_teacher t on c.tid=t.tid join t_score on t_score.cid=c.cid where tname='张三')

 SQL语句及运行效果

select s.sname from t_student s where sid not in (select sid from t_course c join t_teacher t on c.tid=t.tid join t_score on t_score.cid=c.cid where tname='张三')

12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩 

 SQL语句及运行效果

select * from t_student a,t_score b where a.sid=b.sid and a.sid in(select c.sid from t_score c where c.score<60 GROUP BY c.sid HAVING COUNT(*)>1)

13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息 

 SQL语句及运行效果

select b.*,a.score from(
    select sid,score from t_score where cid='01' and score<60 ) as a left join t_student as b on a.sid = b.sid
order by a.score desc

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

SQL语句及运行效果: 

select a.*,AVG(b.score) from t_student a,t_score b where a.sid = b.sid GROUP BY b.sid  HAVING AVG(b.score)>=0 ORDER BY AVG(b.score) desc

15)查询各科成绩最高分、最低分和平均分:
以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列 

SQL语句及运行效果: 

select a.cid,cname,max(a.score)'最高分',min(a.score)'最低分',avg(a.score)'平均分',((select count(sid) from t_score where score>=60 and cid=b.cid )/(select count(sid) from t_score where cid=b.cid)) '及格率' from t_score a
inner join t_course b on a.cid = b.cid
group by b.cid;

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值