一、SQL
1. 概念
Structured Query Language
结构化查询语言
本质就是定义了操作所有关系型数据库的规则
每一种数据库操作的方式存在不一样的地方,称为“方言”
2. 通用语法
- 可单行或者多行书写,以分号结尾
- 不区分大小写,关键字建议大写
- 单行注释:-- 注释内容(--后有一个空格) 或者 # 注释内容(MySQL特有)
- 多行注释:/* 注释内容 */
3. 分类
SQL分四类
1). DDL(Data Definition Language)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:
create
drop
alter
A. 操作数据库
a. 增(Create)
-
创建数据库
create database 数据库名; -
创建数据库,如不存在,再创建
create database if not exists 数据库名; -
创建数据库,并指定字符集
create database if not exists 数据库名 character set gbk;
b. 删(Delete)
-
删除数据库
drop database 数据库名; -
判断数据库存在,再删除
drop database if exists 数据库名;
c. 改(Update)
-
修改指定数据库的字符集
alter database 数据库名 character set utf8mb4;
d. 查(Retrieve)
-
查询所有数据库名称
show databases; -
查询指定名称数据库
show create database 数据库名;
e. 使用数据库
-
查询当前正在使用的数据库名称
select database(); -
使用数据库
use 数据库名;
B. 操作数据表
a. 增(Create)
-
SQL中的数据类型
-
int 整数类型
age int -
double 小数类型
score double(5,2) -- 位数一共五位,小数点后保留两位 最大值为999.99 -
date 日期类型
-- 只包含年月日 yyyy-MM-dd -
datetime 日期类型
-- 包含年月日时分秒 yyyy-MM-dd HH:mm:ss -
timestamp 时间戳类型
-- 包含年月日时分秒 yyyy-MM-dd HH:mm:ss- 如果不给这个字段赋值,或赋值为null,则默认使用系统当前时间自动赋值
-
varchar 字符串类型
name varchar(20) -- 姓名最大20个字符zhangsan-> 8个字符张三-> 2个字符
-
-
创建数据表
create table 数据表名(column1 type1,column2 type2,...,columnN typeN);
b. 删(Delete)
-
删除数据表
drop table 数据表名; -
判断数据表存在,再删除
drop table if exists 数据表名;
c. 改(Update)
-
修改表名
alter table 数据表名 rename to 新表名 -
修改指定数据表的字符集
alter table 数据表名 character set utf8mb4; -
为表添加一列
alter table 数据表名 add 列名 数据类型 -
为表删除一列
alter table 数据表名 drop 列名 -
修改表的列类型
alter table 数据表名 modify 列名 新类型 -
修改表的列名称及类型
alter table 数据表名 change 列名 新列名 新类型
d. 查(Retrieve)
-
查询某个数据库中所有表的名称
show tables; -
查询表结构
desc 数据表名;
e. 使用数据表
-
复制数据表
create table mynewtable like 数据表名;
2). DML(Data Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改。关键字:
insert
delete
update
A. 向表中添加数据
-
语法:
insert into 表名(列名1,列名2,...,列名n) values(值1,值2,...,值n); -
注意:
1.如果表名后不定义列名,则默认给所有列添加值
insert into 表名 values(值1,值2,...,值n);- 除了数字类型数据,其他类型数据需要使用单双引号表示
B. 从表中删除数据
-
根据条件删除表中数据
delete from 表名 where 条件 -- 如果不加where,删除表中所有记录,效率低 -
删除表中所有数据
truncate table 表名 -- 先删除表,再创建一张一样的表
C. 在表中修改数据
-
修改表中指定条件的值
update 表名 set 列名1 = 值1, 列名2 = 值2,... where 条件 -- 如果不加where,则会将表中所有记录全部修改
3). DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:
select
where
-
查询表数据
select 字段1,字段2,...from 表名1,表名2,...where 条件1,条件2,...group by 分组字段having 分组之后的条件order by 排序limit 分页限定;
A. 基础查询
a.多个字段查询
select 字段名1 -- 注释内容, 字段名2 -- 注释内容, ... from 表名 -- 注释内容;
b.去除重复
select distinct 字段名 from 表名 ;
c.计算列字段
select 字段名1 + 字段名2 from 表名 -- 注释内容;
d.给列字段起别名
select 字段名1 AS 别名1, 字段名2 别名2, ... from 表名 ;
TIPS:
SELECT DISTINCT -- 结果集(根据条件查询得到的结果集合)去重复 name, math 数学 -- AS 可省略, english, math + IFNULL(english,0) -- 计算列字段之和 IFNULL(判断字段,替代值) AS 总分 FROM 表名
B. 条件查询
a. 条件运算符
-
> < <= >= = <>(不等于)
-
BETWEEN...AND
-
IN(集合)
-
LIKE -- 模糊查询
- 单个占位符:_
- 多个占位符:%
- SELECT * FROM mytable WHERE NAME LIKE "%德%";
-
IS NULL
-
and 或 &&
-
or 或 ||
-
not 或 !
C. 排序查询
- 语法:order by 排序字段1 排序方式1 , 排序字段2 排序方式2...
- 排序方式:
- ASC:升序,默认
- DESC:降序
- 注意:多个排序条件则按从前到后顺序执行
D. 聚合函数
将一列数据作为一个整体,进行纵向计算
-
count:计算个数
- SELECT COUNT(NAME) FROM mytable;
- 会排除NULL值,可用IFNULL替换
-
max:计算最大值
-
min:计算最小值
-
sum:计算和
-
avg:计算平均值
E. 分组查询
- 语法:group by 分组字段
- 注意:
- 分组之后查询的字段:分组字段 或者 聚合函数
- SELECT sex,AVG(math) FROM mytable WHERE math > 70 GROUP BY sex having COUNT(NAME) > 2;
- where 和 having 的区别?
- where 在分组之前进行限定,如果不满足条件,不参与分组。having在分组之后限定,如果不满足条件,则查询不出来
- where后不可以跟聚合函数,但having后可以进行聚合函数的判断
F. 分页查询
- 语法:limit 开始的索引,每页查询的条数;
- 公式:开始的索引= (当前的页码 - 1)* 每页显示的条数
- limit分页操作是mysql的“方言”
4). DCL(Data Control Language)数据控制语言
用来定义数据库的访问权限和安全级别,及创建用户。关键字:
GRANT
REVOKE
4. 约束
唯一约束有时也称为唯一索引 因此删除时需要DROP INDEX
5. 多表关系
6. 范式
7. 数据库的备份与还原
8. 多表查询
9. 事务
隔离级别设置为read uncommitted
两个事务同时开启
其中一个事务修改数据未提交
另一个事务两次查询数据结果不同
发生脏读,不可重复读
隔离级别设置为read committed
两个事务同时开启
其中一个事务修改数据并提交
另一个事务两次查询 结果不同
脏读解决 发生不可重复读
隔离级别设置为repeatable read
脏读和不可重复读均解决
另一个事务也提交再查询才能看到数据变化情况
隔离级别设置为serializable
只有当一个事务完成commit时,另一个事务才能执行,类似于锁表操作