关系型数据库
MySQL是一个关系型数据库,所谓关系型数据库,就是建立在关系模型基础上,由多张互相连接的二维表组成的数据库。(表与表之间可以相互连接)
特点如下:
SQL通用语法
数据类型
数值类型
数值类型存在如下8种TINYINT(byte)、SMALLINT(short)、MEDIUMINT、INT(int)、BIGINT(long)、FLOAT(float)、DOUBLE(double)、DECIMAL
类型 |
范围(无符号) |
用途 |
||
TINYINT |
(-128,127) |
(0,255) |
小整数值 |
|
SMALLINT |
(-32768,32767) |
(0,65535) |
大整数值 |
|
MEDIUMINT |
(-8388608,8388607) |
(0,16777215) |
大整数值 |
|
INT或INTEGER |
4 Bytes |
(-2147483648,2147483647) |
(0,4294967295) |
大整数值 |
BIGINT |
8 Bytes |
(-2^63,2^63-1) |
(0,2^64-1) |
极大整数值 |
FLOAT |
(-3.402823466 E+38,3.402823466351 E+38) |
0和(1.175494351 E-38,3.402823466 E+38) |
单精度浮点数值 |
|
DOUBLE |
(-1.7976931348623157 E+308,1.7976931348623157 E+308) |
0和(2.2250738585072014 E-308,1.7976931348623157 E+308) |
双精度浮点数值 |
|
DECIMAL |
|
依赖于精度M和标度D的值 |
依赖于精度M和标度D的值 |
小数值 |
对于年龄 age 我们可以采用无符号的TINYINT的符号表示,具体语句为
对于分数 score 我们可以采用单精度的float表示,小数后面只需要1位就可以满足,具体语句为
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET
类型 |
用途 |
|
CHAR |
0-255 bytes |
定长字符串 |
VARCHAR |
0-65535 bytes |
变长字符串 |
TINYBLOB |
0-255 bytes |
|
TINYTEXT |
0-255 bytes |
|
BLOB |
0-65535 bytes |
|
TEXT |
0-65535 bytes |
长文本数据 |
MEDIUMBLOB |
0-16777215 bytes |
|
MEDIUMTEXT |
0-16777215 bytes |
|
LONGBLOB |
0-4294967295 bytes |
二进制形式的极大文本数据 |
LONGTEXT |
0-4294967295 bytes |
极大文本数据 |
char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。而varchar存储字节是根据数据本身决定。
此外,char的性能比varchar更好,但是varchar会更节省存储空间。对于用户名等不确定数据长度的字段,我们可以采用varchar(20)。对于性别已经确定长度的字段,我们可以采用char(1)。
BLOB 是一个二进制大对象,可以容纳可变数量的数据,比如说音频,安装包等。
有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。这些我们通常不会使用,不便管理且效率不高,这类文件我们通常使用专门的文件服务器存储。
日期类型
表示时间值的日期和时间类型为DATE、TIME、YEAR、DATETIME和TIMESTAMP。
类型 |
范围 |
格式 |
用途 |
|
DATE |
3 |
1000-01-01/9999-12-31 |
YYYY-MM-DD |
日期值 |
TIME |
3 |
‘-838:59:59’/’838:59:59’ |
HH:MM:SS |
|
YEAR |
1 |
1901/2155 |
YYYY |
年份值 |
DATETIME |
8 |
‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ |
||
TIMESTAMP |
4 |
‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC |
SQL分类
SQL可以分为四类DDL、DML、DQL、DCL
- DDL:数据定义语言,用来定义数据库对象(数据库,表,字段)
- DML:数据操作语言,用来对数据库表中的数据进行增删改
- DQL:数据查询语言,用来查询数据库中表的记录
- DCL:数据控制语言,用来创建数据库用户、控制数据库的访问权限
DDL
数据库操作
创建数据库
CREATE DATABASE[IF NOT EXISTS]数据库名[DEFAULT CHARSET 字符集][COLLATE 排序规则];
删除数据库
DROP DATABASE[IF EXISTS]数据库名;
使用数据库
USE 数据库名;
表操作
SHOW TABLES;
DESC 表名;
SHOW CREATE TABLE 表名;
CREATE TABLE 表名(
字段2 字段2类型 [COMMENT 字段2注释],
字段n 字段n类型 [COMMENT 字段n注释]
) [COMMENT 表注释];
表结构修改
- 添加字段: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
添加数据
- 指定字段: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 条件];
删除数据
DQL
SELECT 字段列表 FORM 表明列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列 ORDER BY 排序字段列表 LIMIT 分页参数
基本查询
查询多个字段
- SELECT 字段1,字段2,…FROM 表名;
- SELECT*FROM 表名;
AS关键字可以省略。
SELECT DISTINCT 字段列表 FROM 表名;
条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表;
条件
> |
大于 |
>= |
大于等于 |
< |
小于 |
<= |
小于等于 |
<>或!= |
不等于 |
BETWEEN…AND… |
|
IN(…) |
|
LIKE 占位符 |
|
IS NULL |
是null |
并且(多个条件同时成立) |
|
OR 或 || |
|
NOT 或 ! |
非,不是 |
聚合函数
统计数量 |
|
求和 |
语法:
分组查询
语法:
SELECT 字段列表 FROM 表名[WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
排序查询
语法:
如果是多字段排序,当前一个字段值相同时,才会根据第二个字段进行排序。
分页查询
语法:
- 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
- 分页查询是数据库方言,不同数据库有不同实现,比如MySQL的实现就是使用limit。
- 如果查询第一页数据,起始索引可以省略,简写为limit 10。
执行顺序
编写顺序不等于执行顺序,一个完整的DQL语句执行顺序应该如下
DCL
管理用户
查询用户
USE mysql;
SELECT *FROM user;
在mysql中,用户的信息以及用户权限信息都被存储在mysql数据库中的user表中。
默认存在4个用户,我们通常使用的是root用户,在mysql中,要删除或是修改某个用户的信息需要使用host(主机)与user两个字段来定位到被修改的用户。
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码' ;
主机名我们可以使用%来表示任意主机,也就是说该用户可以在任意的主机登录。
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
删除用户
DROP USER '用户名'@'主机名';
权限控制
常见权限如下
ALL、ALL PRIVILEGES |
所有权限 |
SELECT |
查询数据 |
INSERT |
插入数据 |
UPDATE |
修改数据 |
DELETE |
删除数据 |
ALTER |
修改表 |
DROP |
删除数据库/表/视图 |
CREATE |
创建数据库/表 |
查询权限
SHOW GRANTS FOR '用户名'@'主机名';
授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
函数
字符串函数
常用的字符串函数
函数 |
|
CONCAT(s1,s2,…sn) |
字符串拼接 |
LOWER(str) |
|
UPPER(str) |
|
TRIM(str) |
|
数值函数
常见的数值函数
函数 |
|
CELL(x) |
向上取整 |
FLOOR(x) |
向下取整 |
MOD(x,y) |
|
RAND() |
|
ROUND(x,y) |
日期函数
常见的日期函数
函数 |
功能 |
CURADTE() |
|
CURTIME() |
|
NOW() |
|
YEAR(date) |
|
MOUTH(date) |
|
DAY(date) |
|
流程函数
常见流程控制函数
函数 |
功能 |
IF(value,t,f) |
|
约束
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确性,有效行和完整性。
非空约束 |
限制该字段不能为null |
|
保证该字段的所有数据都是唯一,不重复的 |
||
默认约束 |
||
保证字段值满足某个条件 |
||
外键约束 |
让两张表的数据间建立连续,保证数据的一致性和完整性 |
字段名 数据类型,
[constraint][外键名称]foreign key(外键列名)references主表(主表列名)
}
alter table 表名 add constraint 外键名称 foreign key (外键列名) references 主表 (主表列名);
删除外键
修改外键约束的行为语句
alter table 表名 add constraint 外键名称 foreign key(外键字段)references 主表名(主表字段名)on update cascade on delete cascade;
多表查询
多表关系
一对多的关系,可以通过对多的一方建立外键指向一的主键来维护。
多对多的关系,需要创建第三方表来维护多对多的关系,第三方表需要两个外键。
一对一的关系,在任意一方建立外键,指向另一方的主键,并且将外键添加为唯一约束。
连接查询
联合查询
对于union查询,把多次查询的结果合并起来,形成一个新的查询结果集。
查询语法如下
对于联合查询,我们需要保证多个表中的字段数与字段类型一致。
子查询
sql语句中嵌套select语句,成为嵌套查询,又称子查询。
实现语法如下
子查询外部语句可以是insert/ update/ delete /select 任何一个。
- 标量子查询 子查询结果是单个值(数字,字符串,日期等)最简单的形式 常用操作符:= <>
- 列子查询 ,返回结果是一列(可以是多行)常用操作符 in、not in、any、some、all
- 行子查询 返回结果为一行(可以是多列)常用操作符:=, <>, in, not in
- 表子查询,返回结果为多行多列 常用操作符 in
事务
一组操作的集合,将所有操作作为一个整体一起向系统提交或撤销操作请求,要么同时成功,要么同时失败。而MySQL的事务是自动提交的,也就是说,每执行完一条SQL语句,MySQL会立即隐式提交事务。
select @@autocommit;
set @@autocommit = 0;
//设置为手动提交
事务四大特性:
- 原子性:事务是不可分割的最小操作单元,要么同时成功,要么同时失败
- 一致性:事务完成时,必须使所有数据保持一致状态
- 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性:事务一旦提交或回滚,他对数据库中的数据的改变就是永久的
- 赃读:一个事务读到另一个事务还没有提交的数据
- 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同
- 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时发现数据已经存在,出现幻影
事务隔离级别
隔离级别 |
脏读 |
不可重复读 |
幻读 |
读未提交 |
√ |
√ |
√ |
读已提交 |
× |
√ |
√ |
× |
× |
√ |
|
串行化 |
× |
× |
× |
查看事务隔离级别
设置事务隔离级别
set [session|global] transaction isolation level {read uncommitted | read committed |repeatable read |serializable}
原文地址:https://blog.csdn.net/zmbwcx/article/details/134619852
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_20442.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!