字符函数、数值函数、日期时间函数、聚集函数、判断函数、运算符号、排序、分组、过滤、分页、插入表记录、更新表记录、删除表记录

Top

NSD DBA DAY02

  1. 案例1:常用函数
  2. 案例2:查询结果处理
  3. 案例3:管理表记录

1 案例1:常用函数

1.1 问题

  1. 练习字符函数
  2. 练习数学函数
  3. 练习日期函数
  4. 练习聚集函数
  5. 练习数学计算
  6. 练习if函数
  7. 练习case函数

1.2 方案

函数:MySQL服务内置命令

 
  1. 语法:函数名(表头名)

select格式:

 
  1. SELECT 函数(表头名) FROM 库名.表名;
  2. SELECT 函数(表头名) FROM 库名.表名 WHERE 条件;

tarena库下的employees表 保存133个员工的信息如图-1,图-2

查看tarena库employees表的表头

图-1

查看tarena库employees表表记录

员工编号 姓名 入职日期 出生日期 电子邮箱 电话号码 部门编号

图-2

tarena库下的salary表 保存2015以后的工资信息如图-3,图-4

图-3

图-4

行号 发工资日期 员工编号 基本工资 奖金

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:练习字符函数(处理字符或字符类型的表头)

  1. //LENGTH(str)         返字符串长度,以字节为单位
  2. mysql> select name from tarena.user where name = "root" ;
  3. +------+
  4. | name |
  5. +------+
  6. | root |
  7. +------+
  8. 1 row in set (0.00 sec)
  9. mysql> select name , length(name) as 字节个数from tarena.user where name = "root" ;
  10. +------+--------------+
  11. | name | 字节个数 |
  12. +------+--------------+
  13. | root | 4 |
  14. +------+--------------+
  15. 1 row in set (0.00 sec)
  16. //一个汉字3个字节
  17. mysql> select name , length(name) from tarena.employees where employee_id = 3 ;
  18. +-----------+--------------+
  19. | name | length(name) |
  20. +-----------+--------------+
  21. | 李玉英 | 9 |
  22. +-----------+--------------+
  23. //CHAR_LENGTH(str)        返回字符串长度,以字符为单位
  24. mysql> select name from tarena.employees where employee_id = 3 ;
  25. +-----------+
  26. | name |
  27. +-----------+
  28. | 李玉英 |
  29. +-----------+
  30. 1 row in set (0.00 sec)
  31. mysql> select name , char_length(name) from tarena.employees where employee_id = 3 ;
  32. +-----------+-------------------+
  33. | name | char_length(name) |
  34. +-----------+-------------------+
  35. | 李玉英 | 3 |
  36. +-----------+-------------------+
  37. 1 row in set (0.00 sec)
  38. //UPPER(str)和UCASE(str) 将字符串中的字母全部转换成大写
  39. mysql> select name from tarena.user where uid <= 3 ;
  40. +--------+
  41. | name |
  42. +--------+
  43. | root |
  44. | bin |
  45. | daemon |
  46. | adm |
  47. +--------+
  48. 4 rows in set (0.00 sec)
  49. mysql> select upper(name) from tarena.user where uid <= 3 ;
  50. +-------------+
  51. | upper(name) |
  52. +-------------+
  53. | ROOT |
  54. | BIN |
  55. | DAEMON |
  56. | ADM |
  57. +-------------+
  58. 4 rows in set (0.00 sec)
  59. mysql> select ucase(name) from tarena.user where uid <= 3 ;
  60. +-------------+
  61. | ucase(name) |
  62. +-------------+
  63. | ROOT |
  64. | BIN |
  65. | DAEMON |
  66. | ADM |
  67. +-------------+
  68. 4 rows in set (0.00 sec)
  69. //LOWER(str)和LCASE(str)    将str中的字母全部转换成小写
  70. mysql> select lower("ABCD") ;
  71. +---------------+
  72. | lower("ABCD") |
  73. +---------------+
  74. | abcd |
  75. +---------------+
  76. 1 row in set (0.00 sec)
  77. mysql> select lcase("ABCD") ;
  78. +---------------+
  79. | lcase("ABCD") |
  80. +---------------+
  81. | abcd |
  82. +---------------+
  83. 1 row in set (0.00 sec)
  84. mysql>
  85. //SUBSTR(s, start,end)     从s的start位置开始取出到end长度的子串
  86. mysql> select name from tarena.employees where employee_id <= 3 ;
  87. +-----------+
  88. | name |
  89. +-----------+
  90. | 梁伟 |
  91. | 郭岩 |
  92. | 李玉英 |
  93. +-----------+
  94. 3 rows in set (0.00 sec)
  95. //不是输出员工的姓 只输出名字
  96. mysql> select substr(name,2,3) from tarena.employees where employee_id <= 3 ;
  97. +------------------+
  98. | substr(name,2,3) |
  99. +------------------+
  100. | 伟 |
  101. | 岩 |
  102. | 玉英 |
  103. +------------------+
  104. 3 rows in set (0.00 sec)
  105. //INSTR(str,str1)        返回str1参数,在str参数内的位置
  106. mysql> select name from tarena.user where uid <= 3 ;
  107. +--------+
  108. | name |
  109. +--------+
  110. | root |
  111. | bin |
  112. | daemon |
  113. | adm |
  114. +--------+
  115. 4 rows in set (0.00 sec)
  116. mysql> select instr(name,"a") from tarena.user where uid <= 3 ;
  117. +-----------------+
  118. | instr(name,"a") |
  119. +-----------------+
  120. | 0 |
  121. | 0 |
  122. | 2 |
  123. | 1 |
  124. +-----------------+
  125. 4 rows in set (0.00 sec)
  126. //查找名字里有英字及出现的位置
  127. mysql> select name , instr(name,"英") from tarena.employees;
  128. +-----------+-------------------+
  129. | name | instr(name,"英") |
  130. +-----------+-------------------+
  131. | 梁伟 | 0 |
  132. | 郭岩 | 0 |
  133. | 李玉英 | 3 |
  134. | 张健 | 0 |
  135. | 郑静 | 0 |
  136. | 牛建军 | 0 |
  137. | 刘斌 | 0 |
  138. | 汪云 | 0 |
  139. | 张建平 | 0 |
  140. | 郭娟 | 0 |
  141. | 郭兰英 | 3 |
  142. | 王英 | 2 |
  143. //TRIM(s)            返回字符串s删除了两边空格之后的字符串
  144. mysql> select trim(" ABC ");
  145. +-----------------+
  146. | trim(" ABC ") |
  147. +-----------------+
  148. | ABC |
  149. +-----------------+
  150. 1 row in set (0.00 sec)
  151. mysql>

步骤二:练习数学函数(处理数字或数值类型的表头)

命令操作如下所示:

 
  1. //ABS(x)    返回x的绝对值
  2. mysql> select abs(11);
  3. +---------+
  4. | abs(11) |
  5. +---------+
  6. | 11 |
  7. +---------+
  8. 1 row in set (0.00 sec)
  9. mysql> select abs(-11);
  10. +----------+
  11. | abs(-11) |
  12. +----------+
  13. | 11 |
  14. +----------+
  15. 1 row in set (0.00 sec)
  16. mysql>
  17. //PI()        返回圆周率π,默认显示6位小数
  18. mysql> select pi() ;
  19. +----------+
  20. | pi() |
  21. +----------+
  22. | 3.141593 |
  23. +----------+
  24. 1 row in set (0.00 sec)
  25. //MOD(x,y)    返回x被y除后的余数
  26. mysql> select mod(10,3);
  27. +-----------+
  28. | mod(10,3) |
  29. +-----------+
  30. | 1 |
  31. +-----------+
  32. 1 row in set (0.00 sec)
  33. //输出1-10之间的偶数uid号
  34. mysql> select name , uid from tarena.user where uid between 1 and 10 and mod(uid,2) = 0 ;
  35. +----------+------+
  36. | name | uid |
  37. +----------+------+
  38. | daemon | 2 |
  39. | lp | 4 |
  40. | shutdown | 6 |
  41. | mail | 8 |
  42. +----------+------+
  43. 4 rows in set (0.00 sec)
  44. //CEIL(x)、CEILING(x)    返回不小于x的最小整数 (x 是小数)
  45. mysql> select ceil(9.23);
  46. +------------+
  47. | ceil(9.23) |
  48. +------------+
  49. | 10 |
  50. +------------+
  51. 1 row in set (0.00 sec)
  52. mysql> select ceiling(9.23);
  53. +---------------+
  54. | ceiling(9.23) |
  55. +---------------+
  56. | 10 |
  57. +---------------+
  58. 1 row in set (0.00 sec)
  59. mysql>
  60. //FLOOR(x)            返回不大于x的最大整数 (x 是有小数的数字)
  61. mysql> select floor(9.23);
  62. +-------------+
  63. | floor(9.23) |
  64. +-------------+
  65. | 9 |
  66. +-------------+
  67. 1 row in set (0.00 sec)

步骤三:练习日期函数 (获取系统或指定的日期与时间)

 

图-5

命令操作如下所示:

 
  1. mysql> select curtime(); //获取系统时间
  2. +-----------+
  3. | curtime() |
  4. +-----------+
  5. | 17:42:20 |
  6. +-----------+
  7. 1 row in set (0.00 sec)
  8. mysql> select curdate();//获取系统日期
  9. +------------+
  10. | curdate() |
  11. +------------+
  12. | 2023-05-24 |
  13. +------------+
  14. 1 row in set (0.00 sec)
  15. mysql> select now() ;//获取系统日期+时间
  16. +---------------------+
  17. | now() |
  18. +---------------------+
  19. | 2023-05-24 17:42:29 |
  20. +---------------------+
  21. 1 row in set (0.00 sec)
  22. mysql> select year(now()) ; //获取系统当前年
  23. +-------------+
  24. | year(now()) |
  25. +-------------+
  26. | 2023 |
  27. +-------------+
  28. 1 row in set (0.00 sec)
  29. mysql> select month(now()) ; //获取系统当前月
  30. +--------------+
  31. | month(now()) |
  32. +--------------+
  33. | 5 |
  34. +--------------+
  35. 1 row in set (0.00 sec)
  36. mysql> select day(now()) ; //获取系统当前日
  37. +------------+
  38. | day(now()) |
  39. +------------+
  40. | 24 |
  41. +------------+
  42. 1 row in set (0.00 sec)
  43. mysql> select hour(now()) ; //获取系统当前小时
  44. +-------------+
  45. | hour(now()) |
  46. +-------------+
  47. | 17 |
  48. +-------------+
  49. 1 row in set (0.00 sec)
  50. mysql> select minute(now()) ; //获取系统当分钟
  51. +---------------+
  52. | minute(now()) |
  53. +---------------+
  54. | 46 |
  55. +---------------+
  56. 1 row in set (0.00 sec)
  57. mysql> select second(now()) ; //获取系统当前秒
  58. +---------------+
  59. | second(now()) |
  60. +---------------+
  61. | 34 |
  62. +---------------+
  63. 1 row in set (0.00 sec)
  64. mysql> select time(now()) ;//获取当前系统时间
  65. +-------------+
  66. | time(now()) |
  67. +-------------+
  68. | 17:47:36 |
  69. +-------------+
  70. 1 row in set (0.00 sec)
  71. mysql> select date(now()) ; //获取当前系统日期
  72. +-------------+
  73. | date(now()) |
  74. +-------------+
  75. | 2023-05-24 |
  76. +-------------+
  77. 1 row in set (0.00 sec)
  78. mysql> select curdate();//获取当前系统日志
  79. +------------+
  80. | curdate() |
  81. +------------+
  82. | 2023-05-24 |
  83. +------------+
  84. 1 row in set (0.00 sec)
  85. mysql> select dayofmonth(curdate());//获取一个月的第几天
  86. +-----------------------+
  87. | dayofmonth(curdate()) |
  88. +-----------------------+
  89. | 24 |
  90. +-----------------------+
  91. 1 row in set (0.00 sec)
  92. mysql> select dayofyear(curdate());//获取一年中的第几天
  93. +----------------------+
  94. | dayofyear(curdate()) |
  95. +----------------------+
  96. | 144 |
  97. +----------------------+
  98. 1 row in set (0.00 sec)
  99. mysql>
  100. mysql> select monthname(curdate());//获取月份名
  101. +----------------------+
  102. | monthname(curdate()) |
  103. +----------------------+
  104. | May |
  105. +----------------------+
  106. 1 row in set (0.00 sec)
  107. mysql> select dayname(curdate());//获取星期名
  108. +--------------------+
  109. | dayname(curdate()) |
  110. +--------------------+
  111. | Wednesday |
  112. +--------------------+
  113. 1 row in set (0.00 sec)
  114. mysql> select quarter(curdate());//获取一年中的第几季度
  115. +--------------------+
  116. | quarter(curdate()) |
  117. +--------------------+
  118. | 2 |
  119. +--------------------+
  120. 1 row in set (0.00 sec)
  121. mysql> select week(now());//一年中的第几周
  122. +-------------+
  123. | week(now()) |
  124. +-------------+
  125. | 21 |
  126. +-------------+
  127. 1 row in set (0.00 sec)
  128. mysql> select weekday(now());//一周中的周几
  129. +----------------+
  130. | weekday(now()) |
  131. +----------------+
  132. | 2 |
  133. +----------------+
  134. 1 row in set (0.00 sec)

步骤四:练习聚集函数(对数值类型表头下的数据做统计)

命令操作如下所示:

输出3号员工2018每个月的基本工资

 
  1. mysql> select basic from tarena.salary where employee_id=3 and year(date)=2018;
  2. +-------+
  3. | basic |
  4. +-------+
  5. | 9261 |
  6. | 9261 |
  7. | 9261 |
  8. | 9261 |
  9. | 9261 |
  10. | 9261 |
  11. | 9261 |
  12. | 9261 |
  13. | 9261 |
  14. | 9261 |
  15. | 9261 |
  16. | 9724 |
  17. +-------+
  18. 12 rows in set (0.00 sec)

sum(表头名) 求和

 
  1. mysql> select sum(basic) from tarena.salary where employee_id=3 and year(date)=2018;
  2. +------------+
  3. | sum(basic) |
  4. +------------+
  5. | 111595 |
  6. +------------+
  7. 1 row in set (0.00 sec)

avg(表头名) 计算平均值

 
  1. mysql> select avg(basic) from tarena.salary where employee_id=3 and year(date)=2018;
  2. +------------+
  3. | avg(basic) |
  4. +------------+
  5. | 9299.5833 |
  6. +------------+
  7. 1 row in set (0.00 sec)

min(表头名) 获取最小值

 
  1. mysql> select min(basic) from tarena.salary where employee_id=3 and year(date)=2018;
  2. +------------+
  3. | min(basic) |
  4. +------------+
  5. | 9261 |
  6. +------------+
  7. 1 row in set (0.00 sec)

max(表头名) 获取最大值

 
  1. mysql> select max(basic) from tarena.salary where employee_id=3 and year(date)=2018;
  2. +------------+
  3. | max(basic) |
  4. +------------+
  5. | 9724 |
  6. +------------+
  7. 1 row in set (0.00 sec)

count(表头名) 统计表头值个数

 
  1. //输出3号员工2018年奖金小于3000的奖金
  2. mysql> select bonus from tarena.salary where employee_id=3 and year(date)=2018 and bonus<3000;
  3. +-------+
  4. | bonus |
  5. +-------+
  6. | 1000 |
  7. | 1000 |
  8. | 1000 |
  9. +-------+
  10. 3 rows in set (0.00 sec)
  11. //统计3号员工2018年奖金小于3000的次数
  12. mysql> select count(bonus) from tarena.salary where employee_id=3 and year(date)=2018 and bonus<3000;
  13. +--------------+
  14. | count(bonus) |
  15. +--------------+
  16. | 3 |
  17. +--------------+
  18. 1 row in set (0.01 sec)

步骤五:练习数学计算 对行中的列做计算

 

图-6

命令操作如下所示:

输出8号员工2019年1月10 工资总和

 
  1. mysql> select employee_id ,date , basic + bonus as 总工资 from tarena.salary
  2. where employee_id = 8 and date=20190110;
  3. +-------------+------------+----------------+
  4. | employee_id | date | 总工资 |
  5. +-------------+------------+----------------+
  6. | 8 | 2019-01-10 | 24093 |
  7. +-------------+------------+----------------+

输出8号员工的名字和年龄

 
  1. mysql> select name , 2022 - year(birth_date) as 年龄 from tarena.employees
  2. where employee_id = 8 ;
  3. +--------+--------+
  4. | name | 年龄 |
  5. +--------+--------+
  6. | 汪云 | 29 |
  7. +--------+--------+

查看8号员工2019年1月10 基本工资翻3倍的 值

 
  1. mysql> select employee_id , basic , basic * 3 as 工资翻三倍 from tarena.salary
  2. where employee_id=8 and date=20190110;
  3. +-------------+-------+-----------------+
  4. | employee_id | basic | 工资翻三倍 |
  5. +-------------+-------+-----------------+
  6. | 8 | 23093 | 69279 |
  7. +-------------+-------+-----------------+
  8. 1 row in set (0.00 sec)

查看8号员工2019年1月10的平均工资

 
  1. mysql> select employee_id , (basic+bonus)/2 as 平均工资 from tarena.salary where employee_id=8 and date=20190110 ;
  2. +-------------+--------------+
  3. | employee_id | 平均工资 |
  4. +-------------+--------------+
  5. | 8 | 12046.5000 |
  6. +-------------+--------------+
  7. 1 row in set (0.01 sec)

输出员工编号1-10之间偶数员工编号及对应的员工名

 
  1. mysql> select employee_id , name from tarena.employees
  2. where employee_id between 1 and 10 and employee_id % 2 = 0 ;
  3. +-------------+-----------+
  4. | employee_id | name |
  5. +-------------+-----------+
  6. | 2 | 郭岩 |
  7. | 4 | 张健 |
  8. | 6 | 牛建军 |
  9. | 8 | 汪云 |
  10. | 10 | 郭娟 |
  11. +-------------+-----------+
  12. 5 rows in set (0.00 sec)

步骤六:练习if函数

if(条件,v1,v2) 如果条件是TRUE则返回v1,否则返回v2

ifnull(v1,v2) 如果v1不为NULL,则返回v1,否则返回v2

演示if() 语句的执行过程

 
  1. mysql> select if(1 = 2 , "a","b");
  2. +---------------------+
  3. | if(1 = 2 , "a","b") |
  4. +---------------------+
  5. | b |
  6. +---------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> select if( 1 = 1 , "a","b");
  9. +---------------------+
  10. | if(1 = 1 , "a","b") |
  11. +---------------------+
  12. | a |
  13. +---------------------+
  14. 1 row in set (0.00 sec)
  15. mysql>

演示ifnull() 语句的执行过程

 
  1. mysql> select ifnull("abc","xxx");
  2. +---------------------+
  3. | ifnull("abc","xxx") |
  4. +---------------------+
  5. | abc |
  6. +---------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> select ifnull(null,"xxx");
  9. +--------------------+
  10. | ifnull(null,"xxx") |
  11. +--------------------+
  12. | xxx |
  13. +--------------------+
  14. 1 row in set (0.00 sec)
  15. mysql>

查询例子

根据uid 号 输出用户类型

 
  1. mysql> select name , uid ,
  2. #cold_boldif(uid < 1000 , "系统用户","创建用户") as 用户类型 from tarena.user;
  3. +-----------------+-------+--------------+
  4. | name | uid | 用户类型 |
  5. +-----------------+-------+--------------+
  6. | root | 0 | 系统用户 |
  7. | bin | 1 | 系统用户 |
  8. | daemon | 2 | 系统用户 |
  9. | adm | 3 | 系统用户 |
  10. | lp | 4 | 系统用户 |
  11. | sync | 5 | 系统用户 |
  12. | shutdown | 6 | 系统用户 |
  13. | halt | 7 | 系统用户 |
  14. | mail | 8 | 系统用户 |
  15. | operator | 11 | 系统用户 |
  16. | games | 12 | 系统用户 |
  17. | ftp | 14 | 系统用户 |
  18. | nobody | 99 | 系统用户 |
  19. | systemd-network | 192 | 系统用户 |
  20. | dbus | 81 | 系统用户 |
  21. | polkitd | 999 | 系统用户 |
  22. | sshd | 74 | 系统用户 |
  23. | postfix | 89 | 系统用户 |
  24. | chrony | 998 | 系统用户 |
  25. | rpc | 32 | 系统用户 |
  26. | rpcuser | 29 | 系统用户 |
  27. | nfsnobody | 65534 | 创建用户 |
  28. | haproxy | 188 | 系统用户 |
  29. | plj | 1000 | 创建用户 |
  30. | apache | 48 | 系统用户 |
  31. | mysql | 27 | 系统用户 |
  32. | bob | NULL | 创建用户 |
  33. +-----------------+-------+--------------+
  34. 27 rows in set (0.00 sec)

根据shell 输出用户类型

 
  1. mysql> select name , shell ,
  2. #cold_boldif(shell = "/bin/bash" , "交互用户","非交户用户") as 用户类型 from tarena.user;
  3. +-----------------+----------------+-----------------+
  4. | name | shell | 用户类型 |
  5. +-----------------+----------------+-----------------+
  6. | root | /bin/bash | 交互用户 |
  7. | bin | /sbin/nologin | 非交户用户 |
  8. | daemon | /sbin/nologin | 非交户用户 |
  9. | adm | /sbin/nologin | 非交户用户 |
  10. | lp | /sbin/nologin | 非交户用户 |
  11. | sync | /bin/sync | 非交户用户 |
  12. | shutdown | /sbin/shutdown | 非交户用户 |
  13. | halt | /sbin/halt | 非交户用户 |
  14. | mail | /sbin/nologin | 非交户用户 |
  15. | operator | /sbin/nologin | 非交户用户 |
  16. | games | /sbin/nologin | 非交户用户 |
  17. | ftp | /sbin/nologin | 非交户用户 |
  18. | nobody | /sbin/nologin | 非交户用户 |
  19. | systemd-network | /sbin/nologin | 非交户用户 |
  20. | dbus | /sbin/nologin | 非交户用户 |
  21. | polkitd | /sbin/nologin | 非交户用户 |
  22. | sshd | /sbin/nologin | 非交户用户 |
  23. | postfix | /sbin/nologin | 非交户用户 |
  24. | chrony | /sbin/nologin | 非交户用户 |
  25. | rpc | /sbin/nologin | 非交户用户 |
  26. | rpcuser | /sbin/nologin | 非交户用户 |
  27. | nfsnobody | /sbin/nologin | 非交户用户 |
  28. | haproxy | /sbin/nologin | 非交户用户 |
  29. | plj | /bin/bash | 交互用户 |
  30. | apache | /sbin/nologin | 非交户用户 |
  31. | mysql | /bin/false | 非交户用户 |
  32. | bob | NULL | 非交户用户 |
  33. +-----------------+----------------+-----------------+
  34. 27 rows in set (0.00 sec)

插入没有家目录的用户

 
  1. mysql> insert into tarena.user (name, homedir) values ("jerrya",null);

查看时加判断

 
  1. mysql> select name 姓名, ifnull(homedir,"NO home")as 家目录 from tarena.user;
  2. +-----------------+--------------------+
  3. | 姓名 | 家目录 |
  4. +-----------------+--------------------+
  5. | root | /root |
  6. | bin | /bin |
  7. | daemon | /sbin |
  8. | adm | /var/adm |
  9. | lp | /var/spool/lpd |
  10. | sync | /sbin |
  11. | shutdown | /sbin |
  12. | halt | /sbin |
  13. | mail | /var/spool/mail |
  14. | operator | /root |
  15. | games | /usr/games |
  16. | ftp | /var/ftp |
  17. | nobody | / |
  18. | systemd-network | / |
  19. | dbus | / |
  20. | polkitd | / |
  21. | sshd | /var/empty/sshd |
  22. | postfix | /var/spool/postfix |
  23. | chrony | /var/lib/chrony |
  24. | rpc | /var/lib/rpcbind |
  25. | rpcuser | /var/lib/nfs |
  26. | nfsnobody | /var/lib/nfs |
  27. | haproxy | /var/lib/haproxy |
  28. | plj | /home/plj |
  29. | apache | /usr/share/httpd |
  30. | mysql | /var/lib/mysql |
  31. | bob | NO home |
  32. | jerrya | NO home |
  33. +-----------------+--------------------+
  34. 28 rows in set (0.00 sec)
  35. Mysql>

步骤七:练习case函数

命令格式

 
  1. CASE 表头名
  2. WHEN 值1 THEN 输出结果
  3. WHEN 值2 THEN 输出结果
  4. WHEN 值3 THEN 输出结果
  5. ELSE 输出结果
  6. END
  7. CASE
  8. WHEN 判断条件1 THEN 输出结果
  9. WHEN 判断条件2 THEN 输出结果
  10. WHEN 判断条件3 THEN 输出结果
  11. ELSE 输出结果
  12. END

如果表头名等于某个值,则返回对应位置then后面的值并结束判断,

如果与所有值都不相等,则返回else后面的结果并结束判断

命令操作如下所示:

查看部门表(departments)所有行

 
  1. mysql> select * from tarena.departments;
  2. +---------+-----------+
  3. | dept_id | dept_name |
  4. +---------+-----------+
  5. | 1 | 人事部 |
  6. | 2 | 财务部 |
  7. | 3 | 运维部 |
  8. | 4 | 开发部 |
  9. | 5 | 测试部 |
  10. | 6 | 市场部 |
  11. | 7 | 销售部 |
  12. | 8 | 法务部 |
  13. +---------+-----------+
  14. 8 rows in set (0.03 sec)
  15. //输出部门类型
  16. select dept_id, dept_name,
  17. case dept_name
  18. when '运维部' then '技术部门'
  19. when '开发部' then '技术部门'
  20. when '测试部' then '技术部门'
  21. else '非技术部门'
  22. end as 部门类型 from tarena.departments;
  23. +---------+-----------+-----------------+
  24. | dept_id | dept_name | 部门类型 |
  25. +---------+-----------+-----------------+
  26. | 1 | 人事部 | 非技术部门 |
  27. | 2 | 财务部 | 非技术部门 |
  28. | 3 | 运维部 | 技术部门 |
  29. | 4 | 开发部 | 技术部门 |
  30. | 5 | 测试部 | 技术部门 |
  31. | 6 | 市场部 | 非技术部门 |
  32. | 7 | 销售部 | 非技术部门 |
  33. | 8 | 法务部 | 非技术部门 |
  34. +---------+-----------+-----------------+
  35. 8 rows in set (0.00 sec)
  36. mysql> select dept_id,dept_name,
  37. -> case
  38. -> when dept_name="运维部" then "技术部"
  39. -> when dept_name="开发部" then "技术部"
  40. -> when dept_name="测试部" then "技术部"
  41. -> else "非技术部"
  42. -> end as 部门类型 from tarena.departments;
  43. +---------+-----------+--------------+
  44. | dept_id | dept_name | 部门类型 |
  45. +---------+-----------+--------------+
  46. | 1 | 人事部 | 非技术部 |
  47. | 2 | 财务部 | 非技术部 |
  48. | 3 | 运维部 | 技术部 |
  49. | 4 | 开发部 | 技术部 |
  50. | 5 | 测试部 | 技术部 |
  51. | 6 | 市场部 | 非技术部 |
  52. | 7 | 销售部 | 非技术部 |
  53. | 8 | 法务部 | 非技术部 |
  54. +---------+-----------+--------------+
  55. 8 rows in set (0.00 sec)
  56. mysql> select dept_id,dept_name,
  57. -> case
  58. -> when dept_name in ("运维部","开发部","测试部") then "技术部"
  59. -> else "非技术部"
  60. -> end as 部门类型 from tarena.departments;
  61. +---------+-----------+--------------+
  62. | dept_id | dept_name | 部门类型 |
  63. +---------+-----------+--------------+
  64. | 1 | 人事部 | 非技术部 |
  65. | 2 | 财务部 | 非技术部 |
  66. | 3 | 运维部 | 技术部 |
  67. | 4 | 开发部 | 技术部 |
  68. | 5 | 测试部 | 技术部 |
  69. | 6 | 市场部 | 非技术部 |
  70. | 7 | 销售部 | 非技术部 |
  71. | 8 | 法务部 | 非技术部 |
  72. +---------+-----------+--------------+
  73. 8 rows in set (0.00 sec)

2 案例2:查询结果处理

2.1 问题

  1. 分组练习
  2. 排序练习
  3. 过滤练习
  4. 分页练习

2.2 方案

使用tarena库下的表完成练习

对select语句查找到的数据再做处理,语法格式

SELECT 表头名 FROM 库名.表名 [WHERE条件] 分组 | 排序 | 过滤 | 分页;

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:分组练习

命令操作如下所示:

输出符合条件的shell 和 name

 
  1. mysql> select shell , name from tarena.user where shell in ("/bin/bash","/sbin/nologin");
  2. +---------------+-----------------+
  3. | shell | name |
  4. +---------------+-----------------+
  5. | /bin/bash | root |
  6. | /sbin/nologin | bin |
  7. | /sbin/nologin | daemon |
  8. | /sbin/nologin | adm |
  9. | /sbin/nologin | lp |
  10. | /sbin/nologin | mail |
  11. | /sbin/nologin | operator |
  12. | /sbin/nologin | games |
  13. | /sbin/nologin | ftp |
  14. | /sbin/nologin | nobody |
  15. | /sbin/nologin | systemd-network |
  16. | /sbin/nologin | dbus |
  17. | /sbin/nologin | polkitd |
  18. | /sbin/nologin | sshd |
  19. | /sbin/nologin | postfix |
  20. | /sbin/nologin | chrony |
  21. | /sbin/nologin | rpc |
  22. | /sbin/nologin | rpcuser |
  23. | /sbin/nologin | nfsnobody |
  24. | /sbin/nologin | haproxy |
  25. | /bin/bash | plj |
  26. | /sbin/nologin | apache |
  27. +---------------+-----------------+
  28. 22 rows in set (0.00 sec)

统计每种解释器用户的个数 (按照shell表头值分组统计name表头值个数)

 
  1. mysql> select shell as 解释器 , count(name) as 总人数 from tarena.user where shell in ("/bin/bash","/sbin/nologin") group by shell;
  2. +---------------+-----------+
  3. | 解释器 | 总人数 |
  4. +---------------+-----------+
  5. | /bin/bash | 2 |
  6. | /sbin/nologin | 20 |
  7. +---------------+-----------+
  8. 2 rows in set (0.00 sec)

统计每个部门的总人数 (按照部门表头分组统计name表头值的个数)

 
  1. mysql> select dept_id , count(name) from tarena.employees group by dept_id ;
  2. +---------+-------------+
  3. | dept_id | count(name) |
  4. +---------+-------------+
  5. | 1 | 8 |
  6. | 2 | 5 |
  7. | 3 | 6 |
  8. | 4 | 55 |
  9. | 5 | 12 |
  10. | 6 | 9 |
  11. | 7 | 35 |
  12. | 8 | 3 |
  13. +---------+-------------+
  14. 8 rows in set (0.00 sec)

步骤二: 排序练习

命令操作如下所示:

查看满足条件记录的name和uid 字段的值

 
  1. mysql> select name , uid from tarena.user where uid is not null and uid between 100 and 1000 ;
  2. +-----------------+------+
  3. | name | uid |
  4. +-----------------+------+
  5. | systemd-network | 192 |
  6. | polkitd | 999 |
  7. | chrony | 998 |
  8. | haproxy | 188 |
  9. | plj | 1000 |
  10. +-----------------+------+
  11. 5 rows in set (0.00 sec)

按照uid升序排序

 
  1. mysql> select name , uid from tarena.user where uid is not null and uid between 100 and 1000 order by uid asc;
  2. +-----------------+------+
  3. | name | uid |
  4. +-----------------+------+
  5. | haproxy | 188 |
  6. | systemd-network | 192 |
  7. | chrony | 998 |
  8. | polkitd | 999 |
  9. | plj | 1000 |
  10. +-----------------+------+
  11. 5 rows in set (0.00 sec)

按照uid降序排序

 
  1. mysql> select name , uid from tarena.user where uid is not null and uid between 100 and 1000 order by uid desc;
  2. +-----------------+------+
  3. | name | uid |
  4. +-----------------+------+
  5. | plj | 1000 |
  6. | polkitd | 999 |
  7. | chrony | 998 |
  8. | systemd-network | 192 |
  9. | haproxy | 188 |
  10. +-----------------+------+
  11. 5 rows in set (0.00 sec)

查看2015年1月10号员工编号小于10的工资总额

 
  1. mysql> select employee_id , date , basic , bonus , basic+bonus as total from tarena.salary where date=20150110 and employee_id <= 10;
  2. +-------------+------------+-------+-------+-------+
  3. | employee_id | date | basic | bonus | total |
  4. +-------------+------------+-------+-------+-------+
  5. | 2 | 2015-01-10 | 17000 | 10000 | 27000 |
  6. | 3 | 2015-01-10 | 8000 | 2000 | 10000 |
  7. | 4 | 2015-01-10 | 14000 | 9000 | 23000 |
  8. | 6 | 2015-01-10 | 14000 | 10000 | 24000 |
  9. | 7 | 2015-01-10 | 19000 | 10000 | 29000 |
  10. +-------------+------------+-------+-------+-------+
  11. 5 rows in set (0.00 sec)

以工资总额升序排 ,总额相同按照员工编号升序排

 
  1. mysql> select employee_id , basic+bonus as total from tarena.salary where date=20150110 and employee_id <= 10 order by total asc ,employee_id asc;
  2. +-------------+-------+
  3. | employee_id | total |
  4. +-------------+-------+
  5. | 3 | 10000 |
  6. | 4 | 23000 |
  7. | 6 | 24000 |
  8. | 2 | 27000 |
  9. | 7 | 29000 |
  10. +-------------+-------+
  11. 5 rows in set (0.00 sec)

步骤三:过滤练习

在查找到的数据里 过滤符合条件的数据。

 
  1. select 表头名 from 库.表 where 筛选条件 having 筛选条件;

命令操作如下所示:

查找部门总人数少于10人的部门名称及人数

 
  1. //第一步,查看所有员工的部门名称
  2. select dept_id , name from tarena.employees;
  3. //第二步,按部门编号分组 统计人名个数
  4. mysql> select dept_id , count(name) as numbers from tarena.employees group by dept_id;
  5. +---------+---------+
  6. | dept_id | numbers |
  7. +---------+---------+
  8. | 1 | 8 |
  9. | 2 | 5 |
  10. | 3 | 6 |
  11. | 4 | 55 |
  12. | 5 | 12 |
  13. | 6 | 9 |
  14. | 7 | 35 |
  15. | 8 | 3 |
  16. +---------+---------+
  17. 8 rows in set (0.00 sec)
  18. //第三步,查找部门人数少于10人的部门名称及人数
  19. mysql> select dept_id , count(name) as numbers from tarena.employees group by dept_id having numbers < 10;
  20. +---------+---------+
  21. | dept_id | numbers |
  22. +---------+---------+
  23. | 1 | 8 |
  24. | 2 | 5 |
  25. | 3 | 6 |
  26. | 6 | 9 |
  27. | 8 | 3 |
  28. +---------+---------+
  29. 5 rows in set (0.00 sec)

步骤四:分页练习

分析:

作用:限制查询结果显示行数(默认显示全部查询结果)

使用SELECT查询时,如果结果集数据量很大,比如1万行数据,放在一个页面显示的话数据量太大,可以分100次显示 每次只显示100行。

语法:

 
  1. SELECT语句 LIMIT 数字;            //显示查询结果前多少条记录
  2. SELECT语句 LIMIT 数字1,数字2;    //显示指定范围内的查询记录
  3. 数字1 表示起始行 (0表示第1行) 数字2表示总行数

例如:

 
  1. limit 1 ; 显示查询结果的第1行
  2. limit 3 ; 显示查询结果的前3行
  3. limit 10 ; 显示查询结果的前10行
  4. limit 0,1 ;      从查询结果的第1行开始显示,共显示1行
  5. limit 3,5 ; 从查询结果的第4行开始显示,共显示5行
  6. limit 10,10; 从查询结果的第11行开始显示,共显示10行

命令操作如下所示:

查看有解释器的用户信息

 
  1. mysql> select * from tarena.user where shell is not null ;

只显示查询结果的第1行

 
  1. mysql> select * from tarena.user where shell is not null limit 1;

只显示查询结果的前3行

 
  1. mysql> select * from tarena.user where shell is not null limit 3;

仅仅显示查询结果的第1行 到 第3 (0 表示查询结果的第1行)

 
  1. mysql> select * from user where shell is not null limit 0,3;

从查询结果的第4行开始显示,共显示3行

 
  1. mysql> select name,uid , gid , shell from user where shell is not null limit 3,3;

查看uid 号最大的用户名和UID

 
  1. mysql> select name , uid from tarena.user order by uid desc limit 1 ;
  2. +-----------+-------+
  3. | name | uid |
  4. +-----------+-------+
  5. | nfsnobody | 65534 |
  6. +-----------+-------+
  7. 1 row in set (0.00 sec)

3 案例3:管理表记录

3.1 问题

  1. 练习插入表记录
  2. 练习修改表记录
  3. 练习删除表记录

3.2 方案

使用tarena库下的user表完成表记录管理的练习。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:练习插入表记录

命令操作如下所示:

查看表头

 
  1. mysql> desc tarena.user;
  2. +----------+-------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +----------+-------------+------+-----+---------+----------------+
  5. | id | int | NO | PRI | NULL | auto_increment |
  6. | name | char(20) | YES | | NULL | |
  7. | password | char(1) | YES | | NULL | |
  8. | uid | int | YES | | NULL | |
  9. | gid | int | YES | | NULL | |
  10. | comment | varchar(50) | YES | | NULL | |
  11. | homedir | varchar(80) | YES | | NULL | |
  12. | shell | char(30) | YES | | NULL | |
  13. +----------+-------------+------+-----+---------+----------------+
  14. 8 rows in set (0.00 sec)

插入1条记录给所有表头赋值

(给所有表头赋值表头可以省略不写)id表头的值不能重复,主键的知识在后边课程里讲

 
  1. mysql> insert into tarena.user values(40,"jingyaya","x",1001,1001,"teacher","/home/jingyaya","/bin/bash");
  2. Query OK, 1 row affected (0.05 sec)

查看表记录

 
  1. mysql> select * from tarena.user where name="jingyaya";
  2. +----+----------+----------+------+------+---------+----------------+-----------+
  3. | id | name | password | uid | gid | comment | homedir | shell |
  4. +----+----------+----------+------+------+---------+----------------+-----------+
  5. | 40 | jingyaya | x | 1001 | 1001 | teacher | /home/jingyaya | /bin/bash |
  6. +----+----------+----------+------+------+---------+----------------+-----------+
  7. 1 row in set (0.00 sec)
  8. mysql>

插入多行记录给所有列赋值

 
  1. insert into tarena.user values
  2. (41,"jingyaya2","x",1002,1002,"teacher","/home/jingyaya2","/bin/bash"),
  3. (42,"jingyaya3","x",1003,1003,"teacher","/home/jingyaya3","/bin/bash");

插入1行给指定列赋值,必须写列名,没赋值的列 没有数据 后通过设置的默认值赋值

 
  1. mysql> insert into tarena.user(name,uid,shell)values("benben",1002,"/sbin/nologin");

插入多行给指定列赋值,必须写列名,没赋值的列 没有数据 后通过设置的默认值赋值

 
  1. mysql> insert into tarena.user(name,uid,shell)values("benben2",1002,"/sbin/nologin"),("benben3",1003,"/sbin/nologin");

查看记录

 
  1. mysql> select * from tarena.user where name like "benben%";
  2. +----+---------+----------+------+------+---------+---------+---------------+
  3. | id | name | password | uid | gid | comment | homedir | shell |
  4. +----+---------+----------+------+------+---------+---------+---------------+
  5. | 41 | benben | NULL | 1002 | NULL | NULL | NULL | /sbin/nologin |
  6. | 42 | benben2 | NULL | 1002 | NULL | NULL | NULL | /sbin/nologin |
  7. | 43 | benben3 | NULL | 1003 | NULL | NULL | NULL | /sbin/nologin |
  8. +----+---------+----------+------+------+---------+---------+---------------+
  9. 3 rows in set (0.00 sec)

使用select查询结果赋值(查询表头个数和 插入记录命令表头个数要一致)

 
  1. mysql> select user from mysql.user;
  2. +------------------+
  3. | user |
  4. +------------------+
  5. | mysql.infoschema |
  6. | mysql.session |
  7. | mysql.sys |
  8. | root |
  9. +------------------+
  10. 4 rows in set (0.00 sec)
  11. mysql> insert into tarena.user(name) (select user from mysql.user);
  12. Query OK, 4 rows affected (0.09 sec)
  13. Records: 4 Duplicates: 0 Warnings: 0

查看插入后的数据

 
  1. mysql> select * from tarena.user where name like "mysql%" or name="root";
  2. +----+------------------+----------+------+------+--------------+----------------+------------+
  3. | id | name | password | uid | gid | comment | homedir | shell |
  4. +----+------------------+----------+------+------+--------------+----------------+------------+
  5. | 1 | root | x | 0 | 0 | root | /root | /bin/bash |
  6. | 26 | mysql | x | 27 | 27 | MySQL Server | /var/lib/mysql | /bin/false |
  7. | 44 | mysql.infoschema | NULL | NULL | NULL | NULL | NULL | NULL |
  8. | 45 | mysql.session | NULL | NULL | NULL | NULL | NULL | NULL |
  9. | 46 | mysql.sys | NULL | NULL | NULL | NULL | NULL | NULL |
  10. | 47 | root | NULL | NULL | NULL | NULL | NULL | NULL |
  11. +----+------------------+----------+------+------+--------------+----------------+------------+
  12. 6 rows in set (0.00 sec)

使用set命令赋值

 
  1. mysql> insert into tarena.user set name="yaya" , uid=99 , gid=99 ;
  2. Query OK, 1 row affected (0.06 sec)
  3. mysql> select * from tarena.user where name="yaya";
  4. +----+------+----------+------+------+---------+---------+-------+
  5. | id | name | password | uid | gid | comment | homedir | shell |
  6. +----+------+----------+------+------+---------+---------+-------+
  7. | 28 | yaya | NULL | 99 | 99 | NULL | NULL | NULL |
  8. +----+------+----------+------+------+---------+---------+-------+
  9. 1 row in set (0.00 sec)

步骤二:练习修改表记录

命令操作如下所示:

 
  1. //修改前查看
  2. mysql> select name , comment from tarena.user where id <= 10 ;
  3. +----------+----------+
  4. | name | comment |
  5. +----------+----------+
  6. | root | root |
  7. | bin | bin |
  8. | daemon | daemon |
  9. | adm | adm |
  10. | lp | lp |
  11. | sync | sync |
  12. | shutdown | shutdown |
  13. | halt | halt |
  14. | mail | mail |
  15. | operator | operator |
  16. +----------+----------+
  17. 10 rows in set (0.00 sec)
  18. //修改符合条件
  19. mysql> update tarena.user set comment=NULL where id <= 10 ;
  20. Query OK, 10 rows affected (0.09 sec)
  21. Rows matched: 10 Changed: 10 Warnings: 0
  22. //修改后查看
  23. mysql> select name , comment from tarena.user where id <= 10 ;
  24. +----------+---------+
  25. | name | comment |
  26. +----------+---------+
  27. | root | NULL |
  28. | bin | NULL |
  29. | daemon | NULL |
  30. | adm | NULL |
  31. | lp | NULL |
  32. | sync | NULL |
  33. | shutdown | NULL |
  34. | halt | NULL |
  35. | mail | NULL |
  36. | operator | NULL |
  37. +----------+---------+
  38. 10 rows in set (0.00 sec) [root@localhost ~]#
  39. //修改前查看
  40. mysql> select name , homedir from tarena.user;
  41. +------------------+--------------------+
  42. | name | homedir |
  43. +------------------+--------------------+
  44. | root | /root |
  45. | bin | /bin |
  46. | daemon | /sbin |
  47. | adm | /var/adm |
  48. | lp | /var/spool/lpd |
  49. | sync | /sbin |
  50. | shutdown | /sbin |
  51. | halt | /sbin |
  52. | mail | /var/spool/mail |
  53. | operator | /root |
  54. | games | /usr/games |
  55. | ftp | /var/ftp |
  56. | nobody | / |
  57. | systemd-network | / |
  58. | dbus | / |
  59. | polkitd | / |
  60. | sshd | /var/empty/sshd |
  61. | postfix | /var/spool/postfix |
  62. | chrony | /var/lib/chrony |
  63. | rpc | /var/lib/rpcbind |
  64. | rpcuser | /var/lib/nfs |
  65. | nfsnobody | /var/lib/nfs |
  66. | haproxy | /var/lib/haproxy |
  67. | plj | /home/plj |
  68. | apache | /usr/share/httpd |
  69. | mysql | /var/lib/mysql |
  70. | bob | NULL |
  71. | jerrya | NULL |
  72. | jingyaya | /home/jingyaya |
  73. | benben | NULL |
  74. | benben2 | NULL |
  75. | benben3 | NULL |
  76. | mysql.infoschema | NULL |
  77. | mysql.session | NULL |
  78. | mysql.sys | NULL |
  79. | root | NULL |
  80. +------------------+--------------------+
  81. 36 rows in set (0.00 sec)
  82. //不加条件批量修改
  83. mysql> update tarena.user set homedir="/student" ;
  84. Query OK, 36 rows affected (0.09 sec)
  85. Rows matched: 36 Changed: 36 Warnings: 0
  86. //修改后查看
  87. mysql> select name , homedir from tarena.user;
  88. +------------------+----------+
  89. | name | homedir |
  90. +------------------+----------+
  91. | root | /student |
  92. | bin | /student |
  93. | daemon | /student |
  94. | adm | /student |
  95. | lp | /student |
  96. | sync | /student |
  97. | shutdown | /student |
  98. | halt | /student |
  99. | mail | /student |
  100. | operator | /student |
  101. | games | /student |
  102. | ftp | /student |
  103. | nobody | /student |
  104. | systemd-network | /student |
  105. | dbus | /student |
  106. | polkitd | /student |
  107. | sshd | /student |
  108. | postfix | /student |
  109. | chrony | /student |
  110. | rpc | /student |
  111. | rpcuser | /student |
  112. | nfsnobody | /student |
  113. | haproxy | /student |
  114. | plj | /student |
  115. | apache | /student |
  116. | mysql | /student |
  117. | bob | /student |
  118. | jerrya | /student |
  119. | jingyaya | /student |
  120. | benben | /student |
  121. | benben2 | /student |
  122. | benben3 | /student |
  123. | mysql.infoschema | /student |
  124. | mysql.session | /student |
  125. | mysql.sys | /student |
  126. | root | /student |
  127. +------------------+----------+
  128. 36 rows in set (0.00 sec)

步骤三:练习删除表记录

命令操作如下所示:

 
  1. //删除前查看
  2. mysql> select * from tarena.user where id <= 10 ;
  3. +----+----------+----------+------+------+---------+----------+----------------+
  4. | id | name | password | uid | gid | comment | homedir | shell |
  5. +----+----------+----------+------+------+---------+----------+----------------+
  6. | 1 | root | x | 0 | 0 | NULL | /student | /bin/bash |
  7. | 2 | bin | x | 1 | 1 | NULL | /student | /sbin/nologin |
  8. | 3 | daemon | x | 2 | 2 | NULL | /student | /sbin/nologin |
  9. | 4 | adm | x | 3 | 4 | NULL | /student | /sbin/nologin |
  10. | 5 | lp | x | 4 | 7 | NULL | /student | /sbin/nologin |
  11. | 6 | sync | x | 5 | 0 | NULL | /student | /bin/sync |
  12. | 7 | shutdown | x | 6 | 0 | NULL | /student | /sbin/shutdown |
  13. | 8 | halt | x | 7 | 0 | NULL | /student | /sbin/halt |
  14. | 9 | mail | x | 8 | 12 | NULL | /student | /sbin/nologin |
  15. | 10 | operator | x | 11 | 0 | NULL | /student | /sbin/nologin |
  16. +----+----------+----------+------+------+---------+----------+----------------+
  17. 10 rows in set (0.00 sec)
  18. //仅删除与条件匹配的行
  19. mysql> delete from tarena.user where id <= 10 ;
  20. Query OK, 10 rows affected (0.06 sec)
  21. //查不到符合条件的记录了
  22. mysql> select * from tarena.user where id <= 10 ;
  23. Empty set (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值