MYSQL[学习记录]

基础

SQL

SQL通用语法:

  1. 可以单行或多行书写,以分号结尾。
  2. 使用 空格 和 缩进 增加语句的可读性。
  3. 语句 不区分大小写,关键字建议使用大写。
  4. 单行注释:# 注释内容,多行注释:/* 注释内容 */

SQL分类:

分类 全程 说明
DDL Data Definition Language 数据定义语言,用来定义数据库对象
DML Data Manipulation Language 数据操作语言,用来对数据库中表的数据进行增删改查
DQL Data Query Language 数据查询语言,用来查询数据库中表的记录
DCL Data Control Language 数据控制语言,用来创建数据库用户,控制数据库的访问权限

DDL 数据定义语言

数据库操作:

查询:

  • 查询所有数据库。
    SHOW DATABASES;
  • 查询当前数据库。
    SELECT DATABASE();

创建:
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];

删除:
DROP DATABASE [IF EXISTS] 数据库名;

使用:
USE 数据库名;

表操作:

查询:

  • 查询当前数据库所有表。
    SHOW TABLES;
  • 查询表结构。
    DESC 表名;
  • 查询指定表的建表语句。
    SHOW CREATE TABLE 表名;

创建:

CREATE TABLE 表名(
	字段1 字段1类型 [COMMENT 字段1注释],
	字段2 字段2类型 [COMMENT 字段2注释],
	...
) [COMMENT 表注释];

修改:

  • 添加字段。
    ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
  • 修改字段。
    ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
  • 删除字段。
    ALTER TABLE 表名 DROP 字段名;
  • 修改表名。
    ALTER TABLE 表名 RENAME TO 新表名;
  • 删除表。
    DROP TABLE [IF EXISTS] 表名;
  • 删除表并重建。
    TRUNCATE TABLE 表名;

DML 数据操作语言

添加数据:

  • 给指定字段添加数据。
    INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
  • 给所有字段添加数据。
    INSERT INTO 表名 VALUES (值1, 值2, ...);
  • 给指定字段批量添加数据。
    INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...);
  • 给所有字段批量添加数据。
    INSERT INTO 表名 VALUES (值1, 值2, ...), (值1, 值2, ...);

修改数据:

UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2, ... [WHERE 条件];

删除数据:

DELETE FROM 表名 [WHERE 条件]

DQL 数据查询语言

基本查询:

  • 查询多个字段。
    SELECT 字段1, 字段2, ... FROM 表名;
    SELECT * FROM 表名;
  • 设置别名。
    SELECT 字段1 [AS 别名1], 字段2 [AS 别名2] ... DROM 表名;
  • 去重复记录。
    SELECT DISTINCT 字段列表 FROM 表名;

条件查询:

  • 语法:

SELECT 字段列表 FROM 表名 WHERE 条件列表;

  • 条件:
运算符 功能 运算符 功能
<> 或 != 不等于 BETWEEN … AND … 在某个范围之内
IN(…) 选出在列表中的值 LIKE 占位符 模糊匹配
IS NULL 是 NULL NOT 或 ! 不是

聚合函数:

  • 介绍:

将一列数据作为一个整体,进行纵向计算。

  • 常见函数:
函数 功能 函数 功能
count 计数(null 值不参与) max 最大值
min 最小值 avg 平均值
sum 求和

分组查询:

  • 语法:

SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];

  • 要点:
  1. where 在分组之前进行过滤,不满足 where 条件不参与分组;而 having 是分组后对结果进行过滤。
  2. where 不能对聚合函数进行判断,而 having 可以。

排序查询:

  • 语法:

SELECT 字段列表 FROM 表名 GROUP BY 字段1 排序方式1, 字段2 排序方式2;

  • 排序方式:

ASC:升序(默认)。
DESC:降序。

分页查询:

  • 语法:

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;

  • 要点:
  1. 起始索引从 0 开始,起始索引 = (页码 - 1) * 每页数量。
  2. 不同数据库分页查询实现方法不同。
  3. 若查询第一页数据,起始索引可以省略。
  • 执行顺序:
SELECT 字段列表			// 4
FROM 表名列表  			// 1
WHERE 条件列表 			// 2
GROUP BY 分组字段列表 	// 3
HAVING 分组后条件列表	// 7
ORDER BY 排序字段列表 	// 5
LIMIT 分页参数			// 6

DCL 数据控制语言

管理用户:

  • 查询用户:
    USE mysql;
    SELECT * FROM user;
  • 创建用户:
    CREATE USER '用户名‘@’主机名 IDENTIFIED BY '密码';
  • 修改用户密码:
    ALTER USER '用户名‘@’主机名 IDENTIFIED WITH mysql_native_password BY '新密码';
  • 删除用户:
    DROP USER '用户名'@'主机名';

权限控制:

  • 查询权限:
    SHOW GRANTS FOR '用户名‘@’主机名';
  • 授予权限:
    GRANT 权限列表 ON 数据库名.表名 TO '用户名‘@’主机名';
  • 撤销权限:
    REVOKE 权限列表 ON 数据库名.表名 FROM '用户名‘@’主机名';

函数

字符串函数

函数 功能
CONCAT(S1, S2, …) 字符串拼接
LOWER(str) 将 str 变为 小写
UPPER(str) 将 str 变为大写
LPAD(str, n, pad) 左填充, 达到 n 个长度
RPAD(str, n, pad) 右填充, 达到 n 个长度
TRIM(str) 去掉 str 头尾的空格
SUBSTRAING(str, start, len) 返回字符串从 start 到 len 的子串 (索引从 1 开始)

数值函数

函数 功能
CEIL(x) 向上取整
FLOOR(x) 向下取整
MOD(x, y) 返回 x / y 的模
RAND() 返回 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) 返回日期加上一个时间间隔后的值
DATEDIFF(data1, data2) 返回 date1 到 date2 之间的天数 (date1 - date2)

流程函数

函数 功能
IF(value, t, f) 如果 value 为 true, 则返回 t, 否则返回 f
IFNULL(value1, value2) 如果 value1 不为空, 则返回 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 默认值

约束

约束演示

概念: 约束作用于表中字段上的规则,用于限制存储在表中的数据。

分类:

约束 描述 关键字
非空约束 字段的数据不能为空 NOT NULL
唯一约束 保证字段的所有数据唯一 UNIQUE
主键约束 主键要求非空且唯一 PRIMARY KEY
默认约束 若未指定字段值,采用默认值 DEFAULT
检查约束 保证字段值满足一个条件 CHECK
外键约束 用来让两张表间建立连接 FOREIGN KEY

示例:

create table user (
	id int primary key auto_increment comment '主键', # 主键,并且自动增长。
	name varchar(10) not null unique comment '姓名',  # 不为空,并且唯一
	age int check(age > 0 && age <= 120) comment '年龄', # 检查约束
	status char(1) default '1' comment '状态'		 # 默认状态
) comment '用户表';

外键约束

概念: 外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

  • 添加外键:
CREATE TABLE 表名 (
	字段名 数据类型,
	...
	[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主表列名)
);

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名);
  • 删除外键:
    ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
  • 删除与更新操作:
    CASCADE:删掉与之相关的数据;SET NULL:将与之相关的数据值为 NULL。
    ALTER TABLE 表名 ADD CONSTRINT 外键名称 FORENGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;

多表查询

视频链接

内连接

概念: 内连接是查询两张表交集的部分。

语法:

  • 隐式内连接:
    SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;
  • 显示内连接:
    SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;

外连接

概念: 左/右 外连接是查询 左/右 表所有数据及两表交集的部分。

语法:

  • 左外连接:
    SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件 ...;
  • 右外连接:
    SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件 ...;

自连接

概念: 自己连接自己进行查询。可以是内连接查询,可以是外连接查询。

语法:
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;

联合查询

概念: 对于 union 查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。

语法:

SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...;

子查询

概念: SQL 语句中嵌套 SELECT 语句,称为嵌套查询,又称子查询。

语法:
SELECT * FROM t1 WHERE colume = (SELECT coluun1 FROM t2);

查询结果分类及示例:

  • 标量子查询。(查询结果为单个值)
    select * from emp where dept_id = (selct id from dept where name = '销售部');
  • 列子查询。(查询结果为一列)
    select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部');
  • 行子查询。(查询结果为一行)
    select * from emp where (salary, managerid) = (select salary, managerid fro memp where name = '张无忌');
  • 表子查询。(查询结果为多行多列)
    select * from emp where (job, salary) in (select job, salary from emp where name = '魔杖' or name = ‘宋远’);

事务

概念: 事务是一组操作的集合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,要么全部成功,要么全部失败。

演示:

select @@autocommit;	# 查看提交方式,1 为自动
set @@autocommit = 0;	# 设为手动提交 0
# 方式二 start transaction 
# 1. 查询张三账户余额。
select * from account where name = '张三';
# 2. 将张三账户余额减1000。
update account set money = money - 1000 where name = '张三';
# 3. 将李四账户余额加1000。
update account set money = money + 1000 where name = '李四';
# 提交事务
commit;
# 回滚事务
rollback;

事务操作

查看/设置事务提交方式:
SELECT @@autocommit;
SET @@autocommit = 0;

开启事务:
START TRANSACTION 或 BEGIN;

提交事务
COMMIT;

回滚事务:
ROLLBACK;

事务四大特性

原子性: 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性: 事务完成时,必须是所有数据都保持一致状态。
隔离性: 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性: 事务一旦提交或回滚,它对数据库中的改变是永久的。

并发事务问题

脏读: 一个事务读到另一个事务还没有提交的数据。
不可重复读: 一个事务先后读取同一条记录,
幻读: 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影。

事务隔离级别

查看事务隔离级别:
SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMTTED | REPEATABLE RAED | SERIALIZABLE};

猜你喜欢

转载自blog.csdn.net/qq_39547794/article/details/128761665