Mysql 的基本使用
数据库的基本操作
什么是数据库
数据库就是储存数据的地方。在电脑中,在内存中,在硬盘中的东西都是存储在数据库中的数据。而这些数据所待的地方就叫做数据库
常用的数据库
- SQL SERVLER
- Oracle
- MySQL
- Postgre SQL
SQL语言分类
- DDL 数据库定义语言
- DCL数据库控制语言
- DML 数据库操作语言
- DQL 数据库查询语言
常用数据库基本操作
- 登入:
mysql -uroot -p
- 获取数据库版本号:
mysql -V
ormysql -version
- 登录并打开指定数据库:
mysql - uroot-p - D db_name
- 退出:
exit
orquit
sql语法规范
- 常用Mysql 的关键字大写,库名, 和表名,字段名小写
- SQL 支持折行操作,拆分时不要拆分一个完整的单词
- 数据库名和表名,字段名不要使用MYSQL的保留字,必须要使用,需要反引号起来
'字段'
常用SQL语句
SELECT USER()
得到登入的用户
SELECT VERSION()
获取SQL信息
SELECT NOW()
得到当前时间
SELECT DATABASE()
获取当前打开的数据库
SQl语句的相关操作
数据库相关操作
- 创建数据库:
CREATE{DATABASE or SCHEMA}db_name
- 创建数据库时判断名称是否存在,不存在则创建:
CREATE {DATABASE or SCHEMA}[IF NOT EXISTS]db_name
- 查看当前服务器下所有数据
SHOW DATABASES;
- 查看指定的数据库
SHOW DATABASE db_name
- 修改指定的数据库的编码方式
ALTER DATABASER db_name CHARSET='UTF8'
- 打开指定的数据库
USE db_name
- 删除指定的数据库
DROP DATABASE db_name
- 删除指定的数据库如果存在则删除
DROP DATABASE IF NOT EXISTS db_name
MySQL 的数据结构
数值型
整数型
类型 | 值范围 | 字节大小 |
---|---|---|
TINYINT |
有符号值-128—127 无符号 0到255 | 1 字节 |
SMALLUT |
有符号值 -32768—32767无符号 0到62235 | 2字节 |
INT |
有符号值 -32768—32767无符号 0到62235 | 4字节 |
BIGINT |
有符号 -263—263-1 无符号 0— 2^64 -1 | 8字节 |
浮点型
类型 | 值范围 | 字节大小 |
---|---|---|
FLOAT(M,T) |
负数取值范围 -3.40E+38 到-1.74E-38 0和1.175E-38到 3.40E+38 M是数字总数,T 是小数点中的后面位数 | 4 |
DOUBLE |
-1.79E+308 到- 2.2E-308 | 8 |
DECIMAL(M,D) |
和Double一样内部义字符串形式存储数值 | M+2 |
字符型
类型 | 存储需求 |
---|---|
CHAR(M) |
M个字节 0<M<255 |
VARCHAR(M) |
|
TINYEXT |
|
TEXT |
|
('VALUER1','VALUER2',…) |
CHAR效率高于VARCHAR,CHAR相当于拿空间换时间,VARCHAR拿时间换空间
TEXT列不能有默认值,检索的时候不存在大小写转换
CHAR默认存储数据的时候,后面会用空格填充到指定长度;而在检索的时候会去掉后面空格;VARCHAR在保存的时候不进行填充,尾部的空格会留下
时间类型
类型 | 储存需求 |
---|---|
TIME |
3 |
DATE |
3 |
DATETIME |
8 |
YERA |
1 |
数据表的操作
数据表是数据库最重要的一部分,数据是保存咋数据表中的,它是由行和列组成,每个数据表至少有一列行可以零行和一行 表名必须唯一不能为数据的的关键字最好听命知意
- 创建表
CREATE TABALE IF NOT EXISTS tbl_name(
字段名称 字段类型 [完整约束条件],
字段名称 字段类型 [完整约束条件]
)ENGIN=存储引擎 CHARSET=编码方式
完整约束条件:
1.UNSIGNED :无符号,没有负数,从零开始
2.ZEROFILL : 零填充 当显示长度不够设置的长度时用0填充
3. DEFAULT : 默认值如果插入的时候没有填写值,则使用默认值
4. NOT NULL :非空约束,表示这个插入这个元素的时候必须给值,值不为空
5. PRIMARY KEY:主键标识记录的唯一性,一张表只能有一个主键,自动禁止为空
6. AUTO_INCREMENT: 自动增长,只能用于数值列,配合索引使用从1开始每次增长1
7. UNIQUE KEY: 唯一性 一个表可以多个唯一索引约束,表示值只能不能重复
8. FOREIGN KEY: 外键约束
- 查看当前数据库下的表 :
SHOW TABALES
- 查看表的详细信息:
SHOW CREATE TABLE tbl_name
- 查看表结构:
DESC tal_name
- 删除指定表:
DROP TABLE tbl_name
表结构的操作
- 添加字段:
ALTEA TABLE tbl_name ADD 字段名 字段属性 字段完整约束[FRIST]or[AFTER] 字段名称(添加某字段前和后)
- 删除字段:
ALTER TABLE tbl_name DROP 字段名称
- 添加默认值:
ALTER TABLE tbl_name ALTER 字段名称 SET DEFAULT 默认值
- 删除默认值:
ALTER TABLE tbl_name ALTER 字段名 DROP DEFAULT
- 修改字段属性
ALTER TABLE tbl_name MODIFY 字段名 字段属性 字段约束
- 修改字段名称和字段属性
ALTER TABLE tbl_name CHANGE 字段原名称 字段新名称 字段属性 字段约束
- 添加约束:
ALTER TABLE tbl_name ADD PRIMARY KEY(字段名称)
- 删除唯一:
ALTER TABLE tbl_name DROP index_name
- 修改表名称
ALTER TABLE tbl_name RENAME 原表名称 现表名称
- 修改自增长AUTO_INCREMENT的值:
ALTER TABLE tbl_name AUTO_INCREMENT=值
MySQL 数据操作
-
添加记录
- INSERT IN TO tb_name (属性1, 属性2,…)VALUSE (属性值 ,属性值)
- 不指定字段 :
INSER INTO tb_name()VALULE(values ....)
- 插入指定字段 :
INSERT INTO db_name(属性1, 属性2,...)VALUES (相对应值1 ,值2 ...)
- 一次插入多次记录:
INSERT INTO tb_name(属性1, 属性2,...)VALUSE (属性值 ,属性值),(...),(...)
-
修改记录
UPDATE INTO db_name SET 字段名='值',字段名='值',... WHERE [约束条件]
如果不添加条件 该表的该字段的所有值都会改变
-
删除记录
DELECT FROM db_name [WHERE 约束条件]
如果不填写约束条件该清空该表 但是设置的
AUTO_INCREMEN
不会重置需要使用ALTER
语句清空
- 清空数据并重置
AUTO_INCREMEN
:TRUNCATE tbl_name
- 查询语句
- 查询所有语句:
SELECT * FROM tbl_name
- 查询指定字段语句:
SERECT '字段名' FROM tbl_name
- 查询指定数据库的表名中的字段:
SELECT 字段名 FROM db_name.tbl_name
- 查询指定字段并起别名:
SELECT '字段名'AS '别名'FROM db_name
- 查询指定表中的字段:
SELECT db_name.'字段名'FROM db_name
- WHERE 条件
- 比较运算符 ``> < = >= <= !=```
- 检验是否为空[非空]
IF [NOT ]NULL
- 指定范围
[NOT] BETWEEN ... AND
- 指定集合
[NOT] IN(值,...)
- 逻辑运算符
AND``````OR
- 匹配字符
% 任意长度,- 任意字符
,LINKE(值)
指定前几条字段
-
GROUP BY
分组 :把指定的值放在一起形成一个组中 在查询结果中只要显示一条GROUP BY 子句,分组子句 GROUP BY 字段/别名 [排序方式] 分组后会进行排序。 升序:ASC,降序:DESC 以下[合计函数]需配合 GROUP BY 使用: count 返回不同的非 NULL值数目 count(*)、count (字段) sum 求和 max 求最大值 min 求最小值 avg 求平均值 group_concat 返回带有来自一个组的连接的非NULL 值的字符串结果。组内字符串连接。
-
HAVING
子句,条件子句- 与
WHERE
功能语句相同,执行时机不同 -
WHERE
在开始时对元素进行过滤HAVING
对筛选出的结果再次过滤 -
HAVING
是查询出来了WHERE
必须表内存在的 -
WHERE
不可以使用字段的别名,HAVING
可以。因为执行WHERE代码时,可能尚未确定列值 -
WHERE
不可以使用合计函数。一般需用合计函数才会用 having - SQL标准要求
HAVING
必须引用GROUP BY
子句中的列或用于合计函数中的列
- 与
-
ORDER BY
语句 子句,排序语句-
ORDER BY
排序字段/别名 排序方式[排序字段/别名 排序方式] 升序 ASC 降序 DESC
-
-
LIMIT
子句 限制结构数量子句仅对处理好的结果进行数量限制。将处理好的结果的看作是一个集合,按照记录出现的顺序,索引从0开始,limit 起始位置, 获取条数
子查询
-
FROM
型from 后要求是一个表,必须给子查询取个别名
- 简化每个查询条件
- from 型会生成一个临时表格,可以用原表的锁定释放
- 子查询返回一个表 表型子查询
SELECT * FROM (SELECT * FROM tb WHERE id>1) AS SUBFROM WHERE id>1
-
WHERE型号
-
子查询返回一个值,标量子查询
-
不需要给子查询去别名
-
WHERE
子查询内的表,不能直接用以更新- 列子查询 :如果子查询的返回是一列 使用
IN
或者NOT IN
完成查询 -
EXISTS
或者NOT EXISTS
作为条件 SELECT test FEOM demo WEHERE EXIST(SELECT * FROM demo2 )
- 列子查询 :如果子查询的返回是一列 使用
-
行子查询
-
查询的是一行```
-
select * from t1 where (id, gender) in (select id, gender from t2);
-
多表连接查询:将多个表的字段进行连接,可以指定连接条件
-
内连接 :默认就像内连接(inner join)
- 默认就是内连接可省略inner
- 只有数据存在才能发送连接 即连接结构不能粗线空行,也可以用on/where 表示 连接条件
select * from tb1 cross join tb2
-
外链接
- 左外链接 :
SElECT 字段名称 FROM tb_name1 LEFT JOIN til_name2 ON 条件
; 先显示左表记录,再去右表查询符合条件的记录,不符合的以NUll代替 - 右外链接 SELECT 字段名称
FROM tb_name1 RIGHT JOIN tb_name2 ON
条件
- 左外链接 :
-
外键约束:只有InnoDB存储引擎支持外键
- [CONSTRAINT 外键名称 ]FOREIGN KEY(字段名称) REFERENCES 主表(字段名称)
- 子表的外键字段和主表的主键字段类型要相似;如果是数值型要求一致,并且无符号也要一致;如果是字符型,要求类型一致,长度可以不同
- 如果外键字段没有创建索引,MySQL会自动帮我们添加索引
子表的外键关联的必须是父表的主键
- 外键约束的参照操作
- CASCADE
从父表删除或更新,子表也跟着删除或者更新,级 - SET NULL
从附表删除或者更新记录,并设置子表的外键NULL - NO ACTION | RESTRICT
拒绝对父表做更新或者删除操作
- CASCADE
事务
概述:事务是 事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全都成功,要么全都失败.
事务作用:保证在一个事务中多次操作要么全都成功,要么全都失败.
事务的操作
- [CONSTRAINT 外键名称 ]FOREIGN KEY(字段名称) REFERENCES 主表(字段名称)
- 原子性: 事务包装的一组sql 要么都执行成功,要么都失败。操作是不可逆的
- 一致性:数据库的状态是一致的
- 持久性: 事务成功提交之后,对于数据库的改变是永久的 哪怕数据库发生异常,重启之后数据亦然存在
- 隔离性:一个事务的成功与否对其他事务没有影响
事务的隔离级别
在事务的并发情况,不考虑事务的隔离性 回发生
脏读 — 最严重不可发生的:指一个事务读取了另外一个事务 未提交的数据
不可重复读 :在一个事务内多次读取表中的数据,多次读取的结果不同
幻读 :
隔离级别
数据库规定了4中隔离级别
-
read uncommitted
读未提交,一个事务读到另一个事务没有提交的数据。
-
存在:3个问题(脏读、不可重复读、虚读)。
-
解决:0个问题
-
read committed
读已提交,一个事务读到另一个事务已经提交的数据。
-
存在:2个问题(不可重复读、虚读)。
-
解决:1个问题(脏读)
-
repeatable read
:可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。
-
存在:1个问题(虚读)。
-
解决:2个问题(脏读、不可重复读)
-
serializable
串行化,同时只能执行一个事务,相当于事务中的单线程。
-
存在:0个问题。
-
解决:3个问题(脏读、不可重复读、虚读)
隔离离别的安全性和性能差距
-
安全性:
serializable > repeatable read > read committed > read uncommitted
-
性能:
serializable < repeatable read < read committed < read uncommitted
常用数据库的默认隔离级别
- Oracle:
read committed
- Mysql :
repeatable read