MySQL学习
SQL通用语法
- 分号结尾
- 三种注释
- 单行注释:-- 注释内容 或 # 注释内容
- 多行注释:/* 注释*/
SQL分类
DDL(操作数据库,表)
-
操作数据库:
- 创建
- 创建数据库,判断是否不存在
- create database 数据库名称(if not exists 数据库)
- 创建数据库,判断是否不存在
- 查询
- 查询所有数据库的名称
- show databases;
- 查看某个数据库的字符集
- show create database 数据库名称;
- 查询所有数据库的名称
- 修改
- 修改数据库的字符集
- alter database 数据库名称 character set 字符集名称
- 修改数据库的字符集
- 删除
- 删除数据库
- drop database 数据库名称
- 删除数据库
- 使用数据库
- 查询当前正在使用的数据库名称
- select database();
- 使用数据库
- use 数据库名称
- 查询当前正在使用的数据库名称
- 创建
-
操作表
-
创建
-
create table 表名(
列名1 数据类型1,
列名1 数据类型1,
列名1 数据类型1,
…
列名n 数据类型n
);
-
复制表
- create 表名 like 被复制的表名
-
-
查询
- 查询某个数据库中所有的表
- show tables;
- 查询表结构
- desc 表名
- 查询某个数据库中所有的表
-
修改
-
修改表名
- alter table 表名 rename to 新的表名
-
修改表的字符集
- alter table 表名 character set 字符集名称
-
添加一列
- alter table 表名 add 列名 数据类型
-
修改列名和类型
- alter table tablename change 列名 新列名 新数据类型
-
删除列
- alter table 表名 drop 列名
-
-
删除
- drop table 表名;
-
DML:增删改表中数据
- 添加数据
- 语法:insert into 表名(列名1,… )values(值1…);
- 除了数字类型其他都要用引号
- 删除数据
- delete from 表名 【where 条件】
- 不加任何条件会删除表中的所有数据
- 修改数据
- update 表名 set 列名1 = 值1, 列名2 = 值2【where条件】
- 不加任何条件会修改所有表中的所有数据
DQL:查询语句
-
查询语句
-
基础查询
- select 字段名1, 字段名2。。。 from 表名
- 去除重复
- distinct
- 计算列
- 一般可以使用四则运算计算一些列的值
- ifnull(表达式1, 表达式2):null参与的运算,计算结果都为null
- 表达式1:哪个字段需要判断是否为null
- 如果字段为null后的替换值
- 起别名
- as : as 也可省略
-
条件查询
- where子句后跟条件
- 运算符
- between … and
- in
- like:模糊查询
- _:单个任意字符
- %:多个任意字符
- is null
- and
- or
- not
-
排序查询
- order by 子句
- order by 字段1 方式1 ,字段2 方式2
- 排序方式:
- ASC(升序)
- DESC(降序)
- order by 子句
-
聚合函数:将一列数据作为一个整体,进行纵向计算
-
count:计算个数
- 一般选择主键
-
max
-
min
-
sum
-
avg
-
聚合函数会排除空值
select count(列名) from 表名
-
-
分组查询
-
group by
-
select sex, avg(math),count(id) from group by sex
注意:分组之后查询的字段:分组字段,聚合函数
select sex, avg(math),count(id) from group where math > 70 by sex
having
select sex, avg(math),count(id) from group where math > 70 by sex having count(id) > 2
-
注意where 和having的区别
-
-
分页查询
- limit 开始的索引, 每页查询的条数
- 开始的索引=(当前的页码 -1)*每页显示的条数
-
-
约束
-
对表中的数据进行限定,保证数据的正确性有效性和完整性
-
分类
-
主键约束(primary key)
-
非空且唯一,一张表只能有一个字段为主键
-
创建主键:create table stu (
id INT primary key
)
删除主键:alter table stu drop primary key
-
自动增长
- 如果某一列是数值类型,使用auto_increment可以完成值的自动增长
-
-
非空约束 (not null)
-
创建表时添加约束
-
create table stu (
id INT
NAME VARCHAR(20) NOT NULL – name为非空
)
alter table stu modify name varchar(20) --删除非空约束
alter table stu modify name varchar(20) not null;
-
-
唯一约束(unique)
-
create table stu (
id INT
NAME VARCHAR(20) unique-- name为非空
)
alter table stu drop index name
-
-
外键约束(forgein key)
-
在创建表时可以添加外键
-
create table 表名 (
…
外键列
constraint 外键名称 foreign key 外键列名称 references 主表名称(主表主键名称)
)
-
删除外键
- alter table 表名 drop foreign key 外键名称
-
创建表之后添加外键
-
alter table 表名 add constraint 外键名称 foreign key (外键列名) references 主表名称(主表主键名称)
alter table employee add constraint emp_dept_fk foreign key (dep_id) references department(id)
-
-
级联
-
添加级联
-
alter table 表名 add constraint 外键名称
foreign key (外键字段名称) references 主表名称(主表列名称) on update cascade on delete cascade
-
-
级联的更新和级联的删除
- 更新 on update cascade
- 删除 on delete cascade
-
-
-
-
数据库的设计
-
多表之间的关系
- 一对一
- 一对多
- 多对多
- 一对一
-
数据库的设计和范式
-
设计数据库时需要遵循的一些规范
-
分类:
-
第一范式:每一列都是不可分割的原子数据项
第二范式:在第一范式的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
-
函数依赖: A–> B 如果通过A属性的值可以唯一确定B属性的值,则称B依赖于A
-
完全函数依赖:A–>B 如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性值
-
部分函数依赖:A–>B 如果A是一个属性组,则B属性值的确定需要依赖于A属性组中部分的属性值
-
传递函数依赖:A–>B, B–>C,如果通过A属性的值可以确定唯一B属性的值,如果通过B属性的值可以确定唯一C属性的值,则称C传递函数依赖于A
-
码:如果一张表中,一个属性或属性组被其他所有属性所完全依赖,那这个属性或属性组称为码
- 主属性:码属性组中的所有属性
- 非主属性:除码属性组的属性
第三范式:在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
-
-
-
-
多表查询
- 笛卡儿积:
- 有两个集合A,B,取这两个集合的所有组成情况
- 要完成多表查询,需要消除无用的数据
- 多表查询的分类
- 内连接查询
- 隐式内连接: where 条件
- 显式内连接:select 字段列表 from 表名1 【inner】 join 表名2 on 条件
- 外连接查询
- 左外连接:
- 语法:select 字段列表 from 表1 left join 表2 on 条件;
- 查询的是左表的所有内容以及交集部分
- 右外连接:
- 左外连接:
- 子查询
- 查询中嵌套查询,称嵌套查询为子查询
- 子查询不同情况
- 子查询的结果是单行单列的
- 子查询的结果是多行单列的
- 子查询的结果是多行多列的
- 内连接查询
事务
-
事务的基本介绍
- 概念:
- 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同事成功,要么同时失败
- 操作:
- 开启事务:start transaction
- 回滚:rollback
- 提交:commit
- 事务提交的两种方式
- 自动提交
- mysql就是自动提交
- 一条DML语句会自动提交一次事务
- 手动提交
- 需要先开启事务,再提交
- 修改事务的默认提交方式
- 查看事务的默认提交方式:select @@autocommit; --1代表自动提交 0 代表手动提交
- 修改默认提交方式:set @@ autocommit = 0
- 自动提交
- 概念:
-
事务的四大特征
- 原子性:是不可分割的最小操作单位,要么同时成功要么同时失败
- 持久性:当事务提交或回滚后,数据库会持久化的保存数据
- 隔离性:多个事务之间,相互独立
- 一致性:事务操作前后,数据总量不变
-
事务的隔离级别
- read uncommitted:读未提交
产生的问题:脏读、不可重复读、幻读 - read committed:读已提交 (Oracle)
产生的问题:不可重复读、幻读 - repeatable read:可重复读 (MySQL默认)
产生的问题:幻读 - serializable:串行化
可以解决所有的问题
- read uncommitted:读未提交
- 注意:隔离级别从小到大安全性越来越高,但是效率越来越低
- 数据库查询隔离级别:
- select @@tx_isolation;
数据库设置隔离级别:
set global transaction isolation level 级别字符串;