• MySQL之账号管理、建库以及四大引擎


    目录

    一、安装下载

    二、用户管理

    三、建库建表

    四、CURD

    五、视图

    六、四大引擎的区别

    七、案例


    一、安装下载

            关于MySQL的下载及安装博主已经写过了,大家可以看一下 链接:MySQL的安装

    二、用户管理

         

      项目经理 就数据库而言:crud(增删改查),Create(创表),drop(删表)..

      项目组长而言:crud

      开发人员:select(查询)

    上面权限的划分、针对的是生产环境

       对于系统开发而言,三个环境

            线网、生产环境:系统开发完毕、客户使用的环境

            测试环境:公司内部模拟客户现场,塔尖而成的环境

            开发环境:本地电脑

            

            如没有测试环境这一层,直接把本地项目部署到客户使用环境,及有可能会报错

    一、让我们来看一下mysql默认数据库里面的四张表(user,db,tables_priv,columns_priv)

     

    注意:在MySQL安装好之后会有一个Mysql数据库里面的表千万不能删,如果删了就只能重装

    1. 1user表(用户层权限)
    2. 因为字段太多,只截取了一部分。首先登陆的时候验证Host,User,Password(authentication_string)也就是ip,用户名,密码是否匹配,匹配登陆成功将会为登陆者分配权限,分配权限的顺序也是按照上面四张表的排列顺序进行的,举个例子,如果user表的Select_priv为Y说明他拥有所有表的查找权限,如果为N就需要到下一级db表中进行权限分配了。其中的%是通配符,代表任意的意思。
    3. 2、db表(数据库层权限)
    4. 来到db表之后会匹配Host,User然后会根据Db字段对应的表进行权限分配,像Select_priv这些字段对应的权限大家应该都能看出来是对应着什么权限了吧,这里不细说了(不偷懒,举个例子Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv分别代表着查询,增加,更新,删除,创建,销毁)。其中Y代表这拥有此项权限,N则代表没有此项权限。
    5. 3、tables_priv表(表层权限)
    6. 与上面一样,这是通过Host,Db,UserTable来进行定位到表层的一个权限分配。不过它只有Table_priv和Column_priv两个字段来记录权限。
    7. 4、columns_priv表(字段层权限)
    8. 顾名思义,字段层权限,通过Host,Db,UserTableColumn来进行定位到字段层的一个权限分配,只有Column_priv来记录权限。

    现在让我们来创建一个用户(项目经理)

     让我们查询一下用户,我们可以看到用户zs创建好了,但这个zs用户没有任何意义和

    价值

     我们查询一下用户的信息,可以看到我们新建的用户没有密码,没有密码的话也就无法登陆

     所以我们需要给创建的用户设置密码

    我们测试连接,点击连接选中Mysql进行测试,如下可以看到连接成功

     

    连接成功后点击确定,可以看到我们左边的状态栏出现了我们新建的用户zs

     接着我们给zs赋予权限,赋予权限之后,我们在重新连接

     可以看到我们用户zs也有了zy这个数据库的所有权限

     ​​​​​​​​​​​​​​

    我们在创建一个用户ls(项目组长)

    按上述步骤来,赋予权限只有查询、删除

     可以看到我们用户ls一创建成功,而对应的我们在赋予权限的时候只给

    其中一张表赋予了权限所以,只出现对应的那张表 

     在创建一个用户ww(开发人员)

    同样的如上述步骤,在赋予权限的时候,只有赋予查询的权限;


    对应的我们在给用户赋予权限的时候同时可以撤销用户的权限

    查看权限 

    注意:在对某一个库某一张表的权限进行撤回是不能的


    下面是基本的用户sql语句

    1. 0.查询用户
    2. SELECT * from user;
    3. 1.创建用户并设置登录密码
    4. #MySQL5.7
    5. #命令:create user 用户名 identified by '密码';
    6. #注:identified by会将纯文本密码加密作为散列值存储
    7. create user ls identified by '123456';
    8. #MySQL8
    9. #用户名密码创建需要分开
    10. #命令:create user 用户名;
    11. create user ls;
    12. 2.查看用户信息
    13. #MySQL5.7
    14. select host,user,password from user;
    15. #MySQL8
    16. select host,user,authentication_string from user;
    17. 3.删除用户(慎用)
    18. #命令:drop user 用户名;
    19. #drop user ls;
    20. 4.修改用户密码
    21. 4.1 修改密码
    22. #MySQL5.7
    23. #命令:set password for 用户名=password('新密码');
    24. set password for zs=password('123456');
    25. 6.撤销权限(Revoke)
    26. #语法:revoke privileges on databasename.tablename from username@'host';
    27. #啥也不能回收,不会对GRANT ALL PRIVILEGES ON `db_xiaoli`.* TO `zs`@`%`有任何影响
    28. revoke DELETE on db_xiaoli.t_p1_user from zs@'%';
    29. #可以回收GRANT SELECT, UPDATE ON `db_xiaoli`.`t_p1_user` TO `zs`@`%`这条权限语句
    30. revoke all on db_xiaoli.t_p1_user from zs@'%';
    31. #可以回收GRANT ALL PRIVILEGES ON `db_xiaoli`.* TO `zs`@`%`这条赋权语句带来的权限
    32. revoke all on db_xiaoli.* from zs@'%';
    33. #注:revoke只能回收grants列表中更小的权限;
    34. 设置权限(Grant)和撤销权限(Revoke)的参数说明:
    35. 1) privileges: 用户的操作权限,如SELECT,INSERT,UPDATE,DELETE等,如果要授予所有权限直接使用:all;
    36. 2) databasename:数据库名;
    37. 3) tablename: 表名,如果要授予用户对所有数据库和表的操作权限直接使用:*.*;
    38. 7.查看用户权限
    39. #命令:show grants for 用户名;
    40. show grants for 'zs'@'%';
    41. user表中host列的值的意义
    42. % 匹配所有主机
    43. localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接
    44. 127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问;
    45. ::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1
    46. #MySQL8
    47. #ALTER USER 用户 IDENTIFIED WITH mysql_native_password BY '密码';
    48. ALTER USER 'ls'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    49. 4.2 刷新配置
    50. #命令:flush privileges;
    51. #MySQL5.7与MySQL8关于权限操作没有差异性
    52. 5.设置权限(Grant)
    53. #语法:grant privileges on databasename.tablename to username@'host';
    54. #给 zs用户 赋予 数据库db_xiaoli中的表t_p1_user 查询权限
    55. grant SELECT on db_xiaoli.t_p1_user to zs@'%';
    56. #给 zs用户 赋予 数据库db_xiaoli中的表t_p1_user 修改权限
    57. grant UPDATE on db_xiaoli.t_p1_user to zs@'%';
    58. #给 zs用户 赋予 数据库db_xiaoli中所有表 查询权限
    59. grant SELECT on db_xiaoli.* to zs@'%';
    60. #给 zs用户 赋予 数据库db_xiaoli中所有表 所有权限
    61. grant ALL on db_xiaoli.* to zs@'%';

    三、建库建表

    按如下语句创库的话是不能行的,这回导致乱码,我们还要设置编码集

              

     

     

    如上我们可以看到数据库已经创建好了 


    相关sql语句

    1. 1.创建数据库
    2. 语法:create database 数据库名;
    3. 或者
    4. create database if not exists 数据库名 default charset utf8 collate utf8_general_ci;
    5. 注:默认的数据库编码集:utf8(即UTF-8),collate表示排序规则为utf8_general_ci
    6. 2.查看所有数据库
    7. 语法:show databases;
    8. 3.删除数据库(慎用)
    9. 语法:drop database 数据库名;

     字段类型

    1. MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
    2. 1)字符类型:char varchar text blob
    3. 2)数值类型:int bigint float decimal
    4. int -> int
    5. bigint -> long
    6. float -> 成绩
    7. decimal -> 货币类型(精度,小数)
    8. 3)日期类型:date time datetime timestamp
    9. date -> yyyy:MM:dd HH:mm:ss
    10. time -> HH:mm:ss
    11. datetime -> yyyy:MM:dd
    12. timestamp(时间戳) -> 长整数

     相关约束

    1. 约束分为:六大约束
    2. NOT NULL:非空,用于保证该字段的值不能为空
    3. 比如姓名、学号等
    4. DEFAULT:默认,用于保证该字段有默认值
    5. 比如:默认约束我们可用到性别
    6. PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
    7. 比如学号、员工编号等
    8. UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
    9. 比如座位号
    10. CHECK:检查约束【mysql中不支持】
    11. 比如年龄、性别
    12. FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值
    13. 在从表添加外键约束,用于引用主表中某列的值
    14. 比如学生表的专业编号,员工表的部门编号,员工表的工种编号
    15. 添加约束的时机:
    16. 1.创建表时
    17. 2.修改表时
    18. 约束的添加分类:
    19. 列级约束:
    20. 六大约束语法上都支持,但外键约束没有效果
    21. 表级约束:
    22. 除了非空、默认,其他的都支持
    23. 主键和唯一的大对比:
    24. 保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
    25. 主键 不允许 至多有1个 可以,但不推荐
    26. 唯一 允许 可以有多个 可以,但不推荐
    27. 外键:
    28. 1、要求在从表设置外键关系
    29. 2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
    30. 3、主表的关联列必须是一个key(一般是主键或唯一)
    31. 4、插入数据时,先插入主表,再插入从表
    32. 删除数据时,先删除从表,再删除主表
    33. */
    34. CREATE TABLE 表名(
    35. 字段名 字段类型 列级约束,
    36. 字段名 字段类型,
    37. 表级约束
    38. )
    39. CREATE DATABASE students;
    40. #一、创建表时添加约束
    41. #1.添加列级约束
    42. /*
    43. 语法:
    44. 直接在字段名和类型后面追加 约束类型即可。
    45. 只支持:默认、非空、主键、唯一
    46. */
    47. USE students;
    48. DROP TABLE stuinfo;
    49. CREATE TABLE stuinfo(
    50. id INT PRIMARY KEY,#主键
    51. stuName VARCHAR(20) NOT NULL UNIQUE,#非空
    52. gender CHAR(1) CHECK(gender='男' OR gender ='女'),#检查
    53. seat INT UNIQUE,#唯一
    54. age INT DEFAULT 18,#默认约束
    55. majorId INT REFERENCES major(id)#外键
    56. );
    57. CREATE TABLE major(
    58. id INT PRIMARY KEY,
    59. majorName VARCHAR(20)
    60. );
    61. #查看stuinfo中的所有索引,包括主键、外键、唯一
    62. SHOW INDEX FROM stuinfo;
    63. #2.添加表级约束
    64. /*
    65. 语法:在各个字段的最下面
    66. 【constraint 约束名】 约束类型(字段名)
    67. */
    68. DROP TABLE IF EXISTS stuinfo;
    69. CREATE TABLE stuinfo(
    70. id INT,
    71. stuname VARCHAR(20),
    72. gender CHAR(1),
    73. seat INT,
    74. age INT,
    75. majorid INT,
    76. CONSTRAINT pk PRIMARY KEY(id),#主键
    77. CONSTRAINT uq UNIQUE(seat),#唯一键
    78. CONSTRAINT ck CHECK(gender ='男' OR gender = '女'),#检查
    79. CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键
    80. );
    81. SHOW INDEX FROM stuinfo;
    82. #通用的写法:★
    83. CREATE TABLE IF NOT EXISTS stuinfo(
    84. id INT PRIMARY KEY,
    85. stuname VARCHAR(20),
    86. sex CHAR(1),
    87. age INT DEFAULT 18,
    88. seat INT UNIQUE,
    89. majorid INT,
    90. CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
    91. );
    92. #二、修改表时添加约束
    93. /*
    94. 1、添加列级约束
    95. alter table 表名 modify column 字段名 字段类型 新约束;
    96. 2、添加表级约束
    97. alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
    98. */
    99. DROP TABLE IF EXISTS stuinfo;
    100. CREATE TABLE stuinfo(
    101. id INT,
    102. stuname VARCHAR(20),
    103. gender CHAR(1),
    104. seat INT,
    105. age INT,
    106. majorid INT
    107. )
    108. DESC stuinfo;
    109. #1.添加非空约束
    110. ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
    111. #2.添加默认约束
    112. ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
    113. #3.添加主键
    114. #①列级约束
    115. ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
    116. #②表级约束
    117. ALTER TABLE stuinfo ADD PRIMARY KEY(id);
    118. #4.添加唯一
    119. #①列级约束
    120. ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
    121. #②表级约束
    122. ALTER TABLE stuinfo ADD UNIQUE(seat);
    123. #5.添加外键
    124. ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
    125. #三、修改表时删除约束
    126. #1.删除非空约束
    127. ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
    128. #2.删除默认约束
    129. ALTER TABLE stuinfo MODIFY COLUMN age INT ;
    130. #3.删除主键
    131. ALTER TABLE stuinfo DROP PRIMARY KEY;
    132. #4.删除唯一
    133. ALTER TABLE stuinfo DROP INDEX seat;
    134. #5.删除外键
    135. ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
    136. SHOW INDEX FROM stuinfo;

    四、CURD

    查询

    ①基础查询 

    1. /*
    2. 语法:
    3. select 查询列表 from 表名;
    4. 类似于:System.out.println(打印东西);
    5. 特点:
    6. 1、查询列表可以是:表中的字段、常量值、表达式、函数
    7. 2、查询的结果是一个虚拟的表格
    8. */
    9. # USE myemployees;
    10. #1.查询表中的单个字段
    11. SELECT hname FROM tb_hobby;
    12. #2.查询表中的多个字段
    13. SELECT hname,hid FROM tb_hobby;
    14. #3.查询表中的所有字段
    15. #方式一:
    16. SELECT
    17. `employee_id`,
    18. `first_name`,
    19. `last_name`,
    20. `phone_number`,
    21. `last_name`,
    22. `job_id`,
    23. `phone_number`,
    24. `job_id`,
    25. `salary`,
    26. `commission_pct`,
    27. `manager_id`,
    28. `department_id`,
    29. `hiredate`
    30. FROM
    31. t_mysql_employees ;
    32. #方式二:
    33. SELECT * FROM t_mysql_employees;
    34. #4.查询常量值
    35. SELECT 100;
    36. SELECT 'john';
    37. #5.查询表达式
    38. SELECT 100%98;
    39. #6.查询函数
    40. SELECT VERSION();
    41. #7.起别名
    42. /*
    43. ①便于理解
    44. ②如果要查询的字段有重名的情况,使用别名可以区分开来
    45. */
    46. #方式一:使用as
    47. SELECT 100%98 AS 结果;
    48. SELECT last_name AS 姓,first_name ASFROM t_mysql_employees;
    49. #方式二:使用空格
    50. SELECT last_name 姓,first_name 名 FROM t_mysql_employees;
    51. #案例:查询salary,显示结果为 out put
    52. SELECT salary AS "out put" FROM t_mysql_employees;
    53. #8.去重
    54. #案例:查询员工表中涉及到的所有的部门编号
    55. SELECT DISTINCT department_id FROM t_mysql_employees;
    56. #9.+号的作用
    57. /*
    58. java中的+号:
    59. ①运算符,两个操作数都为数值型
    60. ②连接符,只要有一个操作数为字符串
    61. mysql中的+号:
    62. 仅仅只有一个功能:运算符
    63. select 100+90; 两个操作数都为数值型,则做加法运算
    64. select '123'+90;只要其中一方为字符型,试图将字符型数值转换成数值型
    65. 如果转换成功,则继续做加法运算
    66. select 'john'+90;如果转换失败,则将字符型数值转换成0
    67. select null+10; 只要其中一方为null,则结果肯定为null
    68. */
    69. #案例:查询员工名和姓连接成一个字段,并显示为 姓名
    70. SELECT CONCAT('a','b','c') AS 结果;
    71. SELECT
    72. CONCAT(last_name,first_name) AS 姓名
    73. FROM
    74. t_mysql_employees;

    ②过滤和排序数据

     

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

    案例:

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

     order by查询语句 

    语法:

    1. 语法:
    2. select 查询列表
    3. from 表名
    4. where 筛选条件】
    5. order by 排序的字段或表达式;
    6. 特点:
    7. 1asc代表的是升序,可以省略
    8. desc代表的是降序
    9. 2order by子句可以支持 单个字段、别名、表达式、函数、多个字段
    10. 3order by子句在查询语句的最后面,除了limit子句
    11. */
    12. #1、按单个字段排序
    13. SELECT * FROM t_mysql_employees ORDER BY salary DESC;
    14. #2、添加筛选条件再排序
    15. #案例:查询部门编号>=90的员工信息,并按员工编号降序
    16. SELECT *
    17. FROM t_mysql_employees
    18. WHERE department_id>=90
    19. ORDER BY employee_id DESC;
    20. #3、按表达式排序
    21. #案例:查询员工信息 按年薪降序
    22. SELECT *,salary*12*(1+IFNULL(commission_pct,0))
    23. FROM t_mysql_employees
    24. ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
    25. #4、按别名排序
    26. #案例:查询员工信息 按年薪升序
    27. SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪
    28. FROM t_mysql_employees
    29. ORDER BY 年薪 ASC;
    30. #5、按函数排序
    31. #案例:查询员工名,并且按名字的长度降序
    32. SELECT LENGTH(last_name),last_name
    33. FROM t_mysql_employees
    34. ORDER BY LENGTH(last_name) DESC;
    35. #6、按多个字段排序
    36. #案例:查询员工信息,要求先按工资降序,再按employee_id升序
    37. SELECT *
    38. FROM t_mysql_employees
    39. ORDER BY salary DESC,employee_id ASC;

    排序案例

    1. 1.查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序
    2. SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) 年薪
    3. FROM t_mysql_employees
    4. ORDER BY 年薪 DESC,last_name ASC;
    5. #2.选择工资不在800017000的员工的姓名和工资,按工资降序
    6. SELECT last_name,salary
    7. FROM t_mysql_employees
    8. WHERE salary NOT BETWEEN 8000 AND 17000
    9. ORDER BY salary DESC;
    10. #3.查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
    11. SELECT *,LENGTH(email)
    12. FROM t_mysql_employees
    13. WHERE email LIKE '%e%'
    14. ORDER BY LENGTH(email) DESC,department_id ASC;

    分组查询

    功能:用作统计使用,又称为聚合函数或统计函数或组函数
    ​​​​​​​

    1. 分类:
    2. sum 求和、avg 平均值、max 最大值 、min 最小值 、count 计算个数
    3. 特点:
    4. 1、sum、avg一般用于处理数值型
    5. max、min、count可以处理任何类型
    6. 2、以上分组函数都忽略null
    7. 3、可以和distinct搭配实现去重的运算
    8. 4、count函数的单独介绍
    9. 一般使用count(*)用作统计行数
    10. 5、和分组函数一同查询的字段要求是group by后的字段
    11. */
    12. #1、简单 的使用
    13. SELECT SUM(salary) FROM t_mysql_employees;
    14. SELECT AVG(salary) FROM t_mysql_employees;
    15. SELECT MIN(salary) FROM t_mysql_employees;
    16. SELECT MAX(salary) FROM t_mysql_employees;
    17. SELECT COUNT(salary) FROM t_mysql_employees;
    18. SELECT SUM(salary) 和,AVG(salary) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 个数
    19. FROM t_mysql_employees;
    20. SELECT SUM(salary) 和,ROUND(AVG(salary),2) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 个数
    21. FROM t_mysql_employees;
    22. #2、参数支持哪些类型
    23. SELECT SUM(last_name) ,AVG(last_name) FROM t_mysql_employees;
    24. SELECT SUM(hiredate) ,AVG(hiredate) FROM t_mysql_employees;
    25. SELECT MAX(last_name),MIN(last_name) FROM t_mysql_employees;
    26. SELECT MAX(hiredate),MIN(hiredate) FROM t_mysql_employees;
    27. SELECT COUNT(commission_pct) FROM t_mysql_employees;
    28. SELECT COUNT(last_name) FROM t_mysql_employees;
    29. #3、是否忽略null
    30. SELECT SUM(commission_pct) ,AVG(commission_pct),SUM(commission_pct)/35,SUM(commission_pct)/107 FROM t_mysql_employees;
    31. SELECT MAX(commission_pct) ,MIN(commission_pct) FROM t_mysql_employees;
    32. SELECT COUNT(commission_pct) FROM t_mysql_employees;
    33. SELECT commission_pct FROM t_mysql_employees;
    34. #4、和distinct搭配
    35. SELECT SUM(DISTINCT salary),SUM(salary) FROM t_mysql_employees;
    36. SELECT COUNT(DISTINCT salary),COUNT(salary) FROM t_mysql_employees;
    37. #5、count函数的详细介绍
    38. SELECT COUNT(salary) FROM t_mysql_employees;
    39. SELECT COUNT(*) FROM t_mysql_employees;
    40. SELECT COUNT(1) FROM t_mysql_employees;
    41. 效率:
    42. MYISAM存储引擎下 ,COUNT(*)的效率高
    43. INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些
    44. #6、和分组函数一同查询的字段有限制,employee_id是最小的那个
    45. SELECT AVG(salary),employee_id FROM t_mysql_employees;
    46. 分组函数练习
    47. #1.查询公司员工工资的最大值,最小值,平均值,总和
    48. SELECT MAX(salary) 最大值,MIN(salary) 最小值,AVG(salary) 平均值,SUM(salary) 和
    49. FROM t_mysql_employees;
    50. #2.查询员工表中的最大入职时间和最小入职时间的相差天数 (DIFFRENCE)
    51. SELECT MAX(hiredate) 最大,MIN(hiredate) 最小,(MAX(hiredate)-MIN(hiredate))/1000/3600/24 DIFFRENCE
    52. FROM t_mysql_employees;
    53. SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) DIFFRENCE
    54. FROM t_mysql_employees;
    55. SELECT DATEDIFF('1995-2-7','1995-2-6');
    56. #3.查询部门编号为90的员工个数
    57. SELECT COUNT(*) FROM t_mysql_employees WHERE department_id = 90;

     

    五、视图

    1. 含义:虚拟表,和普通表一样使用
    2. 比如:舞蹈班和普通班级的对比
    3. 创建语法的关键字是否实际占用物理空间使用
    4. 视图create view只是保存了sql逻辑增删改查,只是一般不能增删改
    5. create table保存了数据增删改查
    6. #案例:查询姓张的学生名和专业名
    7. SELECT stuname,majorname
    8. FROM stuinfo s
    9. INNER JOIN major m ON s.`majorid`= m.`id`
    10. WHERE s.`stuname` LIKE '张%';
    11. CREATE VIEW v1
    12. AS
    13. SELECT stuname,majorname
    14. FROM stuinfo s
    15. INNER JOIN major m ON s.`majorid`= m.`id`;
    16. SELECT * FROM v1 WHERE stuname LIKE '张%';
    17. #一、创建视图
    18. /*
    19. 语法:
    20. create view 视图名
    21. as
    22. 查询语句;
    23. */
    24. USE myemployees;
    25. #1.查询姓名中包含a字符的员工名、部门名和工种信息
    26. #①创建
    27. CREATE VIEW myv1
    28. AS
    29. SELECT last_name,department_name,job_title
    30. FROM employees e
    31. JOIN departments d ON e.department_id = d.department_id
    32. JOIN jobs j ON j.job_id = e.job_id;
    33. #②使用
    34. SELECT * FROM myv1 WHERE last_name LIKE '%a%';
    35. #2.查询各部门的平均工资级别
    36. #①创建视图查看每个部门的平均工资
    37. CREATE VIEW myv2
    38. AS
    39. SELECT AVG(salary) ag,department_id
    40. FROM employees
    41. GROUP BY department_id;
    42. #②使用
    43. SELECT myv2.`ag`,g.grade_level
    44. FROM myv2
    45. JOIN job_grades g
    46. ON myv2.`ag` BETWEEN g.`lowest_sal` AND g.`highest_sal`;
    47. #3.查询平均工资最低的部门信息
    48. SELECT * FROM myv2 ORDER BY ag LIMIT 1;
    49. #4.查询平均工资最低的部门名和工资
    50. CREATE VIEW myv3
    51. AS
    52. SELECT * FROM myv2 ORDER BY ag LIMIT 1;
    53. SELECT d.*,m.ag
    54. FROM myv3 m
    55. JOIN departments d
    56. ON m.`department_id`=d.`department_id`;
    57. #二、视图的修改
    58. #方式一:
    59. /*
    60. create or replace view 视图名
    61. as
    62. 查询语句;
    63. */
    64. SELECT * FROM myv3
    65. CREATE OR REPLACE VIEW myv3
    66. AS
    67. SELECT AVG(salary),job_id
    68. FROM employees
    69. GROUP BY job_id;
    70. #方式二:
    71. /*
    72. 语法:
    73. alter view 视图名
    74. as
    75. 查询语句;
    76. */
    77. ALTER VIEW myv3
    78. AS
    79. SELECT * FROM employees;
    80. #三、删除视图
    81. /*
    82. 语法:drop view 视图名,视图名,...;
    83. */
    84. DROP VIEW emp_v1,emp_v2,myv3;
    85. #四、查看视图
    86. DESC myv3;
    87. SHOW CREATE VIEW myv3;
    88. #五、视图的更新
    89. CREATE OR REPLACE VIEW myv1
    90. AS
    91. SELECT last_name,email,salary*12*(1+IFNULL(commission_pct,0)) "annual salary"
    92. FROM employees;
    93. CREATE OR REPLACE VIEW myv1
    94. AS
    95. SELECT last_name,email
    96. FROM employees;
    97. SELECT * FROM myv1;
    98. SELECT * FROM employees;
    99. #1.插入
    100. INSERT INTO myv1 VALUES('张飞','zf@qq.com');
    101. #2.修改
    102. UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';
    103. #3.删除
    104. DELETE FROM myv1 WHERE last_name = '张无忌';
    105. #具备以下特点的视图不允许更新
    106. #①包含以下关键字的sql语句:分组函数、distinctgroup byhavingunion或者union all
    107. CREATE OR REPLACE VIEW myv1
    108. AS
    109. SELECT MAX(salary) m,department_id
    110. FROM employees
    111. GROUP BY department_id;
    112. SELECT * FROM myv1;
    113. #更新
    114. UPDATE myv1 SET m=9000 WHERE department_id=10;
    115. #②常量视图
    116. CREATE OR REPLACE VIEW myv2
    117. AS
    118. SELECT 'john' NAME;
    119. SELECT * FROM myv2;
    120. #更新
    121. UPDATE myv2 SET NAME='lucy';
    122. #③Select中包含子查询
    123. CREATE OR REPLACE VIEW myv3
    124. AS
    125. SELECT department_id,(SELECT MAX(salary) FROM employees) 最高工资
    126. FROM departments;
    127. #更新
    128. SELECT * FROM myv3;
    129. UPDATE myv3 SET 最高工资=100000;
    130. #④join
    131. CREATE OR REPLACE VIEW myv4
    132. AS
    133. SELECT last_name,department_name
    134. FROM employees e
    135. JOIN departments d
    136. ON e.department_id = d.department_id;
    137. #更新
    138. SELECT * FROM myv4;
    139. UPDATE myv4 SET last_name = '张飞' WHERE last_name='Whalen';
    140. INSERT INTO myv4 VALUES('陈真','xxxx');
    141. #⑤from一个不能更新的视图
    142. CREATE OR REPLACE VIEW myv5
    143. AS
    144. SELECT * FROM myv3;
    145. #更新
    146. SELECT * FROM myv5;
    147. UPDATE myv5 SET 最高工资=10000 WHERE department_id=60;
    148. #⑥where子句的子查询引用了from子句中的表
    149. CREATE OR REPLACE VIEW myv6
    150. AS
    151. SELECT last_name,email,salary
    152. FROM employees
    153. WHERE employee_id IN(
    154. SELECT manager_id
    155. FROM employees
    156. WHERE manager_id IS NOT NULL
    157. );
    158. #更新
    159. SELECT * FROM myv6;
    160. UPDATE myv6 SET salary=10000 WHERE last_name = 'k_ing';

    案例:

    1. 一、创建视图emp_v1,要求查询电话号码以‘011’开头的员工姓名和工资、邮箱
    2. CREATE OR REPLACE VIEW emp_v1
    3. AS
    4. SELECT last_name,salary,email
    5. FROM employees
    6. WHERE phone_number LIKE '011%';
    7. 二、创建视图emp_v2,要求查询部门的最高工资高于12000的部门信息
    8. CREATE OR REPLACE VIEW emp_v2
    9. AS
    10. SELECT MAX(salary) mx_dep,department_id
    11. FROM employees
    12. GROUP BY department_id
    13. HAVING MAX(salary)>12000;
    14. SELECT d.*,m.mx_dep
    15. FROM departments d
    16. JOIN emp_v2 m
    17. ON m.department_id = d.`department_id`;

    六、四大引擎的区别

    MYISAM引擎、Menory引擎、InnoDB引擎、Archive引擎

    存储引擎的选中

    不同的储存引擎都有各自的特点,以适应不同的需求,如下图:

     

    1. 如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
    2. 如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率
    3. 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果
    4. 如果只有INSERTSELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive
    5. 使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

    七、案例

    bd_user表 

     bd_shop表

    一、一月每笔消费均大于20元的用户的总消费额

    select sum(order_amt) from  bd_user where order_amt > 20.0 and order_time <='2018-01-31' GROUP BY user_id

     

    二、1月只吃了麻辣烫和汉堡的人数

    ​​​​​​​
    select count(*) from (
            select count(*) from (
                    select * from(
                            select * from bd_user where order_time like '%-01-%'  
                     ) c where order_category ='麻辣烫' or order_category ='汉堡'
            ) d GROUP BY user_id HAVING count(*)=2
    ) e 

     

    三、计算每个BD_TEAM的BD对应门店的销售额

    select sum(b.order_amt) from bd_shop a ,bd_user b where a.shop_id=b.shop_id GROUP BY a.BD_team

     

     

  • 相关阅读:
    微机原理——汇编指令(上部)
    【Go语言】项目实战:客户信息管理系统(需求分析、项目设计、功能实现)
    PO模式在selenium自动化测试框架有什么好处
    Golang-01Golang开发环境配置
    Spring Security 6.x 系列【65】认证篇之 LDAP 协议
    瞬态抑制二极管TVS的核心参数?|深圳比创达电子EMC(下)
    【C语言】青蛙跳台阶 —— 详解
    Android 13.0 系统settings详情页卸载修改为停止,禁止卸载app功能实现
    阿里云新加坡主机服务器选择
    01-10-Hadoop-HA-概述
  • 原文地址:https://blog.csdn.net/qq_65345936/article/details/125551739