目录
概述
概念
MySQL启动与停止
客户端连接
关系型数据库(RDBMS)
SQL
数据类型
DDL
DML
DQL
DCL
函数
字符串函数
数值函数
日期函数
流程函数
约束
多表查询
多表关系
笛卡尔积
内连接
外连接
自连接
联合查询
子查询
事务
概述
概念
- 数据库(DB)-数据存储的仓库
- 数据库管理系统(DBMS)-操纵和管理数据库的大型软件
- 数据库系统(DBS)-是由数据库及其管理软件组成的系统。
- SQL-操作关系型数据库的编程语言,是一套标准
MySQL启动与停止
启动
net start mysql80
停止
net stop mysql80
客户端连接
cmd指令
mysql [-h 127.0.0.1] [-P 3306] -u root -p
关系型数据库(RDBMS)
建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
特点:
- 使用表存储数据,格式统一,便于维护
- 使用SQL语言操作,标准统一,使用方便
SQL
数据类型
数值类型:主要是不同大小的整型。
字符串类型:主要理清char(定长字符串)和varchar(变长字符串)的区别。
日期类型:常用DATE,注意日期要写在单引号内部:
类型 | 描述 | 大小 | 格式 | 范围 |
---|---|---|---|---|
DATE | 日期值 | 3 | YYYY-MM-DD | 1000-01-01至9999-12-31 |
DDL
Data Definition Language | 数据定义语言,用来定义数据对象(数据库,表,字段) |
数据库操作
1.查询所有数据库:SHOW DATABASES;
2.查询当前数据库:SELECT DATABASE();
3.创建:CREATE DATABASE IF NOT EXISTS 数据库名 DEFAULT CHARSET 字符集 COLLATE 排序规则;
4.删除:DROP DATABASE IF EXISTS 数据库名;
5.使用:USE 数据库名;
表操作
1.查询当前数据库所有表
SHOW TABLES;
DESC 表名;
SHOW CREATE TABLE 表名;
4.创建表
CREATE TABLE 表名(字段1 字段1类型[COMMENT 字段1注释],字段2 字段2类型[COMMENT 字段2注释],字段3 字段3类型[COMMENT 字段3注释],......字段n 字段n类型[COMMENT 字段n注释]
)[COMMENT 表注释];
5.添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释];
6.修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
7.修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释];
8.删除字段
ALTER TABLE 表名 DROP 字段名;
9.修改表名
ALTER TABLE 表名 RENAME TO 新表名;
10.删除表
DROP TABLE [IF EXISTS] 表名;
11.删除指定表,并重新创建该表
TRUNCATE TABLE 表名;
DML
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作。
1.给指定字段添加数据:
INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...);
2.给全部字段添加数据:
INSERT INTO 表名 VALUES(值1,值2,...);
3.批量添加数据:
INSERT INTO 表名(字段名1,字段名2,...) VALUES(值1,值2,...),(值1,值2,...),(值1,值2,...),...;
INSERT INTO 表名 VALUES(值1,值2,...),(值1,值2,...),...;
4.修改数据:
UPDATE 表名 SET 字段名1=值1,字段名2=值2,... [WHERE 条件];
5.删除数据:
DELETE FROM 表名 [WHERE 条件];
DQL
DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记录。
- 基本查询
- 条件查询(WHERE)
- 聚合函数(count、max、min、avg、sum)
- 分组查询(GROUP BY)
- 排序查询(ORDER BY)
- 分页查询(LIMIT)
简单提一些容易忘记的知识点:
1.去除重复记录的关键字:distinct
SELECT DISTINCT 字段列表 FROM 表名;
2.where与having(分组查询关键字)的区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
执行顺序:where > 聚合函数 > having
3.排序查询中:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序。
4.分页查询:
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
起始索引从0开始,起始索引= (查询页码-1)*每页显示记录数
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT
如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10
5.查询语句编写顺序和执行顺序:
编写顺序:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数--------------------------------------------------------------
执行顺序:
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
SELECT
字段列表
ORDER BY
排序字段列表
LIMIT
分页参数
DCL
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。
1.查询用户
USE mysql;
SELECT * FROM user;
2.创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
3.修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
4.删除用户
DROP USER '用户名'@'主机名';
注意:
- 主机名可以使用通配符‘%’。
- 这类SQL开发人员操作得比较少,主要是DBA(Database Administrator 数据库管理员)使用。作简单了解
5.查询权限
SHOW GRANTS FOR '用户名'@'主机名';
6.授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
7.撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意:
- 多个权限之间,使用逗号分隔
- 授权时,数据库名和表名可以使用*进行通配,代表所有
函数
字符串函数
函数 | 功能 |
---|---|
CONCAT(S1,S2,...Sn) | 字符串拼接,将S1,S2,...Sn拼接成一个字符串 |
LOWER(str) | 将字符串str全部转为小写 |
UPPER(str) | 将字符串str全部转为大写 |
LPAD(str,n,pad) | 左填充,用字符串pad对str的左边进行填充,达到n个字符串长度 |
RPAD(str,n,pad) | 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
TRIM(str) | 去掉字符串头部和尾部的空格 |
SUBSTRING(str,start,len) | 返回从字符串str从start位置起的len个长度的字符串 |
数值函数
函数 | 功能 |
---|---|
CEIL(x) | 向上取整 |
FLOOR(x) | 向下取整 |
MOD(x,y) | 返回x/y的模 |
RAN() | 返回0~1内的随机数,小数位数随机、不包含0和1 |
ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
日期函数
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME() | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(date) | 获取指定date的年份 |
MONTH(date) | 获取指定date的月份 |
DAY(date) | 获取指定date的日期 |
DATE_ADD(date,INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
DATEDIFF(date1,date2) | 返回起始时间date1和结束时间date2之间的天数 |
流程函数
作用类似于C语言的三目操作符
函数 | 功能 |
---|---|
IF(value,t,f) | 如果value为true,则返回t,否则返回f |
IFNULL(value1,value2) | 如果value不为空,返回value1,否则返回value2 |
CASE WHEN [val1] THEN [res1] ... ELSE [default] END | 如果val1为true,返回res1,... 否则返回default默认值 |
CASE [expr] WHEN [val1] THEN [res1] ... ELSE [default] END | 如果expr的值等于val1,返回res1,...否则返回default默认值 |
约束
- 概念:约束是作用于表中字段上的规则,用于限制存储在表中数据。
- 目的:保证数据库中数据的正确、有效性和完整性。
- 分类:
约束 | 描述 | 关键字 |
---|---|---|
非空约束 | 限制该字段的数据不能为NULL | NOT NULL |
唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIQUE |
主键约束 | 主键是一行数据的为唯一标识,要求非空且唯一 | PRIMARY KEY |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束(8.0.16版本之后) | 保存字段值满足某一个条件 | CHECK |
外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | FOREIGN KEY |
一般的约束我们看一下之前的例题就可以明白其用法:
- 根据需求,完成表格的创建:
字段名 | 字段含义 | 字段类型 | 约束条件 | 约束关键字 |
---|---|---|---|---|
id | ID唯一标识 | int | 主键,并且自动增长 | PRIMARY KEY,AUTO_INCREMENT |
name | 姓名 | varchar(10) | 不为空,并且唯一 | NOT NULL,UNIQUE |
age | 年龄 | int | 大于0,并且小于等于120 | CHECK |
status | 状态 | char(1) | 如果没有指定该值,默认为1 | DEFAULT |
gender | 性别 | char(1) | 无 |
create table user(id int primary key auto_increment comment '主键',name varchar(10) not null unique comment '姓名',age int check(age > 0 and age <= 120) comment '年龄',status char(1) default '1' comment '状态',gender char(1) comment '性别'
) comment '用户表';
重点看一下外键的用法:
添加外键
CREATE TABLE 表名(字段名 数据类型,...[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主列表名)
);-- 或
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCE 主表 (主列表名);
删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
外键删除/更新行为
行为 | 说明 |
---|---|
NO ACTION | 当在父表中删除/更新对应记录时,首先检查记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致) |
RESTRICT | 当在父表中删除/更新对应记录时,首先检查记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致) |
CASCADE | 当在父表中删除/更新对应记录时,首先检查记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。 |
SET NULL | 当在父表中删除对应记录时,首先检查记录是否有对应外键,如果有则设置子表中该外键值为null(要求该外键允许取null) |
SET DEFAULT | 父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持) |
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCE 主表 (主列表名)ON UPDATE CASCADE ON DELETE CASCADE;
多表查询
多表关系
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
- 一对多(多对一)
- 多对多
- 一对一
笛卡尔积
笛卡尔积是指在数学中,两个集合A和集合B的所有的组合情况。
例如A、B 和1、2、3、4组合,不同的组合情况就有八种:
- A 1
- A 2
- A 3
- A 4
- B 1
- B 2
- B 3
- B 4
所以,在多表查询时,需要消除无效的笛卡尔积。
内连接
隐式内连接
SELECT 字段列表 FROM 表1,表2 WHERE 条件...;
显式内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;
外连接
左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;
相当于查询表1(左表)的所有数据,包含表1和表2交集部分的数据
右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件...;
相当于查询表2(右表)的所有数据,包含表1和表2交集部分的数据
自连接
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;
自连接查询,可以是内连接查询,也可以是外连接查询。
联合查询
查询语法
SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...;
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
union all会将全部的数据直接合并在一起,union会对合并之后的数据去重。
子查询
SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT 的任何一个。
根据子查询的结果不同,分为:
- 标量子查询(子查询结果为单个值)
- 列子查询(子查询结果为一列)
- 行子查询(子查询结果为一行)
- 表子查询(子查询结果为多行多列)
根据子查询位置,分为:WHERE之后、FROM之后、SELECT之后。
事务
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
1.事务操作
START TRANSACTION; -- 开启事务
COMMIT / ROLLBACK; -- 提交/回滚事务
2.事务四大特性
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
原子性(Atomicity)
- 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
当一个事务在执行时,它会将一组SQL语句放在同一批次内去执行。如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。
一致性(Consistency)
- 事务完成时,必须使所有的数据保持一致状态。
例如,银行转账可以分解为两个动作:从A账户中扣除资金额X,然后将资金额X加到B账户中。如果在这个过程中发生了错误,那么整个操作都应该被回滚到初始状态。保证A和B加起来的账户余额要和初始状态一致。
隔离性(Isolation)
- 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
例如,一个事务正在修改某个数据项,此时另一个事务也想要修改这个数据项,但是由于隔离性的存在,第二个事务会等待第一个事务完成修改后再进行修改 。
持久性(Durability)
- 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
事务一旦提交,它对数据库的改变就应该是永久性的(将数据提交保存在了硬盘中),接下来的其他操作或故障不应该对本次事务的修改有任何影响 。
3.并发事务问题
(1)脏读
一个事务读到另外一个事务还没有提交的数据。
(2)不可重复读
一个事务先后读到同一条记录,但两次读取的数据不同,称之为不可重复读。
(3)幻读
一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。
4.事务隔离级别
READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE(串行化)
END