mysql基础知识

Bertha 。 2021-05-16 20:36 1005阅读 0赞

mysql基础

  • 基本命令
    • 服务和登录
    • SQL注释
    • SQL分类
    • 创建自定义数据库
    • 查看数据库创建信息
    • 修改数据库
    • 删除数据库
    • 查看当前使用的数据库
    • 使用数据库
    • 查看表的结构
    • 查看表的字符集
    • 查看所有表信息
  • 数据类型
    • 数值类型
    • 日期类型
    • 字符串类型
  • 数据表的创建(create)
    • 数据表的修改(ALTER)
    • 向现有表中添加列
    • 修改表中的列
    • 删除表中的列
    • 修改列名
    • 修改表名
    • 数据表的删除
  • 约束
  • 添加信息
    • 新增(insert)
  • 修改(update)
  • 删除(DELETE)
    • 删除一条信息
  • 数据查询
    • 基本查询语句
    • 查询部分列
    • 查询所有列
    • 对列中数据进行运算
    • 列的别名
    • 查询结果去重
    • 排序查询
      • 依据单列排序
      • 依据多列排序
    • 条件查询
    • 等值判断
    • 逻辑判断(and,or,not)
    • 区间判断(between and)
    • NULL值判断(IS NULL , IS NOT NULL)
    • 枚举查询(IN (值1,值2,值3))
    • 模糊查询
    • 分支结构查询
    • 时间查询
    • 字符串应用
    • 聚合函数
    • 分组查询
    • 分组过滤查询
    • 限定查询
    • sql 语句的编写顺序
    • 子查询(作为条件判断)
    • 子查询(作为枚举查询条件)
    • 子查询(作为一张表)
    • 合并查询
    • 表连接查询
    • 内连接查询(INNER JOIN ON)
    • 三表连接查询
    • 左外连接(left join on)
    • 右链接查询(right join on)
  • 蠕虫复制
  • 事务的概念
    • 事务的边界
    • 事务的原理
    • 事务的特性
    • 事务的应用
  • 权限管理
    • 创建用户
    • 创建一个用户
    • 授权
    • 撤销用户权限
    • 删除用户
  • 视图
    • 视图特点
    • 视图的创建
    • 创建视图
    • 视图的修改
    • 修改视图
    • 删除视图
    • 视图的注意事项
  • 练习

基本命令

服务和登录

  1. 1.cmd中打开服务窗口的命令
  2. net start mysql
  3. 2.cmd中停止mysql服务的命令
  4. net stop mysql
  5. 3. 使用root账号root密码登录的命令
  6. mysql -u root -p
  7. 4. 退出登录的命令
  8. quit
  9. EXIT
  10. \q

SQL注释

  1. 单行注释: -- 你好
  2. 多行注释: /* 巴拉巴拉 */
  3. MySQL 独有的单行注释: # 哈哈哈哈

SQL分类

  • DDL(Data Definition Language)数据定义语言

    • 用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter 等
  • DML(Data Manipulation Language)数据操作语言

    • 用来对数据库中表的数据进行增删改。关键字:insert,delete,update 等
  • DQL(Data Query Language)数据查询语言

    • 用来查询数据库中表的记录(数据)。关键字:select等
  • DCL(Data Control Language)数据控制语言(了解)

    • 用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE等
    1. 数据查询语言DQL(Data Query Language):select、where、order by、group by、having 。

    2. 数据定义语言DDL(Data Definition Language):create、alter、drop。

    3. 数据操作语言DML(Data Manipulation Language):insert、update、delete 。

    4. 事务处理语言TPL(Transaction Process Language):commit、rollback 。

    5. 数据控制语言DCL(Data Control Language):grant、revoke。

    查看MYSQL所有的数据库
    SHOW DATABASES ; #显示当前MYSQL中包含的所有数据库


























数据库名称 描述
information_schema 信息数据库,其中保存着关于所有数据库的信息(元数据)。
元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。
mysql 核心数据库,主要负责存储数据库的用户、权限设置、关键字等,
以及需要使用的控制和管理信息,不可以删除。
performance_schema 性能优化的数据库,MySQL 5.5版本中新增的一个性能优化的引擎。
sys 系统数据库,MySQL5.7版本中新增的可以快速的了解元数据信息的系统库
便于发现数据库的多样信息,解决性能瓶颈问题。

创建自定义数据库

  1. CREATE DATABASE mydb1; #创建名为mydb1的数据库
  2. CREATE DATABASE mydb2 CHARACTER SET gbk ;#创建名为db2的数据库并设置编码格式为gbk
  3. CREATE DATABASE mydb2 CHARSET gbk
  4. CREATE DATABASE IF NOT EXISTS mydb3 ;#如果db3不存在,则创建,如果存在,则不创建
  5. CREATE DATABASE IF NOT EXISTS mydb3 CHARACTER SET gbk

查看数据库创建信息

  1. SHOW CREATE DATABASE db3; #查看创建数据库时的基本信息

修改数据库

注意mysql中utf-8 是utf8

  1. ALTER DATABASE db3 CHARACTER SET gbk #修改创建数据库时的基本信息

删除数据库

  1. DROP DATABASE db3 #删除数据库

查看当前使用的数据库

  1. SELECT DATABASE(); #查看当前使用的数据库

使用数据库

  1. USE db2; #使用db2数据库

查看表的结构

  1. desc `表名`;
  2. describe `表名`;
  3. DESC t_employees #查看表的信息

查看表的字符集

  1. show CREATE TABLE t_employees

查看所有表信息

选择数据库后,才能查看表

  1. show tables;

数据类型

MYSQL支持多种类型,大致可以划分为三类:数值,日期/时间和字符串(字符)类型

数值类型









































类型 大小 范围(有符号) 范围(无符号) 用途
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
DOUBLE 8 字节 (-1.797E+308,-2.22E-308) (0,2.22E-308,1.797E+308) 双精度浮点数值
DOUBLE(M,D) 8个字节,M表示长度,D表示小数位数 同上,受M和D的约束 DUBLE(5,2) -999.99-999.99 同上,受M和D的约束 双精度浮点数值
DECIMAL(M,D) 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值,M最大值为65 依赖于M和D的值,M最大值为65 小数值

日期类型
















































类型 大小 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

字符串类型































类型 大小 用途
CHAR 0-255字符 定长字符串 char(10) 10个字符
VARCHAR 0-65535 字节 变长字符串 varchar(10) 10个字符
BLOB(binary large object) 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
  • CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
  • BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
  • BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
  • 有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。

数据表的创建(create)

  1. #数据表的创建(CREATE)
  2. CREATE TABLE 表名(
  3. 列名 数据类型 [约束],
  4. 列名 数据类型 [约束],
  5. ...
  6. 列名 数据类型 [约束] #最后一列的末尾不加逗号
  7. )[CHARSET=utf8] #可以根据需要指定的表的字符编码集

字符集如果不指定, 默认继承库的字符集

  1. CREATE TABLE SUBJECT(
  2. subjectid INT,
  3. subjectname VARCHAR(20),
  4. subjecthours INT
  5. )CHARSET=utf8;

数据表的修改(ALTER)

  1. #alter TABLE 表名 操作;
  • 注意:修改表中的某列时,也要写全列的名字,数据类型,约束

向现有表中添加列

  1. #在课程表中添加 score列
  2. ALTER TABLE SUBJECT ADD score INT

修改表中的列

  1. #修改课程表中课程的字符长度为10个字符
  2. ALTER TABLE SUBJECT MODIFY subjectname VARCHAR(10)

注意 修改列表中的某列时,也要写全列的名字,数据类型,约束

删除表中的列

  1. #删除表中的score 列
  2. ALTER TABLE SUBJECT DROP score

注意 删除列的时,每次只能删除一列

修改列名

  1. #修改课程表中 subjecthours 为 classhours
  2. ALTER TABLE SUBJECT CHANGE subjecthours classhours INT

注意修改列名时,在给定新列名称时,要指定列的类型和约束

修改表名

  1. #修改表名为sub
  2. ALTER TABLE `subject` RENAME sub

数据表的删除

删除课程表

  1. DROP TABLE 表名
  2. DROP TABLE sub;

约束

实体完整性约束
表中的一行数据代表一个实体(entity) ,实体完整性的作用是标识每一行的数据不重复,实体唯一。

  1. #实体完整性约束
  2. #主键约束
  3. PRIMARY KEY 唯一,标识表中的一行数据,此列不可重复,且不能为null
  4. #唯一约束
  5. UNIQUE 唯一,标识表中的一行数据,不可重复,可以为NULL
  6. AUTO_INCREMENT 自动增长,给主键数值列添加自动增长,从1开始,每次加1,不能单独使用,和主键使用
  7. #域完整性约束: 限制列的单元格的数据正确性
  8. NOT NULL 非空,此列必须有值
  9. DEFAULT 为此列赋予默认值,当新增数据不指定值时,书写DEFAULT以指定的默认值进行填充
  10. 引用完整性的约束
  11. FOREIGN KEY 引用外部表的某个列的值,新增数据时,约束此列的值必须是引用表中存在的值
  12. CREATE TABLE SUBJECT(
  13. subjectid INT PRIMARY KEY AUTO_INCREMENT,#课程编号标识的编号唯一,且不能为NULL,自动增长会从1开始自动增长,每次增加1
  14. subjectname VARCHAR(10) UNIQUE NOT NULL,#课程名称唯一,课程名不能为空
  15. subjecthours INT DEFAULT 20 #默认是学时20个小时
  16. )CHARSET=utf8
  17. CONSTRAINT 引用名 FOREIGN KEY (列名) REFERENCES 被引用表名,列名
  18. CREATE TABLE sutdent(
  19. stuid INT AUTO_INCREMENT PRIMARY KEY,
  20. stuname VARCHAR(10),
  21. subjectid INT NOT NULL,
  22. CONSTRAINT fk_student_stuid FOREIGN KEY(subjectid) REFERENCES `subject`(subjectid)
  23. #和课程表中的subjectid相关联
  24. )

注意:建立关系时一定要先创建主表,在创建重表
删除关系时,先删除重表,再删除主表

添加信息

新增(insert)

  1. INSERT INTO 表名(列1,列2,列3.....)values(值1,值2,值3......)
  2. -- 按照指定字段, 一次插入多行
  3. insert into `表名` (字段1, 字段2 ...) values (值1, 2, ...), (值1, 2, ...);
  4. -- 指定全部字段, 一次插入多行
  5. insert into `表名` values (null, 1, 2, ...), (null, 1, 2, ...);
  6. INSERT INTO SUBJECT(subjectname,subjecthours) VALUES('语文',30);
  7. INSERT INTO SUBJECT(subjectname,subjecthours) VALUES('数学',DEFAULT);#默认课时是20个小时

注意:表名后的列名和values里的值要一一对应(个数,顺序,类型)
如果设置了正增长则不能手动添加对应的列

修改(update)

  1. UPDATE 表名 SET 1=新增1,列2=新增2....where 条件
  2. UPDATE SUBJECT SET subjectname='英语' WHERE subjectid=1 #将课程编号为1的课程名改为英语
  3. UPDATE SUBJECT SET subjectname='物理',subjecthours=36 WHERE subjectid=2 #可以一次性改多个值
  4. UPDATE `subject` SET subjecthours=40 #如果不加条件,在没有违反约束的前提下会修改整张表

注意: set后有多个列名=值 绝大多数的情况下都要加where条件制定修改,否则为整表更新

删除(DELETE)

  1. DELETE FROM 表名 WHERE 条件

删除一条信息

  1. DELETE FROM SUBJECT WHERE subjectid=2

注意:删除时,如果不加where 删除的是整张表的数据

清空整张表数据(TRUNCATE)

  1. TRUNCATE TABLE 表名

注意:与delete不加where删除数据不同,TRUNCATE是把表销毁,再按原表格式创建一个新表

数据查询

执行查询语句返回的结果是一张虚拟表

基本查询语句

  1. select 列名 from 表名

















关键字 描述
SELECT 指定要查询的列
FROM 指定要查询的表

查询部分列

  1. #从员工表中查询所有员工的id,姓和名
  2. SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME FROM t_employees;

查询所有列

  1. #查询员工表中所有的信息(所有列)
  2. SELECT * FROM t_employees
  3. *是通配符代表着所有,效率低,可读性差

对列中数据进行运算

每次查询相当于是一张虚拟的表,对原本表里面的内容没有影响

  1. #查询员工表中的id和年薪
  2. SELECT EMPLOYEE_ID,SALARY*12 FROM t_employees

























算数运算符 描述
+ 两列做加法运算
- 两列做减法运算
* 两列做乘法运算
/ 两列做除法运算

注意:%是站位运算符,而不是取余运算符

列的别名

  1. as '列名'
  2. SELECT EMPLOYEE_ID '员工id',SALARY*12 AS '年薪' FROM t_employees

as可以省略

查询结果去重

  1. #DISTINCT 去重
  2. SELECT DISTINCT MANAGER_ID FROM t_employees

排序查询

  1. #select 列名 from 表名 order by 排序列[排序方式]
  2. SELECT EMPLOYEE_ID,SALARY FROM t_employees ORDER BY SALARY DESC

















排序规则 描述
ASC 对前面排序列做升序排序
desc 对前面排序列做降序排序

注意:排序方式可以省略那么默认是升序排列

依据单列排序

  1. #按员工月薪降序排列
  2. SELECT EMPLOYEE_ID,SALARY FROM t_employees ORDER BY SALARY DESC

依据多列排序

  1. #按员工月薪降序排列当员工月薪相同时按员工id升序排列(薪资相同时,按照编号进行升序排序)
  2. SELECT EMPLOYEE_ID,SALARY FROM t_employees ORDER BY SALARY DESC,EMPLOYEE_ID ASC

当有多个列排序时先依据前面的先排,相同时在根据后面的排

  1. 注意:
  2. 1.排序方式有2种:升序 asc 降序 desc ,默认升序
  3. 2. 字段1 字段2 排序有冲突,字段1 优先满足。
  4. 3.如字段1数据相同,再按照字段2的排序方式排序。
  5. -- 注意:字符串也是可以排序的,排序依据为字符编码的二进制值
  6. select name from student3 order by name;

条件查询

  1. SELECT 列名 from 表名 where 条件













关键字 描述
WHERE 条件 在查询结果中,筛选符合条件的查询结果,条件为布尔表达式

等值判断

  1. #查询员工月薪为400的信息(员工id,月薪)
  2. SELECT EMPLOYEE_ID ,SALARY FROM t_employees WHERE SALARY = 4000

注意:与java中不同 java中是==,mysql中等值判断使用=

逻辑判断(and,or,not)

  1. #查询员工月薪为11000并且员工号为114 的信息
  2. SELECT * FROM t_employees WHERE SALARY = 11000 AND EMPLOYEE_ID=114

不等值判断(>,<,>=,<=,!=.<>)

区间判断(between and)

  1. #查询薪资在4000到11000之间的员工信息
  2. SELECT * FROM t_employees WHERE SALARY BETWEEN 4000 AND 11000
  3. SELECT * FROM t_employees WHERE SALARY>=4000 AND SALARY<=11000

注意:在区间判断语法中,小值在前,大值在后,反之得不到正确结果

NULL值判断(IS NULL , IS NOT NULL)

  1. IS NULL
  2. 列名 is NULL
  3. IS NOT NULL
  4. 列名 is NOT NULL
  5. #查询没有提成的员工信息
  6. SELECT * FROM t_employees WHERE COMMISSION_PCT IS NULL

枚举查询(IN (值1,值2,值3))

  1. #查询部门编号为70,80,90的员工信息
  2. SELECT * FROM t_employees WHERE DEPARTMENT_ID IN(70,80,90)
  3. SELECT * FROM t_employees WHERE DEPARTMENT_ID=70 OR DEPARTMENT_ID=80 OR DEPARTMENT_ID=90

in 表示包含这些条件的
not in 表示除去这些条件以外的,也就是不包含这些条件的
注意 in的查询效率比较低,可以通过多条件拼接

模糊查询

  1. LIKE _(单个任意字符)
  2. 列名 LIKE '张_'
  3. 这样就只能匹配到例如张三两个字的名字,就不能匹配3个或4个字的名字
  4. LIKE %(任意长度的任意字符串)
  5. 列名 LIKE '张%'
  6. 这样可匹配姓张的所有姓名,无论是几个字的姓名

注意: 模糊查询只能与LIKE关键字结合使用

  1. #查询姓中以l开头所有员工信息
  2. SELECT * FROM t_employees WHERE FIRST_NAME LIKE 'L%'
  3. #查询姓中以l开头并且长度为4的所有员工信息
  4. SELECT * FROM t_employees WHERE FIRST_NAME LIKE 'l___'

分支结构查询

  1. CASE
  2. WHEN 条件1 THEN 结果1
  3. WHEN 条件2 THEN 结果2
  4. WHEN 条件3 THEN 结果3
  5. ELSE 结果
  6. END as '列名'

注意:通过使用CASE END进行条件判断,每条数据对应生成一个值,与java中的switch类似
后面最好在取一个别名否则列名是对应的表达式

  1. #根据薪水划分薪水等级
  2. SELECT * ,
  3. CASE
  4. WHEN SALARY>=1000 AND SALARY <2000 THEN 'A'
  5. WHEN SALARY>=2000 AND SALARY <5000 THEN 'B'
  6. WHEN SALARY>=5000 AND SALARY <9000 THEN 'C'
  7. ELSE 'D'
  8. END AS '月薪等级'
  9. FROM t_employees

时间查询


















































时间函数 描述
SYSDATE() 当前系统时间(日、月、年、时、分、秒)
SYSTIMESTAMP() 当前系统时间(日、月、年、时、分、秒)
CURDATE() 获取当前日期
CURTIME() 获取当前时间
WEEK() 获取指定日期为一年中的第几周
YEAR(DATE) 获取指定日期的年份
HOUR(TIME) 获取指定时间的小时值
MINUTE(TIME) 获取时间的分钟值
DATEDIFF(DATE1,DATE2) 获取DATE1 和 DATE2 之间相隔的天数
ADDDATE(DATE,N) 计算DATE 加上 N 天后的日期
  1. #当前系统时间
  2. SELECT NOW();
  3. #当前系统时间
  4. SELECT SYSDATE(); #2020-09-23 22:42:25
  5. #当前系统日期
  6. SELECT CURDATE(); #2020-09-23
  7. #当前系统时间
  8. SELECT CURTIME(); #22:44:55
  9. #获取指定日期中的年份
  10. SELECT YEAR('2020-09-23'); #2020
  11. #获取小时值
  12. SELECT HOUR(CURTIME()); #22
  13. #获取分钟值
  14. SELECT MINUTE(CURTIME()) #48
  15. #指定日期之差的相隔天数
  16. SELECT DATEDIFF('2020-10-30','2019-10-30'); #366
  17. SELECT DATEDIFF('2019-10-30','2020-10-30'); #-366
  18. #计算Date日期加上N天后的日期
  19. SELECT ADDDATE('2020-10-30',40); #2020-12-09
  20. SELECT ADDDATE('2020-10-30',-40); #2020-09-20

字符串应用






























字符串函数 说明
CONCAT(str1,str2,str…) 将 多个字符串连接
INSERT(str,pos,len,newStr) 将str 中指定 pos 位置开始 len 长度的内容替换为 newStr
LOWER(str) 将指定字符串转换为小写
UPPER(str) 将指定字符串转换为大写
SUBSTRING(str,num,len) 将str 字符串指定num位置开始截取 len 个内容
  1. #多个字符串拼接
  2. SELECT CONCAT('hello','world','java');#helloworldjava
  3. SELECT CONCAT(FIRST_NAME,LAST_NAME) AS '姓名' FROM t_employees;
  4. #字符串大写转换
  5. SELECT LOWER('HELLO'); #hello
  6. #字符串小写转换
  7. SELECT UPPER('hello'); #HELLO
  8. #字符串替换
  9. SELECT INSERT('dyk的数据库',1,3,'mysql'); #mysql的数据库
  10. #指定内容的获取
  11. SELECT SUBSTRING('dyk的mysql数据库',5,8); #mysql数据库

mysql中字符串下标是从1开始的

聚合函数

  1. SELECT 聚合函数(列名) FROM 表名
  2. 对多条数据进行的单列进行统计,返回统计后一行的结果





























聚合函数 说明
SUM() 求所有行中单列结果的总和
AVG() 平均值
MAX() 最大值
MIN() 最小值
COUNT() 求总行数
  1. #聚合函数
  2. SELECT 聚合函数(列名) FROM 表名
  3. #求单列所有数据的和
  4. #SUM()函数返回一组值的总和,SUM()函数忽略`NULL`值。**如果找不到匹配行,则SUM()函数返回`NULL`值。
  5. SELECT SUM(SALARY) FROM t_employees
  6. #求单列所有数据的平均值
  7. #AVG()函数计算一组值的平均值**。 它计算过程中是忽略`NULL`值的
  8. SELECT AVG(SALARY) FROM t_employees
  9. #求单列的最大值
  10. #MAX()函数返回一组值中的最大值
  11. SELECT MAX(SALARY) FROM t_employees
  12. #求单列的最小值
  13. #MIN()函数返回一组值中的最小值
  14. SELECT MIN(SALARY) FROM t_employees
  15. #总行数 员工的数量
  16. #COUNT()函数返回结果集中的行数
  17. SELECT COUNT(EMPLOYEE_ID) FROM t_employees
  18. #统计有提成的人数
  19. SELECT COUNT(COMMISSION_PCT) FROM t_employees

注意:聚合函数会自动忽略null值,不进行统计

分组查询

GROUP BY 语句根据一个或多个列对结果集进行分组

  1. select 列名 from 表名 where 条件 group by 分组依据(列)













关键字 说明
GROUP BY 分组依据,必须在 WHERE 之后生效

或者在分组之后用having来进行筛选

  1. #查询各部门的总人数
  2. #1.按照部门编号进行分组(分组的依据是DEPARTMENT_ID)
  3. #2.再针对各部门的人数进行统计
  4. SELECT DEPARTMENT_ID,COUNT(EMPLOYEE_ID) FROM t_employees GROUP BY DEPARTMENT_ID
  5. #查询各部门的平均工资
  6. #1.按照部门编号进行分组(分组的依据是DEPARTMENT_ID)
  7. #2.再对每个部门的工资进行统计
  8. SELECT DEPARTMENT_ID,AVG(salary) FROM t_employees GROUP BY DEPARTMENT_ID
  9. #查询各个部门,各个岗位的人数
  10. #1.按照部门编号进行分组(分组的依据是DEPARTMENT_ID)
  11. #2.再按照岗位进行分组(分组的依据是JOB_ID)
  12. #3.最后按照各部门各个岗位的人数进行统计
  13. SELECT DEPARTMENT_ID,JOB_ID,COUNT(EMPLOYEE_ID) FROM t_employees GROUP BY DEPARTMENT_ID,JOB_ID

分组查询中,select显示的列只能是分组的依据列或者聚合函数列不能出现其他列
换句话说就是select查询的列中如果不是聚合函数就一定也要在GROUP BY后面写上相应的列

  1. -- 查询address
  2. select address from student3;
  3. -- 使用distinct关键字
  4. select distinct address from student3;
  5. -- group by 分组查询
  6. --这其实跟distinct返回的结果一致
  7. select address from student3 group by address;
  8. -- 当查询多个列的数据时
  9. -- 查询nameaddress
  10. select name,address from student3;
  11. -- distinct试试
  12. -- 这里只是去重了name
  13. select distinct name,address from student3;
  14. -- group by 试试
  15. -- 结果集name,address一组都相同才会去重
  16. select name,address from student3 group by name,address;

分组过滤查询

  1. SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组列 HAVING 过滤规则













关键字 说明
HAVING 过滤规则 过滤规则定义对分组后的数据进行过滤
  1. #统计10,80,90部门的最高工资
  2. #1.按照部门编号进行分组(分组的依据是DEPARTMENT_ID)
  3. #2.再根据过滤条件过滤出部门编号为70,80,90的信息
  4. #3.再求出最大值
  5. SELECT DEPARTMENT_ID,MAX(SALARY) FROM t_employees GROUP BY DEPARTMENT_ID HAVING DEPARTMENT_ID IN(70,80,90)

分组前条件 和 分组后条件 过滤结果集

  • where 分组前条件
  • having 分组后条件

注意:

  1. 1.where 在分组前进行条件过滤,不满足条件的记录不参与分组,不能跟 聚合函数
  2. 2.having 在分组后进行条件限定,不满足限定的记录不会被查询出来, 可以跟 聚合函数

限定查询

  1. SELECT 列名 FROM 表名 LIMIT 起始行,查询行数













关键字 说明
LIMIT offset_start,row_count 限定查询结果的起始行和总行数
  1. #查询员工表中前5名员工的信息
  2. SELECT * FROM t_employees LIMIT 0,5

mysql中没有 top和sql server 不同

mysql中字符串是从1开始的,但是这个起始行还是从0开始的

注意:起始行是从0开始的,代表了第一行,第二个参数代表的是从指定行开始查询几行

  1. -- offset 起始行数,从 0 开始计数,如果省略,默认就是 0
  2. -- size 每页展示的记录数
  3. limit offset,size

公式(记住即可

  1. 起始行数 start=(currPage-1)*size
  2. - currPage 当前页数
  3. - size 每页展示的记录数
  4. 注意:limit 语法是mysql的方言,其它数据库,对于分页有不同的实现方式。

找出当前页数起始行数之间的规律

sql 语句的编写顺序

  1. #sql 语句的编写顺序
  2. SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组 HAVING 过滤条件 ORDER BY 排列顺序(asc|desc LIMIT 起始行,查询行数
  3. 1.FROM :指定数据来源表
  4. 2.WHERE : 对查询数据做第一次过滤
  5. 3.GROUP BY 分组
  6. 4.HAVING : 对分组后的数据第二次过滤
  7. 5.SELECT : 查询各字段的值
  8. 6.ORDER BY : 排序
  9. 7.LIMIT : 限定查询结果
  • 注意:将子查询 ”一行一列“的结果作为外部查询的条件,做第二次查询
  • 子查询得到一行一列的结果才能作为外部查询的等值判断条件

子查询(作为条件判断)

  1. SELECT 列名 FROM 表名 Where 列名 [in(子查询结果);](
  2. #查询工资大于Bruce的员工信息
  3. #1.先查Bruce的工资
  4. SELECT SALARY FROM t_employees WHERE FIRST_NAME='Bruce'
  5. #2.再查工资大于Bruce的员工信息
  6. #合并后的语句为
  7. SELECT * FROM t_employees WHERE SALARY>(SELECT SALARY FROM t_employees WHERE FIRST_NAME='Bruce')

注意: 将子查询” 一行一列”的结果作为外部查询的条件,做第二次查询
子查询表得到的一行一列的结果才能为外部查询的等值判断条件或不等值条件判断

子查询(作为枚举查询条件)

  1. SELECT 列名 FROM 表名 WHERE 列名 IN(子查询结果)
  2. #查询与名为King 同一部门的员工信息
  3. #1.先查询King所在的部门编号
  4. #2.再查询员工信息
  5. #3.合并
  6. SELECT * FROM t_employees WHERE DEPARTMENT_ID IN(SELECT DEPARTMENT_ID FROM t_employees WHERE LAST_NAME='King')

将子查询多行一列的结果作为外部枚举查询条件,做第二次查询

  1. #查询工资高于60部门所有人的信息(高于所有)
  2. SELECT * FROM t_employees WHERE SALARY>ALL(SELECT SALARY FROM t_employees WHERE DEPARTMENT_ID=60 )
  3. #查询工资高于60部门的信息(高于部分)
  4. SELECT * FROM t_employees WHERE SALARY>ANY(SELECT SALARY FROM t_employees WHERE DEPARTMENT_ID=60 )

注意:当子查询结果集形式为多行单列时可以使用ANY或ALL关键字

子查询(作为一张表)

  1. SELECT 列名 FROM (子查询的结果集) WHERE 条件
  2. #1.先对所有员工表的薪资进行排序(排序后的临时表)
  3. #2.再查询临时表的前5行员工信息
  4. SELECT * FROM(SELECT * FROM t_employees ORDER BY SALARY DESC) AS temp LIMIT 0,5
  5. SELECT * FROM t_employees ORDER BY SALARY DESC LIMIT 0,5

将子查询多行多列的结果作为外部查询的一张表,做第二次查询,

注意:子查询作为临时表,为其赋予一个临时表名,否则会报错

合并查询

UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。如果允许重复的值,请使用 UNION ALL。

  1. SELECT * FROM 表名1 UNION SELECT * FROM 表名2
  2. SELECT * FROM 表名1 UNION ALL SELECT * FROM 表名2
  3. #合并两张表的结果(去除重复记录)
  4. SELECT * FROM t1 UNION SELECT * FROM t2
  5. #合并两张表的结果(保留重复记录)
  6. SELECT * FROM t1 UNION ALL SELECT * FROM t2

注意: 合并结果的两张表,列数必须相同,列的数据类型可以不同
使用union合并结果集,会去除两张表中重复的数据

  1. 注意:
  2. 1UNION 结果集中的列名总是等于第一个 SELECT 语句中的列名
  3. 2UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。union只关注数据类型,数据业务含义是否相同不管。

表连接查询

  1. SELECT 列名 FROM 1 连接方式 2 ON 连接条件

内连接查询(INNER JOIN ON)

  1. SELECT * FROM t_employees a INNER JOIN t_jobs b ON a.JOB_ID=b.JOB_ID
  2. SELECT * FROM t_employees a,t_jobs b WHERE a.JOB_ID=b.JOB_ID

三表连接查询

  1. SELECT * FROM t_employees a INNER JOIN t_departments b ON a.DEPARTMENT_ID=b.DEPARTMENT_ID INNER JOIN t_locations c ON b.LOCATION_ID=c.LOCATION_ID

3张表两两相关联

左外连接(left join on)

  1. #查询所有员工信息及所对应的部门名称
  2. SELECT * FROM t_employees a LEFT JOIN t_departments b ON a.DEPARTMENT_ID=b.DEPARTMENT_ID

注意:左连接查询是以左表为主表,依次向右匹配,匹配到返回结果,匹配不到则返回NULL值填充

右链接查询(right join on)

  1. #查询所有员工信息及所对应的部门名称
  2. SELECT * FROM t_employees a RIGHT JOIN t_departments b ON a.DEPARTMENT_ID=b.DEPARTMENT_ID

注意右连接查询是以右表为主表,依次向左匹配,匹配到返回结果,匹配不到则返回NULL值填充

蠕虫复制

什么是蠕虫复制:在已有的数据基础之上,将原来的数据进行复制,插入到对应的表中
语法格式:INSERT INTO 表名1 SELECT * FROM 表名2;
作用:将表名2中的数据复制到表名1
具体操作:

  • 创建student2表,student2结构和student表结构一样

    CREATE TABLE student2 LIKE student;

将student表中的数据添加到student2表中

  1. INSERT INTO student2 SELECT * FROM student;

事务的概念

事务是一个原子操作,是一个最小执行单元,可以由一个或多个SQL语句组成,在同一个事务当中所有SQL语句都成功执行时,整个事务成功,有一个sql语句执行失败,整个事务都执行失败。

事务的边界

开始:连接到数据库,执行一条DML语句,上个事务结束后,又输入了一条DML语句,即事务的开始

结束:
1提交:
a.显示提交:commit
b.隐式提交:一条创建,删除的语句,正常退出(客户端退出连接);
2回滚:
a.显示回滚:rollback;
b.隐式回滚:非正常退出(断电,)执行了创建,删除的语句,但是失败了,回味这个无效的执行回滚

事务的原理

数据库会为每一个客户端都维护一个独立的缓存区(回滚段中)只有事务所有sql语句均正常结束(commit)才会将回滚段中的数据同步到数据库,否者无论因为那种原因失败,整个事务将回滚(rollback)

事务的特性

在这里插入图片描述

事务的应用

应用环境:基于增删改查语句的操作结果(均返回操作后受影响的行数)可以通过程序逻辑手动控制事务提交或回滚

  1. CREATE TABLE bank(
  2. id INT,
  3. money INT
  4. )
  5. INSERT INTO bank(id,money) VALUES(1,1000)
  6. INSERT INTO bank(id,money) VALUES(2,500)
  7. #1账户给2账户转钱
  8. START TRANSACTION #开启事务
  9. #事务内数据操作语句
  10. UPDATE bank SET money=money-200 WHERE id=1;
  11. UPDATE bank SET money=money+200 WHERE id=2;
  12. #事务内语句执行成功了 执行commit
  13. COMMIT
  14. #事务内如果出现错误,执行rollback
  15. ROLLBACK
  16. SELECT * FROM bank

注意:开启事务后,执行的语句均属于当前的事务,成功再执行commit,失败要进行rollback

权限管理

创建用户

  1. CREATE USER 用户名 IDENTIFIED BY 密码

创建一个用户

  1. #创建一个zhangsan用户
  2. CREATE USER `zhangshan` IDENTIFIED BY '123456'

授权

  1. GRANT ALL ON 数据库.表 TO 用户名
  2. #将db3 下的所有表的权限都赋值给zhangshan
  3. GRANT ALL ON db3.* TO `zhangshan`

撤销用户权限

  1. #将zhangshan的db3权限取消
  2. REVOKE ALL ON db3.* FROM `zhangshan`;

注意:撤销权限后,账户要更新连接客户端才会生效

删除用户

  1. DROP USER 用户名
  2. DROP USER `zhangshan`

视图

视图,虚拟表,从一个表或多个表查询出来的表,作用和真实表一样包含一系列带有行和列的数据,视图中,用户可以使用select 语句查询数据,也可以使用INSERT ,UPDATE,DELETE修改记录,视图可以使用用户操作方便,并保障数据库系统安全

视图特点

优点
简单化,数据所见所得
安全性,用户只能查询或修改他们所能见到得到的数据
逻辑独立性,可以屏蔽真实表结构变化带来的影响
缺点
性能相对较差,简单的查询也变得稍微复杂
修改不方便,特别是复杂的聚合视图基本无法修改

视图的创建

  1. CREATE VIEW 视图名 AS 查询数据源表语句

创建视图

  1. #创建视图
  2. CREATE VIEW t_empinfo AS SELECT * FROM t_employees;
  3. #使用视图
  4. SELECT * FROM t_empinfo

视图的修改

  1. 方式一 create or replace view
  2. 方式二 alter view 视图名 as 查询语句

修改视图

  1. #方式 1:如果视图存在则进行修改,反之,进行创建
  2. CREATE OR REPLACE VIEW t_empInfo
  3. AS
  4. SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,SALARY,DEPARTMENT_ID from t_employees;
  5. #方式 2:直接对已存在的视图进行修改
  6. ALTER VIEW t_empInfo
  7. AS
  8. SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,SALARY from t_employees;

删除视图

注意:删除视图不会影响原表

  1. #删除t_empInfo视图
  2. DROP VIEW t_empInfo;
  3. 在这里插入代码片

视图的注意事项

  1. 注意:
  2. - 视图不会独立存储数据,原表发生改变,视图也发生改变。没有优化任何查询性能。
  3. - 如果视图包含以下结构中的一种,则视图不可更新
  4. - 聚合函数的结果
  5. - DISTINCT 去重后的结果
  6. - GROUP BY 分组后的结果
  7. - HAVING 筛选过滤后的结果
  8. - UNIONUNION ALL 联合后的结果

练习

  1. # 服务和登录
  2. # 1.cmd中打开服务窗口的命令
  3. net START mysql
  4. # 2.cmd中启动和停止mysql服务的命令
  5. net STOP mysql
  6. # 使用root账号root密码登录的命令
  7. mysql -u root -p
  8. # 退出登录的命令
  9. quit
  10. EXIT
  11. \q
  12. # 库的操作
  13. # 查询mysql服务器中一共有多少个数据库
  14. SHOW DATABASES
  15. # 查询当前正在使用的数据库
  16. SELECT DATABASE()
  17. #创建一个数据库db1,并判断该库是否不存在,指定字符集为utf8:
  18. CREATE DATABASE IF NOT EXISTS db1 CHARACTER SET utf8
  19. #使用db1,然后查看当前使用的数据库是否为db1:
  20. USE db1
  21. SELECT DATABASE()
  22. # 修改db1的字符集为gbk
  23. ALTER DATABASE db1 CHARACTER SET gbk
  24. ALTER DATABASE db1 CHARSET gbk
  25. # 查看db1的字符集:
  26. SHOW CREATE DATABASE db1
  27. # 再修改db1的字符集为utf8
  28. ALTER DATABASE db1 CHARACTER SET utf8
  29. ALTER DATABASE db1 CHARSET utf8
  30. # 再查看db1的字符集
  31. SHOW CREATE DATABASE db1
  32. # 删除db1,并判断是否存在
  33. DROP DATABASE IF EXISTS db1
  34. #表的操作
  35. #新建一个数据库db1
  36. CREATE DATABASE IF NOT EXISTS db1
  37. #使用数据库db1
  38. USE db1
  39. #查看db1中有多少张表
  40. SHOW TABLES
  41. # 新建一个学员表student,有学员编号id,学员姓名name,年龄age三个列
  42. CREATE TABLE student(
  43. id INT PRIMARY KEY ,
  44. NAME VARCHAR(20) NOT NULL,
  45. age INT
  46. )CHARSET=utf8
  47. #将student表复制一份,新表命名为stu
  48. CREATE TABLE stu LIKE student
  49. #查看stu表的结构
  50. DESC stu
  51. # 查看stu表的创建语句
  52. SHOW CREATE TABLE stu
  53. #修改stu表名为stu1
  54. ALTER TABLE stu RENAME stu1
  55. #修改stu表的字符集为gbk
  56. ALTER TABLE stu CHARACTER SET gbk
  57. #查看stu表的字符集
  58. SHOW CREATE TABLE stu
  59. #给stu添加一个列,生日birthday
  60. ALTER TABLE stu ADD birthday DATE
  61. #修改birthday为birth
  62. ALTER TABLE stu CHANGE birthday birth DATE
  63. #删除生日这一列
  64. ALTER TABLE stu DROP birth
  65. #删除student这个表,并判断是否存在
  66. DROP TABLE IF EXISTS student
  67. #dml
  68. #1. 给stu表新增一条数据,所有的列都要有数据
  69. INSERT INTO stu(id,NAME,age) VALUES(1,'dyk',18)
  70. #2. 给stu表新增一条数据,只给id和name:
  71. INSERT INTO stu(id,NAME) VALUES(2,'cb')
  72. #3. 给stu表一次新增3条数据:
  73. INSERT INTO stu(id,NAME,age) VALUES(3,'dyk',18),(4,'dyk2',19),(5,'dyk3',20)
  74. #4. 修改stu表中id为1的记录,姓名改为tom,年龄改为20:
  75. UPDATE stu SET NAME='tom',age=20 WHERE id=1
  76. #5. 删除id为2的记录:
  77. DELETE FROM stu WHERE id=2
  78. #6. 删除所有的记录:
  79. DELETE FROM stu
  80. #7. 给stu表新增一条数据,只给id和name:
  81. INSERT INTO stu(id,NAME) VALUES(2,'cb')
  82. #8. 删除所有记录,使用truncate:
  83. TRUNCATE stu
  84. CREATE DATABASE FwDB
  85. #用户信息表(发表出租房屋信息的用户)UserInfo:
  86. CREATE TABLE UserInfo(
  87. UserId INT PRIMARY KEY AUTO_INCREMENT,
  88. UserName VARCHAR(30) NOT NULL,
  89. UserTel VARCHAR(11) NOT NULL
  90. )CHARSET=utf8
  91. # 房屋类型表(FwLx)
  92. CREATE TABLE FwLx(
  93. LxId INT PRIMARY KEY AUTO_INCREMENT,
  94. LxName VARCHAR(20) NOT NULL UNIQUE
  95. )CHARSET=utf8
  96. #房屋信息表(FwXx)
  97. CREATE TABLE FwXx(
  98. FwId INT PRIMARY KEY AUTO_INCREMENT,
  99. LxId INT REFERENCES Fwlx(LxId),
  100. FwDiZhi VARCHAR(60) NOT NULL,
  101. shi INT NOT NULL,
  102. ting INT NOT NULL,
  103. ZuJin INT NOT NULL,
  104. FwDesp VARCHAR(500),
  105. userId INT REFERENCES UserInfo(UserId)
  106. )CHARSET=utf8
  107. INSERT INTO UserInfo(UserName,UserTel) VALUES('dyk','13797892836'),('cb','17362942385'),('wl','13477358481');
  108. INSERT INTO FwLx(LxName) VALUES('平房'),('地下室'),('公寓')
  109. INSERT INTO FwXx(LxId,FwDiZhi,shi,ting,ZuJin,FwDesp,userId) VALUES(1,'wh',1,2,10000,'很好',1)
  110. INSERT INTO FwXx(LxId,FwDiZhi,shi,ting,ZuJin,FwDesp,userId) VALUES(2,'bj',1,2,10000,'很好',3)
  111. INSERT INTO FwXx(LxId,FwDiZhi,shi,ting,ZuJin,FwDesp,userId) VALUES(3,'sh',1,2,7000,'很好',2)
  112. # 1.删除租金大于8000的房屋信息
  113. DELETE FROM FwXx WHERE ZuJin>8000
  114. #2.查询所有1室2厅的房屋信息
  115. SELECT * FROM FwXx WHERE shi=1 AND ting=2
  116. # 3.查询租金在200-500之间的房屋信息
  117. SELECT * FROM FwXx WHERE ZuJin BETWEEN 200 AND 500
  118. #4.查询房屋类型为‘地下室’的房屋信息
  119. SELECT * FROM FwXx INNER JOIN FwLx ON FwXx.LxId=FwLx.LxId WHERE FwLx.LxName='地下室'
  120. #5.查询房屋说明中有“好”字的房屋编号、租金和联系人姓名以及电话
  121. SELECT FwXx.FwId,ZuJin,UserName,UserTel FROM FwXx INNER JOIN UserInfo ON FwXx.userId=UserInfo.UserId WHERE FwDesp LIKE '%好%'
  122. # 6.查询房屋类型为“公寓”或“别墅”的房屋信息
  123. SELECT * FROM FwXx INNER JOIN FwLx ON FwXx.LxId=FwLx.LxId WHERE LxName IN('公寓','别墅')
  124. #7.查询房屋类型为“平房”的房屋的编号、租金、联系人姓名以及电话
  125. SELECT FwLx.LxId,FwXx.ZuJin,UserInfo.UserName,UserInfo.UserTel FROM UserInfo INNER JOIN FwXx ON FwXx.userId = UserInfo.UserId
  126. INNER JOIN FwLx ON FwLx.LxId=FwXx.LxId WHERE LxName='平房'
  127. #8.查询房屋地址在光谷的房屋信息,并按租金降序显示查询结果
  128. SELECT * FROM FwXx WHERE FwDiZhi='光谷' ORDER BY ZuJin DESC
  129. #9.查询所有房屋的数量,平均租金,最高租金,以及最低租金
  130. SELECT COUNT(FwId),AVG(ZuJin),MAX(ZuJin),MIN(ZuJin) FROM FwXx
  131. # 10.查询房屋类型是“平房”的最高租金
  132. SELECT MAX(ZuJin) FROM FwXx INNER JOIN FwLx ON FwXx.LxId=FwLx.LxId WHERE LxName='平房'
  133. # 11.查询每种类型的房屋的数量,平均租金,最高租金,以及最低租金
  134. SELECT COUNT(FwId),AVG(ZuJin),MAX(ZuJin),MIN(ZuJin) FROM FwXx GROUP BY LxId
  135. # 13.查询房屋的编号,房号地址,房屋租金,类型名称、发布用户的姓名和联系电话
  136. SELECT FwId,FwDiZhi,ZuJin,FwLx.LxName,UserInfo.UserName,UserInfo.UserTel FROM UserInfo INNER JOIN FwXx ON FwXx.userId = UserInfo.UserId
  137. INNER JOIN FwLx ON FwLx.LxId=FwXx.LxId
  138. # 14.查询联系人姓名为“张三”的所有的房屋信息
  139. SELECT * FROM FwXx INNER JOIN UserInfo ON FwXx.userId=UserInfo.UserId WHERE UserName='张三'
  140. # 15.查询没有发布房屋信息的联系人信息
  141. SELECT * FROM UserInfo INNER JOIN FwXx ON FwXx.userId=UserInfo.UserId WHERE FwDesp IS NULL

发表评论

表情:
评论列表 (有 0 条评论,1005人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySQL基础知识

    一、初始MySQL 1.数据库和SQL概述 1.1 数据库简介 数据库指的是长期存在计算机内、有组织、可共享的、大量数据的集合。数据是按照特定的数据模型来组织

    相关 MySQLMySQL索引基础知识

    1.索引是什么 索引是一种能提高数据库查询效率的数据结构。它可以比作一本字典的目录,可以帮你快速找到对应的记录。 索引一般存储在磁盘的文件中,它是占用物理空间的。

    相关 mysql基础知识

    一、启动与退出 1、进入MySQL: 启动MySQL Command Line Client(MySQL的DOS界面),直接输入安装时的密码即可。此时的提示符是:mys

    相关 MySQL基础知识

    MySQL基础知识 死锁 对于死锁问题,数据库系统实现了各种死锁检测和死锁超时机制。越复杂的系统,比如 Innodb存储引擎,越能检测到死锁的循环依赖,并立即返回一

    相关 MySQL基础知识

    对于数据库管理软件来说,各种语言通过各自提供的驱动程序来完成和数据库管理软件的交互; 对于非程序员来说,提供了一些命令,这些命令可以通过调用编程`API`来完成数据

    相关 MySQL基础知识

    SQL语句是对所有关系数据库都通用的命令语句,而JDBC API只是执行SQL语句的工具。JDBC允许对不同的平台、不同的数据库采用相同的编程接口来执行SQL语句。 MySQ