一、SQL
(一)、DDL
DDL:数据定义语言
1、数据库操作
sql
#查询所有数据库
show databases;
#查询当前数据库
select database();
#创建
create datebase [if not exist] 数据库名[default charset 字符集][collate 排序规则];
#删除
drop database [if exist] 数据库名;
#使用
use 数据库名;
2、表操作
前提是要进入当前数据库
sql
#查询**当前数据库**所有表
show tables;
#查询表结构
desc 表名;
#查询指定表的建表语句
show create table 表名;
sql
# 创建
create table 表名(
字段1 字段1类型 [comment 字段1注释],
字段2 字段2类型 [comment 字段2注释],
......
) [comment 表注释];
#[...] 为可选参数,最后一个字段后面没有,逗号
字段类型


char(10):固定十位,当输入2位后,其他用0补齐,性能好
varchar(10):最长10位,根据内容计算占用空间,性能差

sql
#修改表
#添加字段
alter table 表名 add 字段名 字段类型(长度) [comment 注释] [约束];
#修改字段
#修改数据类型
alter table 表名 modify 字段名 新数据类型(长度);
#修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度)[comment 注释] [约束]
#删除字段
alter table 表名 drop 字段名;
#修改表名
alter table 表名 rename to 新表名;
#删除表
drop table [if exists] 表名;
#删除指定表,并重新创建
truncate table 表名;
(二)、DML
DML:Data Manipulation Language (数据操作语言),对数据库中表的记录进行增删改。
1、insert_添加数据
sql
#给指定字段添加数据
insert into 表名(字段名1,字段名2....)values(值1,值2...);
#给所有字段添加数据
insert into 表名 values (值1 , 值2....);
#批量插入
insert into 表名(字段名1,字段名2....)values(值1,值2...),(值1,值2...),(值1,值2...)..;
insert into 表名 values (值1 , 值2..),(值1 , 值2....),...;
注意:
- 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
- 字符串和日期型数据应该包含在引号中。
- 插入的数据大小,应该在字段的规定范围内
2、update_修改数据
sql
#没有条件时,代表修改整张表的数据
update 表名 set 字段名1 = 值1,字段名2 = 表2,... [where 条件];
3、delete_删除数据
sql
delete from 表名 [where 条件];
#delete的条件可有可无,没有时代表删除整张表啊数据
#delete不能删除某一个字段的值(可以用update)
(三)、DQL
DQL:Data Query Language(数据查询语言)

1、基本查询
sql
#查询多个字段
select 字段1,字段2....from 表名
select * from 表名;
#设置别名
select 字段1[as 别名],字段2[as 别名] ...from 表名;
#去重
select distinct 字段列表 from 表名;
2、条件查询
sql
select 字段列表 from 表名 where 条件列表;
#占位符 ------ %
#查询姓名为2个字的员工
select * from emp where name like '__';
#查询身份证号最后一位为X的员工
select * from wmp where idcard like '%X'
条件:


3、聚合函数
将一列数据作为一个整体,进行纵向计算
注意:所有null值不参加聚合运算 
sql
select 聚合函数(字段列表) from 表名;
4、分组查询
sql
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件]
where和having区别 :
where是分组之前进行过滤,不满足where条件,不参与分组
having是分组之后对结果进行过滤
where不能对聚合函数进行判断,having可以
5、排序查询
关键字:asc(升序,可省略) desc(降序)
sql
select 字段列表名 from 表名 order by 字段1 排序方式1,字段2 排序方式2;
6、分页查询
sql
select 字段列表 from 表名 limit 起始索引,查询记录数;
注意
- 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为limit10。
(四)、DCL
DCL:Data Control Language,管理用户控制数据库的访问
1、管理用户

2、权限控制
常用权限:

二、函数
函数是指一段可以直接被另一段程序调用的程序或代码。
1、字符串函数

sql
select 函数名(参数);
#企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为00001。
update emp set workno = lpad(workno,5,'0');
2、数值函数

sql
#生成随机六位数验证码
select lapd(round(rand() * 1000000,0),6,0);
3、日期函数

4、流程函数



三、约束
约束是作用于表中字段上 的规则,用于限制存储在表中的数据,保证数据库中数据的正确、有效和完整性。

sql
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 '状态';
gender char(1) comment'性别'
)comment'用户表';
sql
#添加外键
create table 表名(
字段名 数据类型,
..
[constraint][外键名称]foreign key(外键字段名) references 主表(主表列名)
);
#或者
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);
#删除外键
alter table 表名 drop foreign key 外键名称;
外键删除更新行为:

sql
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主键列表名) on update 约束 on delete 约束;
四、多表查询
表关系:
- 一对一:多用于单表拆分,将一张表基础字段放在另一张表中,详情字段放在另一张表中,在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(unique)
- 一对多:在多的一方建立外键,指向另一方的主键
- 多对多:需要中间表,中间表至少包含两个外键,分别关联两方主键。
笛卡尔积:集合A和集合B的所有组合情况,多表查询时需要消除无效的笛卡尔积。
(一)、连接查询
1、内连接
内连接:A、B交集部分数据。
sql
# 隐式内连接
select 字段列表 from 表1,表2 where 条件;
# 显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
注意:
- 内连接两种写法性能、结果完全相同,只是语法层面不同;
- 新项目一律使用显式 INNER JOIN + ON;
- 隐式逗号写法属于老旧语法,可读性差,容易笛卡尔积,只在老项目遗留代码会见到;
ON与WHERE的条件位置,仅对外连接生效,对内连接没有区别
2、外连接
sql
#左外连接:查询左表所有数据以及两张表交集部分
select 字段列表 from 表1 left [outer] join 表2 on 条件;
#右外连接:查询右表所有数据以及两张表交集部分
select 字段列表 from 表1 right [outer] join 表2 on 条件;
注意:
- ON:关联阶段过滤 ,是两张表做连接时的条件,只影响被连接的次表 ,驱动表的数据不会丢失。
- WHERE:连接完成后过滤 ,是对连接之后的完整结果集做筛选,不满足条件的整行直接被删掉,会丢失左表数据
- 表和表的关联字段,必须写在 ON。
- 外连接,想保住左表全部数据,右表的筛选条件放 ON。
- 条件放
WHERE,就代表可以接受左表数据被删掉。 - 只有外连接才有这个差异;内连接 ON 和 WHERE 结果完全一致。
3、自连接
当前表与自身表的连接查询,自连接必须使用表别名。自连接查询可以是内连接查询也可以是外连接查询。
sql
SELECT 字段列表 from 表A 别名A , 表A 别名B where 条件;
SELECT 字段列表 from 表A 别名A join 表A 别名B on 条件;
4、联合查询
将多次查询的结果合并起来形成一个新的查询结果集。
sql
查询语句1 union[all] 查询语句2;
注意:
- 对于联合查询的多张表的列数 必须保持一致 ,字段类型 也需要保持一致。
- unionall会将全部 的数据直接合并 在一起,union会对合并之后的数据去重。
(二)、子查询
SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个
sql
select * from t1 where column1 = (SELECT column1 from t2);
根据查询结果不同可以分为:
- 列子查询(子查询结果为一列)
- 行子查询(子查询结果为一行)
- 表子查询(子查询结果为多行多列)
- 标量子查询(子查询结果为单个值)
根据子查询的位置分为:where 之后、from之后、select之后。
1、标量子查询
子查询返回的结果是单个值 (数字、字符串、日期等),最简单的形式,这种子查询成为标量子查询。
常用操作符:= <> > >= < <=


2、列子查询
子查询返回的结果是一列 (可以是多行),这种子查询称为列子查询
常用操作符:




3、行子查询
子查询返回的结果是一行(可以是多列) ,这种子查询称为行子查询
常用的操作符:= <> IN NOT IN

4、表子查询
子查询返回的结果是多行多列 ,这种子查询称为表子查询。常出现在from之后
常用的操作符:IN


五、事务
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 默认MysQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。
sql
# 查看设置事务提交方式
select @@autocommit;
#设置为手动提交
set @@autocommit = 0;
#手动提交
commit;
#回滚
rollback;
#========方式二,不修改提交方式===============
#开启事务
start transaction;
#或
begin;
#提交
commit;
#回滚
rollback;
事务四大特性:
- 原子性(
Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。 - 一致性(
Consistency):事务完成时,必须使所有的数据都保持一致状态。 - 隔离性(
Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。 - 持久性(
Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
并发事务问题:

事务隔离级别:解决并发事务问题

sql
#查看事务隔离级别
select @@transaction_isolation;
#设置事务隔离级别 session会话级别针对当前客户端窗口有效,global 针对所有有效
set [session|global] transaction isolation level{read uncommited | read comminted | repeatable read | serializable}