MySQL之CRUD

目录

一、增删改

增加

修改

删除

二、查询

基础查询 

​ 特点

过滤查询

排序

三、案例

一、增删改

增加

insert into t_mysql_employees
(first_name,last_name,email,phone_number,salary,commission_pct,manager_id,hiredate) 
values('li','si','12312312@qq.com','12312312345',2000,0.25,now());

修改

update t_mysql_employees set last_name='cc' where phone_number ='12312312345'

删除

delete from t_mysql_employees where phone_number='12312312345'

二、查询

基础查询 

 语法:

select 查询列表 from 表名;

​ 特点

​查询列表可以是:表中的字段、常量值、表达式、函数

查询的结果是一个虚拟的表格

USE myemployees; ​

1.查询表中的单个字段 ​

SELECT last_name FROM t_mysql_employees; ​

2.查询表中的多个字段

SELECT last_name,salary,email FROM t_mysql_employees; ​

3.查询表中的所有字段 ​

方式一:

SELECT `employee_id`, `first_name`, `last_name`, `phone_number`, `last_name`, `job_id`, `phone_number`, `job_id`, `salary`, `commission_pct`, `manager_id`, `department_id`, `hiredate` FROM t_mysql_employees ;

方式二:

SELECT * FROM t_mysql_employees;

4.查询常量值

SELECT 100;

SELECT 'john';

5.查询表达式

SELECT 100%98;

6.查询函数

SELECT VERSION();

7.起别名

 ①便于理解

②如果要查询的字段有重名的情况,使用别名可以区分开来

方式一:使用as SELECT 100%98 AS 结果;

SELECT last_name AS 姓,first_name AS 名 FROM t_mysql_employees; ​

方式二:使用空格 SELECT last_name 姓,first_name 名 FROM t_mysql_employees; ​ ​

案例:

查询salary,显示结果为 out put

SELECT salary AS "out put" FROM t_mysql_employees; ​ ​

8.去重 ​

案例:查询员工表中涉及到的所有的部门编号

SELECT DISTINCT department_id FROM t_mysql_employees; ​ ​

9.+号的作用 ​

​ java中的+号:

①运算符,两个操作数都为数值型

②连接符,只要有一个操作数为字符串 ​ mysql中的+号 仅仅只有一个功能:运算符 ​ select 100+90; 两个操作数都为数值型,则做加法运算 select '123'+90;只要其中一方为字符型,试图将字符型数值转换成数值型 如果转换成功,则继续做加法运算 select 'john'+90;如果转换失败,则将字符型数值转换成0 ​ select null+10; 只要其中一方为null,则结果肯定为null ​

案例:

查询员工名和姓连接成一个字段,并显示为 姓名 ​ ​ SELECT CONCAT('a','b','c') AS 结果; ​

SELECT CONCAT(last_name,first_name) AS 姓名 FROM t_mysql_employees;

过滤查询


1.按条件表达式筛选

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

select * from t_mysql_employees where salary>12000

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

select * from t_mysql_employees where department_id <> 90;    
    select * 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:查询员工名中包含字符a的员工信息

select * from t_mysql_employees where last_name like '%a%'


    案例2:查询员工名中第二个字符为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:查询没有奖金的员工名和奖金率
  

select last_name,commission_pct from t_mysql_employees 
where commission_pct is null;

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<=>null;
    
select last_name,commission_pct from t_mysql_employees 
where commission_pct<=>0.4;


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

select last_name,commission_pct from t_mysql_employees 
where commission_pct is not null;

排序

语法:

select 查询列表 from 表名 【where 筛选条件】 order by 排序的字段或表达式; ​ ​

特点

1、asc代表的是升序,可以省略 desc代表的是降序

​ 2、order by子句可以支持 单个字段、别名、表达式、函数、多个字段 ​

3、order by子句在查询语句的最后面,除了limit子句

1、按单个字段排序

SELECT * FROM t_mysql_employees ORDER BY salary DESC;​

2、添加筛选条件再排序 ​

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

SELECT * FROM t_mysql_employees WHERE department_id>=90 ORDER BY employee_id DESC;​​

3、按表达式排序

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

SELECT *,salary*12*(1+IFNULL(commission_pct,0)) FROM t_mysql_employees 
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;​​

4、按别名排序

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

​SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM t_mysql_employees ORDER BY 年薪 ASC;​

5、按函数排序

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

SELECT LENGTH(last_name),last_name FROM t_mysql_employees 
ORDER BY LENGTH(last_name) DESC;​

6、按多个字段排序 ​

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

SELECT * FROM t_mysql_employees ORDER BY salary DESC,employee_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 成绩

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 c.sid,b.cid,b.score
     FROM t_student c, t_score b
     WHERE c.sid = b.sid) AS a
INNER 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;


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值