MySQL之CRUD

目录

一、基本查询

二、过滤查询

1、按条件表达式

2、按逻辑表达式

3、模糊查询

三、排序

1、按单个字段

2、添加条件

3、按表达式

4、按函数

5、按多个字段

四、案例

1、案例


一、基本查询

#增删改查
select * from t_mysql_employees;
desc t_mysql_employees;
insert into t_mysql_employees(first_name,last_name,email,phone_number,salary,commission_pct,manager_id,hiredate) values('rong','shi','2261696885@qq.com','18670447510',3000,0.25,100,now());

select * from t_mysql_employees where phone_number = '18670447510'
update t_mysql_employees set last_name='aa' where phone_number='18670447510';
delete from t_mysql_employees where phone_number='18670447510';

普通查询: 

 

修改后查询:

删除之后查询:

 

二、过滤查询

1、按条件表达式

#案例1:查询工资>12000的员工信息
select * from t_mysql_employees where salary>12000;

#案例2:查询部门编号不等于90号的员工名和部门编号
select last_name,department_id from t_mysql_employees where not(department_id=90);	

 

2、按逻辑表达式

#案例1:查询工资z在10000到20000之间的员工名、工资以及奖金
select last_name,salary,commission_pct from t_mysql_employees where salary between 10000 and 20000;

 

#案例2:查询部门编号不是在90到110之间,或者工资高于15000的员工信息
select * from t_mysql_employees where not(department_id between 90 and 110) or salary>15000;

 

 

3、模糊查询

#1.like
#案例1:查询员工名中包含字符ee的员工信息
select * from t_mysql_employees where last_name like '%ee%'

#案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
select * from t_mysql_employees where last_name like '__e_a%';
select * from t_mysql_employees where last_name like '%e%a%';

 

#案例3:查询员工名中第二个字符为_的员工名
select * from t_mysql_employees where last_name like '_$_%' escape '$';

 

#2.between and
#案例1:查询员工编号在100到120之间的员工信息
select * from t_mysql_employees where employee_id between 100 and 120;

#3.in
#案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
select * from t_mysql_employees where job_id in ('IT_PROG','AD_VP','AD_PRES');

 

#4、is null
#案例1:查询没有奖金的员工名和奖金率
#案例2:查询有奖金的员工名和奖金率
select last_name,commission_pct from t_mysql_employees where commission_pct is not null;
	
select last_name,commission_pct from t_mysql_employees where commission_pct is 0.4;
	
select last_name,commission_pct from t_mysql_employees where commission_pct = null;
	
select last_name,commission_pct from t_mysql_employees where commission_pct <=> null;
	
#安全等于 <=>
​#案例1:查询没有奖金的员工名和奖金率
#案例2:查询工资为12000的员工信息
	​
#is null pk <=>
IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
<=>   :既可以判断NULL值,又可以判断普通的数值,可读性较低

 

 

三、排序

1、按单个字段

#案例:按员工表薪资排序
select * from t_mysql_employees ORDER BY salary;

 

2、添加条件

​#案例:查询部门编号>=90的员工信息,并按员工编号降序
select * from t_mysql_employees where department_id>=90 ORDER BY employee_id desc;

3、按表达式

#案例:查询员工信息 按年薪降序
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、按函数

#案例:按函数排序
​​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;

5、按多个字段

​#案例:查询员工信息,要求先按工资降序,再按employee_id升序
select * from t_mysql_employees ORDER BY salary desc,employee_id asc;

四、案例

1、案例

四个数据库表: t_teacher,t_score,t_student,t_course

-- 学生表
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' , '女');
select * from t_student

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

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

-- 成绩表
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);
select * from t_score
01)查询" 01 "课程比" 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'
where b.score > c.score;

02)查询同时存在" 01 "课程和" 02 "课程的情况
SELECT * FROM 
(SELECT * FROM t_score WHERE cId = '01') AS a
INNER JOIN (SELECT * FROM t_score WHERE cId = '02') AS b
ON a.sId = b.sId;

 

03)查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
SELECT * from 
(SELECT * from t_score where cid ='01') as a
LEFT JOIN t_score AS b
ON a.sId = b.sId AND b.cId = '02';

 

04)查询不存在" 01 "课程但存在" 02 "课程的情况
SELECT * from t_score 
WHERE sid NOT IN (SELECT sid FROM t_score WHERE cid = '01') 
and cid = '02';

 

05)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
SELECT a.sid,a.sname,b.pjf from
t_student as a
INNER JOIN (SELECT sid,AVG(score) AS pjf
            FROM t_score
            GROUP BY sid
            HAVING AVG(score) >= 60) AS b
ON a.sid = b.sid;

 

06)查询在t_score表存在成绩的学生信息
SELECT b.* from 
(SELECT sid from t_score GROUP BY sid) a
LEFT JOIN t_student b
on a.sid=b.sid

 

07)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
SELECT a.sid,a.sname,b.zs,b.zcj
FROM t_student AS a
LEFT JOIN (SELECT sid,COUNT(cid) AS zs,SUM(score) AS zcj
           FROM t_score
           GROUP BY sid) AS b
ON a.sid = b.sid;

 

08)查询「李」姓老师的数量
SELECT COUNT(*) FROM t_teacher where tname like '李%'

 

09)查询学过「张三」老师授课的同学的信息
SELECT a.*,d.Tname
FROM t_student AS a
INNER JOIN t_score AS b
ON a.sid = b.sid
INNER JOIN t_course AS c
ON b.cid = c.cid
INNER JOIN t_teacher AS d
ON c.tid = d.tid
WHERE tname = '张三';

 

10)查询没有学全所有课程的同学的信息
SELECT a.*,kc
FROM t_student AS a
INNER JOIN (SELECT sid,COUNT(cid) AS kc
            FROM t_score
            GROUP BY sid
            HAVING kc < (SELECT COUNT(cid) FROM t_course)) AS b
ON a.sid = b.sid;

 

11)查询没学过"张三"老师讲授的任一门课程的学生姓名
SELECT sname
FROM t_student AS a
WHERE sid NOT IN (SELECT sid
                  FROM t_score AS a
                  LEFT JOIN t_course AS b
                  ON a.cid = b.cid
                  INNER JOIN t_teacher AS c
                  ON b.tid = c.tid
                  WHERE tname = '张三');

12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
SELECT c.sid,d.sname,pjf
FROM(SELECT a.sid,AVG(score) AS pjf
     FROM t_score AS a
     INNER JOIN(SELECT sid
                FROM t_score
                WHERE score < 60
                GROUP BY sid
                HAVING COUNT(cid) >= 2) AS b
     ON a.sid = b.sid
     GROUP BY a.sid) AS c
LEFT JOIN t_student AS d
ON c.sid = d.sid;

 

13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息
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)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
SELECT a.sid,a.cid,a.score,pjcj
FROM(SELECT a.sid,b.cid,b.score
     FROM t_student AS a
     LEFT JOIN t_score AS b
     ON a.sid = b.sid) AS a
LEFT JOIN (SELECT sid,AVG(score) AS pjcj
           FROM t_score
           GROUP BY sid) AS b
ON a.sid = b.sid
ORDER BY b.pjcj DESC;

 

15)查询各科成绩最高分、最低分和平均分:
以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
SELECT a.*,b.Cname
FROM(SELECT 
     cid,
     COUNT(*)   AS 选修人数,
     MAX(score) AS 最高分,
     MIN(score) AS 最低分,
     AVG(score) AS 平均分,
     SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) / COUNT(*) AS 及格率,
     SUM(CASE WHEN score >= 70 AND score < 80 THEN 1 ELSE 0 END) / COUNT(*) AS 中等率,
     SUM(CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END) / COUNT(*) AS 优良率,
     SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) / COUNT(*) AS 优秀率
     FROM t_score
     GROUP BY cid
     ORDER BY COUNT(*) DESC,CId ASC) AS a
LEFT JOIN t_course AS b
ON a.cid = b.cid;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荣荣荣荣.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值