• MySQL之CRUD


    目录

    一、基础查询

    二、过滤和排序数据

    三、Order by子句

    四、排序案例

    五、拓展案例


    一、基础查询

    1、语法:select  查询列表  from 表名

    2、特点:

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

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

    3、实例:

    1. 3.1.查询表中的单个字段
    2. SELECT last_name FROM t_mysql_employees;
    3. 3.2.查询表中的多个字段
    4. SELECT last_name,salary,email FROM t_mysql_employees;
    5. 3.3.查询表中的所有字段
    6. 方式一:
    7. SELECT
    8. `employee_id`,
    9. `first_name`,
    10. `last_name`,
    11. `phone_number`,
    12. `last_name`,
    13. `job_id`,
    14. `phone_number`,
    15. `job_id`,
    16. `salary`,
    17. `commission_pct`,
    18. `manager_id`,
    19. `department_id`,
    20. `hiredate`
    21. FROM
    22. t_mysql_employees ;
    23. 方式二:
    24. SELECT * FROM t_mysql_employees;
    25. 3.4.查询常量值
    26. SELECT 100;
    27. SELECT 'john';
    28. 3.5.查询表达式
    29. SELECT 100%98;
    30. 3.6.查询函数
    31. SELECT VERSION();

    3.7:起别名:

    目的:①便于理解
               ②如果要查询的字段有重名的情况,使用别名可以区分开来

    3.8:去重:把表格中重复的字段去掉

    SELECT DISTINCT department_id FROM t_mysql_employees;

    3.9:+号的作用:说起加号,就要和JAVA中的加号进行对比了。
                java中的+号:
                        ①运算符,两个操作数都为数值型
                        ②连接符,只要有一个操作数为字符串
               mysql中的+号:仅仅只有一个功能:运算符。

    3.9.1+号的几种情况:

        1、两个操作数都为数值型,则做加法运算

    2、只要其中一方为字符型,试图将字符型数值转换成数值型,如果转换成功,则继续做加法运算

    3、如果转换失败,则将字符型数值转换成0 

     4、只要其中一方为null,则结果肯定为null

    二、过滤和排序数据

    1、过滤
    2、在查询中过滤行
    3、where子句
    4、比较运算
    5、between
    6、in
    7、like
    8、null
    9、逻辑运算

    1. 语法:
    2. select
    3. 查询列表
    4. from
    5. 表名
    6. where
    7. 筛选条件;
    8. 分类:
    9. 一、按条件表达式筛选
    10. 简单条件运算符:> < = != <> >= <=
    11. 二、按逻辑表达式筛选
    12. 逻辑运算符:
    13. 作用:用于连接条件表达式
    14. && || !
    15. and or not
    16. &&and:两个条件都为true,结果为true,反之为false
    17. ||or: 只要有一个条件为true,结果为true,反之为false
    18. !not: 如果连接的条件本身为false,结果为true,反之为false
    19. 三、模糊查询
    20. like
    21. between and
    22. in
    23. is null
    24. */
    25. #一、按条件表达式筛选
    26. #案例1:查询工资>12000的员工信息
    27. SELECT
    28. *
    29. FROM
    30. t_mysql_employees
    31. WHERE
    32. salary>12000;
    33. #案例2:查询部门编号不等于90号的员工名和部门编号
    34. SELECT
    35. last_name,
    36. department_id
    37. FROM
    38. t_mysql_employees
    39. WHERE
    40. department_id<>90;
    41. #二、按逻辑表达式筛选
    42. #案例1:查询工资z在1000020000之间的员工名、工资以及奖金
    43. SELECT
    44. last_name,
    45. salary,
    46. commission_pct
    47. FROM
    48. t_mysql_employees
    49. WHERE
    50. salary>=10000 AND salary<=20000;
    51. #案例2:查询部门编号不是在90110之间,或者工资高于15000的员工信息
    52. SELECT
    53. *
    54. FROM
    55. t_mysql_employees
    56. WHERE
    57. NOT(department_id>=90 AND department_id<=110) OR salary>15000;
    58. #三、模糊查询
    59. /*
    60. like
    61. between and
    62. in
    63. is null|is not null
    64. */
    65. #1.like
    66. /*
    67. 特点:
    68. ①一般和通配符搭配使用
    69. 通配符:
    70. % 任意多个字符,包含0个字符
    71. _ 任意单个字符
    72. *、
    73. #案例1:查询员工名中包含字符a的员工信息
    74. select
    75. *
    76. from
    77. employees
    78. where
    79. last_name like '%a%';#abc
    80. #案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
    81. select
    82. last_name,
    83. salary
    84. FROM
    85. t_mysql_employees
    86. WHERE
    87. last_name LIKE '__n_l%';
    88. 案例3:查询员工名中第二个字符为_的员工名
    89. SELECT
    90. last_name
    91. FROM
    92. t_mysql_employees
    93. WHERE
    94. last_name LIKE '_$_%' ESCAPE '$';
    95. 2.between and
    96. /*
    97. ①使用between and 可以提高语句的简洁度
    98. ②包含临界值
    99. ③两个临界值不要调换顺序
    100. */
    101. #案例1:查询员工编号在100120之间的员工信息
    102. SELECT
    103. *
    104. FROM
    105. t_mysql_employees
    106. WHERE
    107. employee_id <= 120 AND employee_id>=100;
    108. #----------------------
    109. SELECT
    110. *
    111. FROM
    112. t_mysql_employees
    113. WHERE
    114. employee_id BETWEEN 100 AND 120;
    115. #3.in
    116. /*
    117. 含义:判断某字段的值是否属于in列表中的某一项
    118. 特点:
    119. ①使用in提高语句简洁度
    120. ②in列表的值类型必须一致或兼容
    121. ③in列表中不支持通配符
    122. */
    123. #案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
    124. SELECT
    125. last_name,
    126. job_id
    127. FROM
    128. t_mysql_employees
    129. WHERE
    130. job_id = 'IT_PROT' OR job_id = 'AD_VP' OR JOB_ID ='AD_PRES';
    131. #------------------
    132. SELECT
    133. last_name,
    134. job_id
    135. FROM
    136. t_mysql_employees
    137. WHERE
    138. job_id IN( 'IT_PROT' ,'AD_VP','AD_PRES');
    139. #4is null
    140. /*
    141. =或<>不能用于判断null值
    142. is null或is not null 可以判断null值
    143. */
    144. #案例1:查询没有奖金的员工名和奖金率
    145. SELECT
    146. last_name,
    147. commission_pct
    148. FROM
    149. t_mysql_employees
    150. WHERE
    151. commission_pct IS NULL;
    152. #案例1:查询有奖金的员工名和奖金率
    153. SELECT
    154. last_name,
    155. commission_pct
    156. FROM
    157. t_mysql_employees
    158. WHERE
    159. commission_pct IS NOT NULL;
    160. #----------以下为×
    161. SELECT
    162. last_name,
    163. commission_pct
    164. FROM
    165. t_mysql_employees
    166. WHERE
    167. salary IS 12000;
    168. #安全等于 <=>
    169. #案例1:查询没有奖金的员工名和奖金率
    170. SELECT
    171. last_name,
    172. commission_pct
    173. FROM
    174. t_mysql_employees
    175. WHERE
    176. commission_pct <=>NULL;
    177. #案例2:查询工资为12000的员工信息
    178. SELECT
    179. last_name,
    180. salary
    181. FROM
    182. t_mysql_employees
    183. WHERE
    184. salary <=> 12000;
    185. #is null pk <=>
    186. IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
    187. <=> :既可以判断NULL值,又可以判断普通的数值,可读性较低

    三、Order by子句

    1. 1、按单个字段排序
    2. 案例:按员工表薪资排序
    3. SELECT * FROM t_mysql_employees ORDER BY salary DESC;
    4. 2、添加筛选条件再排序
    5. 案例:查询部门编号>=90的员工信息,并按员工编号降序
    6. SELECT * FROM t_mysql_employees WHERE department_id>=90 ORDER BY employee_id DESC;
    7. 3、按表达式排序
    8. 案例:查询员工信息 按年薪降序
    9. ​​SELECT *,salary*12*(1+IFNULL(commission_pct,0)) FROM t_mysql_employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
    10. 4、按别名排序
    11. 案例:查询员工信息 按年薪升序
    12. ​​​​SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM t_mysql_employees
    13. 5、按函数排序
    14. 案例:查询员工名,并且按名字的长度降序
    15. SELECT LENGTH(last_name),last_name FROM t_mysql_employees ORDER BY LENGTH(last_name) DESC;
    16. 6、按多个字段排序
    17. ​案例:查询员工信息,要求先按工资降序,再按employee_id升序
    18. SELECT * FROM t_mysql_employees ORDER BY salary DESC,employee_id ASC;

    四、排序案例

    1. 1.查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序
    2. select last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) from t_mysql_employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) desc,last_name asc
    3. 2.选择工资不在800017000的员工的姓名和工资,按工资降序
    4. SELECT last_name,salary from t_mysql_employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) desc,salary not in(8000,17000)
    5. 3.查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
    6. SELECT * from t_mysql_employees where email like '%e%' ORDER BY LENGTH(email) desc ,department_id asc

    五、拓展案例

    1、首先建立四个表并且分别插入数据

    1. -- 1.学生表-t_student
    2. -- sid 学生编号,sname 学生姓名,sage 学生年龄,ssex 学生性别
    3. CREATE TABLE t_student(
    4. sid VARCHAR(20),
    5. sname VARCHAR(20),
    6. sage date,
    7. ssex VARCHAR(20)
    8. )
    9. -- 2.教师表-t_teacher
    10. -- tid 教师编号,tname 教师名称
    11. create table t_teacher(
    12. tid VARCHAR(20),
    13. tname VARCHAR(20)
    14. )
    15. -- 3.课程表-t_course
    16. -- cid 课程编号,cname 课程名称,tid 教师名称
    17. create table t_course(
    18. cid VARCHAR(20),
    19. cname VARCHAR(20),
    20. tid VARCHAR(20)
    21. )
    22. -- 4.成绩表-t_score
    23. -- sid 学生编号,cid 课程编号,score 成绩
    24. CREATE table t_score(
    25. sid VARCHAR(20),
    26. cid VARCHAR(20),
    27. score INT
    28. )
    29. -- 学生表
    30. insert into t_student values('01' , '赵雷' , '1990-01-01' , '男');
    31. insert into t_student values('02' , '钱电' , '1990-12-21' , '男');
    32. insert into t_student values('03' , '孙风' , '1990-12-20' , '男');
    33. insert into t_student values('04' , '李云' , '1990-12-06' , '男');
    34. insert into t_student values('05' , '周梅' , '1991-12-01' , '女');
    35. insert into t_student values('06' , '吴兰' , '1992-01-01' , '女');
    36. insert into t_student values('07' , '郑竹' , '1989-01-01' , '女');
    37. insert into t_student values('09' , '张三' , '2017-12-20' , '女');
    38. insert into t_student values('10' , '李四' , '2017-12-25' , '女');
    39. insert into t_student values('11' , '李四' , '2012-06-06' , '女');
    40. insert into t_student values('12' , '赵六' , '2013-06-13' , '女');
    41. insert into t_student values('13' , '孙七' , '2014-06-01' , '女');
    42. -- 教师表
    43. insert into t_teacher values('01' , '张三');
    44. insert into t_teacher values('02' , '李四');
    45. insert into t_teacher values('03' , '王五');
    46. -- 成绩表
    47. insert into t_score values('01' , '01' , 80);
    48. insert into t_score values('01' , '02' , 90);
    49. insert into t_score values('01' , '03' , 99);
    50. insert into t_score values('02' , '01' , 70);
    51. insert into t_score values('02' , '02' , 60);
    52. insert into t_score values('02' , '03' , 80);
    53. insert into t_score values('03' , '01' , 80);
    54. insert into t_score values('03' , '02' , 80);
    55. insert into t_score values('03' , '03' , 80);
    56. insert into t_score values('04' , '01' , 50);
    57. insert into t_score values('04' , '02' , 30);
    58. insert into t_score values('04' , '03' , 20);
    59. insert into t_score values('05' , '01' , 76);
    60. insert into t_score values('05' , '02' , 87);
    61. insert into t_score values('06' , '01' , 31);
    62. insert into t_score values('06' , '03' , 34);
    63. insert into t_score values('07' , '02' , 89);
    64. insert into t_score values('07' , '03' , 98);
    65. -- 课程表
    66. insert into t_course values('01' , '语文' , '02');
    67. insert into t_course values('02' , '数学' , '01');
    68. insert into t_course values('03' , '英语' , '03');
    69. select * from t_course
    70. select * from t_score
    71. select * from t_teacher
    72. select * from t_student

    2、案例(大部分都是使用内连接的)

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

    1. SELECT a.*,b.score 01score,c.score 02score
    2. FROM t_student as a
    3. INNER JOIN t_score as b
    4. ON a.sid = b.sid
    5. INNER JOIN t_score as c
    6. ON a.sid = c.sid and b.cid = '01' and c.cid = '02'
    7. where b.score > c.score;

    解题思路:

    1、首先将成绩表分为‘01’和‘02’两部分,'01'数据视为b表,'02'数据视为c表

    通过cid将两个表连接起来,然后再筛选出" 01 "课程比" 02 "课程成绩高的

    2、将学生表t_student看做为a表,分别用sid将a表与b表和c表相关联,并且查询出

    学生的信息及课程分数

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

    1. SELECT * FROM
    2. (SELECT * FROM t_score WHERE cId = '01') AS a
    3. INNER JOIN (SELECT * FROM t_score WHERE cId = '02') AS b
    4. ON a.sId = b.sId;

    解题思路:首先将查询条件结果为cid=‘01’看做a表,再将查询结果为cid=‘02’的看做b表,并且用sid将这连个表连接起来

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

    1. SELECT * from
    2. (SELECT * from t_score where cid ='01') as a
    3. LEFT JOIN t_score AS b
    4. ON a.sId = b.sId AND b.cId = '02';

    解题思路:首先将查询结果为cid='01'的看做是a表,再将成绩表看作是b表,用sid将这两个表连接起来,同时添加一个b表中cid=‘02’的条件,代表着可能的意思

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

    1. select * from t_score where sid not in (
    2. SELECT sid FROM t_score WHERE cId = '01'
    3. )and cid = '02'

    解题思路:

    查询条件1:先查询出cid为'01'的sid,同时赋予条件cid=‘02’

    查询条件2:其次再查询所有不为查询条件1的学生信息

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

    1. SELECT a.sid,a.sname,b.c from
    2. t_student as a
    3. INNER JOIN (SELECT sid,AVG(score) AS c
    4. FROM t_score
    5. GROUP BY sid
    6. HAVING AVG(score) >= 60) AS b
    7. ON a.sid = b.sid;

    解题思路:1、首先将学生编号进行分组,再过滤出平均数大于60的学生编号

    同时将平均分取名为c,整个查询条件取名为b表

                           2、将学生表看做是a表,用sid将a,b表连接,在查询学生编号和学生姓名和平均成绩

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

    1. SELECT b.* from
    2. (SELECT sid from t_score GROUP BY sid) a
    3. LEFT JOIN t_student b
    4. on a.sid=b.sid

      解题思路:先将存在分数的学生编号在成绩表里进行分组,然后再将这部分学生编号与学生表里的学生编号进行比较

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

    1. SELECT a.sid,a.sname,b.zs,b.zcj
    2. FROM t_student AS a
    3. LEFT JOIN (SELECT sid,COUNT(cid) AS zs,SUM(score) AS zcj
    4. FROM t_score
    5. GROUP BY sid) AS b
    6. ON a.sid = b.sid;

     解题思路:先将总数与总成绩拿出来,将学生编号进行分组,然后将a表与b表用sid相连接,在查询条件就可以了

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

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

    解题思路:用like '李%'进行模糊查询出姓李的老师,然后再用Count(*)统计数量

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

    1. select * from t_student where sid in (
    2. select sid from t_score where cid =(
    3. select cid from t_course where tid =(
    4. select tid from t_teacher where tname ='张三'
    5. )
    6. )
    7. )

    解题思路:1、先查询出老师姓名为张三的老师编号

                      2、再查询出张三老师的课程编号

                       3、再通过该编号拿到对应课程的学生编号

                       4、再通过学生编号拿到所有的学生信息

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

    1. SELECT a.*,kc
    2. FROM t_student AS a
    3. INNER JOIN (SELECT sid,COUNT(cid) AS kc
    4.             FROM t_score
    5.             GROUP BY sid
    6.             HAVING kc < (SELECT COUNT(cid) FROM t_course)) AS b
    7. ON a.sid = b.sid;

     解题思路:1、先拿到学生的选修情况取别名为kc然后将学生编号进行分组

                      2、再过滤筛选出没有学全的学生编号看做为b表

                   3、将学生表看做a表用sid与b表相连接

    11)查询没学过"张三"老师讲授的任一门课程的学生姓名

    1. SELECT sname
    2. FROM t_student AS a
    3. WHERE sid NOT IN (SELECT sid
    4. FROM t_score AS a
    5. LEFT JOIN t_course AS b
    6. ON a.cid = b.cid
    7. INNER JOIN t_teacher AS c
    8. ON b.tid = c.tid
    9. WHERE tname = '张三');

    解题思路:

                      1、先查询出老师姓名为张三的老师编号

                      2、再查询出张三老师的课程编号

                       3、再通过该编号拿到对应课程的学生编号

                       4、在加条件not in 就是不存在的意思来拿到不在该条件下的学生编号,通过该编号就能拿到没有选修张三老师课程的学生姓名

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

    1. SELECT c.sid,d.sname,pjf
    2. FROM(SELECT a.sid,AVG(score) AS pjf
    3. FROM t_score AS a
    4. INNER JOIN(SELECT sid
    5. FROM t_score
    6. WHERE score < 60
    7. GROUP BY sid
    8. HAVING COUNT(cid) >= 2) AS b
    9. ON a.sid = b.sid
    10. GROUP BY a.sid) AS c
    11. LEFT JOIN t_student AS d
    12. ON c.sid = d.sid;

    解题思路:


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

    1. SELECT b.*,a.score
    2. FROM(SELECT sid,score
    3.      FROM t_score
    4.      WHERE cid = '01' AND score < 60) AS a
    5. LEFT JOIN t_student AS b
    6. ON a.sid = b.sid
    7. ORDER BY a.score desc;


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

    1. SELECT a.sid,a.cid,a.score,pjcj
    2. FROM(SELECT a.sid,b.cid,b.score
    3.      FROM t_student AS a
    4.      LEFT JOIN t_score AS b
    5.      ON a.sid = b.sid) AS a
    6. LEFT JOIN (SELECT sid,AVG(score) AS pjcj
    7.            FROM t_score
    8.            GROUP BY sid) AS b
    9. ON a.sid = b.sid
    10. ORDER BY b.pjcj DESC;

    解题思路:


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

    1. SELECT a.*,b.Cname
    2. FROM(SELECT 
    3.      cid,
    4.      COUNT(*)   AS 选修人数,
    5.      MAX(score) AS 最高分,
    6.      MIN(score) AS 最低分,
    7.      AVG(score) AS 平均分,
    8.      SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) / COUNT(*) AS 及格率,
    9.      SUM(CASE WHEN score >= 70 AND score < 80 THEN 1 ELSE 0 END) / COUNT(*) AS 中等率,
    10.      SUM(CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END) / COUNT(*) AS 优良率,
    11.      SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) / COUNT(*) AS 优秀率
    12.      FROM t_score
    13.      GROUP BY cid
    14.      ORDER BY COUNT(*) DESC,CId ASC) AS a
    15. LEFT JOIN t_course AS b
    16. ON a.cid = b.cid;

    解题思路:

  • 相关阅读:
    互联网摸鱼日报(2022-12-05)
    Java中操作字符串有哪些类?他们之间有什么区别?
    bpa软件视频教程,BPA是什么软件
    手机微信里面的文件打印步骤
    目标检测算法——3D公共数据集汇总 2(附下载链接)
    集简云平台助力无代码开发,实现平安银行与电商平台、CRM系统的快速连接
    Unity UGUI开发规范
    【C++】借助cout进行控制台文本输出的基本原理及复杂格式控制方法
    Python内置函数--iter()&next()
    进程地址空间
  • 原文地址:https://blog.csdn.net/m0_67477525/article/details/125575239