SQL
概述
SQL是一 种用于操作数据库的语言,SQL适用于所有关系型数据库。
MySQL、Oracle、 SQLServer是一个数据库软件,这些数据库软件支持标准SQL,也就是通过SQL可以使用这些软件,不过每一个数据库系统会在标准SQL的基础 上扩展自己的SQL语法。
大部分的NoSQL数据库有自己的操作语言,对SQL支持的并不好。
SQL通用语法
1.SQL语句可以单行或多行书写,以分号结尾。
3.SQL 语句可以使用空格/缩进来增强语句的可读性。
4. MySQL数据库的SQL语句不区分大小写, 关键字建议使用大写。
5.注释:
单行注释:一注释内容(用--注释注释内容要与一之间有一个空格)或 # 注释内容(MySQL特有)
多行注释:/* 注释内容*/
SQL分类
分类 | 全称 | 说明 |
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
DDL
数据库操作
功能 | SQL |
查看所有的数据库 | show databases; |
创建数据库 | create database [if not exists] mydb1 [charset=utf8] |
切换(选择要操作的)数据库 | use mydb1; |
删除数据库 | drop database [if exists] mydb1 ; |
修改数据库编码 | alter database mydb1 character set utf8; |
数据类型*
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
详细内容见文章末。
表操作
创建
CREATE TABLE[IF NOT EXISTS]表名(
字段1 字段1类型 [COMMENT 字段1注释],
字段2 字段2类型 [COMMENT 字段2注释],
字段3 字段3类型 [COMMENT 字段3注释],
...
字段n 字段n类型 [COMMENT 字段n注释]
)[ COMMENT 表注释];
注意:[...]为可选参数,最后一个字段后面没有逗号
查询
查询当前数据库所有表 | SHOW TABLES; |
查询表结构 | DESC表名; |
查询指定表的建表语句 | SHOW CREATE TABLE表名; |
修改表结构
添加字段 | ALTER TABLE 表名 ADD 字段名类型 (长度) [COMMENT 注释] [约束]; alter table 表名 add 字段名类型(长度) [conmment 注释] [约束]; |
修改字段名和字段类型 | ALTER TABLE 表名 CHANGE 旧字段名 新字段名类型(长度) [COMMENT注释] [约束]; |
修改数据类型 | ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度); |
修改表名 | ALTER TABLE表名RENAME TO新表名; RENAME TABLE 表名 TO 新表名; |
删除字段 | ALTER TABLE表名DROP字段名; |
删除表 | DROP TABLE[IF EXISTS] 表名; |
删除指定表,并重新创建该表* | TRUNCATE TABLE 表名; |
DML
简介
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增删改操作。
添加数据(INSERT)
修改数据(UPDATE)
删除数据(DELETE)
添加数据
给指定字段添加数据 | 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,... ),(值1,值2,...); |
注意:
- 插入数据时,指定的字段顺序需要与值的顺序是一对应的。
- 字符串和日期型数据应该包含在引号中。
- 插入的数据大小,应该在字段的规定范围内。
修改数据
UPDATE 表名 SET 字段名 = 值,字段名 = 值... ; |
UPDATE 表名 SET 字段名 = 值,字段名 = 值 ... WHERE条件; |
UPDATE name SET name1 = 'j', name2 = 'k';
UPDATE name SET name1 = 'j', name2 = 'k' where othername = 1010;
删除数据
DELETE FROM 表名 [WHERE 条件] ; |
TRUNCATE TABLE 表名; |
TRUNCATE 表名; |
注意:DELETE和TRUNCATE原理不同,DELETE之删除内容,而TRUNCATE类似于DROP TABLE,可以理解是将整个表删除,然后再创建该表。当DELETE后有WHERE时删除的是表中满足条件的一整排数据。
约束
简介
约束(constraint):表中数据的约束条件。
作用:表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。
分类
主键约束(primary key) PK |
自增长约束(auto_ jincrement) |
非空约束(not null) |
唯一性约束(unique) |
默认约束(default) |
零填充约束(zerofill) |
外键约束(foreign key) FK |
主键约束
概念
- MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一 行。
- 主键约束相当于唯一约束 + 非空约束的组合,主键约束列不允许重复,也不允许出现空值。
- 每个表最多只允许一个主键
- 主键约束的关键字是: primary key
- 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
添加单列主键
创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段之后指定主键。
方式一
- 在create table语句中,通过PRIMARY KEY关键字来指定主键。
- 在定义字段的同时指定主键。
eg:
CREAT TABLE teb(
name VARCHAR PRIMARY KEY
);
方式二
- 在定义字段之后再指定主键。
CREAT TABLE teb(
name VARCHAR PRIMARY KEY,
CONSTRAINT pk1 PRIMARY KEY(name) -- constraint pk1可以省略
);
添加多列主键(联合主键)
所谓的联合主键,就是这个主键是由一张表中多 个字段组成的。
注意:
- 当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
- 一张表只能有一个主键,联合主键也是一个主键。
- 联合主键的每一列都不能为空。
create table emp(
name varchar(20),
deptId int,
salary double,
constraint pk primary key(name, deptId)
);
通过修改表结构添加主键
主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。
字段列表可以是一个列也可以是多个。
删除主键约束
一个表中不需要主键约束时,就需要从表中将其删除。删除主键约束的方法要比创建主键约束容易的多。
自增长约束
概念
在MySQL中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录。主键会自动以相同的步长进行增长。
通过给字段添加auto increment属性来实现主键自增长
特点
- 默认情况下,auto_increment的初始值是1,每新增一条记录,字段值自动加1
- 一个表中只能有一个字段使用auto_increment约束, 且该字段必须有唯一索引, 以避免序号重复(即为主键或主键的一部分)
- auto_increment约束的字段必须具备NOT NULL属性
- auto_increment约束的字段只能是整数类型(TINYINT、 SMALLINT、 INT、 BIGINT 等
- auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
指定自增字段初始值
如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。例如,如果表中插入的第一条记录的id值设置为5,那么再插入记录时,id 值就会从5开始往上增加
方式一:创建表时指定
方式二:创建表后指定
delete和truncate在删除后自增列的变化
- delete数据之后自动增长从断点开始
- truncate数 据之后自动增长从默认起始值开始
非空约束
概念
MySQL非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
删除非空约束
唯一性约束
概念
唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为id字段加上唯一性约束后,每条记录的id值都是唯一的, 不能出现重复的情况。
在MySQL中NULL和任何值都不相同,NULL与NULL之间也不相同。
删除唯一约束
格式: alter table <表名> drop index <唯一约束名>;
默认约束
概念
MySQL默认值约束用来指定某列的默认值。
删除默认约束
alter table <表名> change column <字段名> <类型> default null;
零填充约束
概念
- 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
- zerofil默认为int(10)
- 当使用zerofill时,默认会自动加unsigned (无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128~+127,无符号为0~256.
删除
DQL
概念
- 数据库管理系统一个重要功能就是数据查询, 数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。
- MySQL提供了功能强大、灵活的语句来实现这些操作。
- MySQL数据库使用select语句来查询数据。
语法格式
*号代表所有的列
起别名时加关键字as,as可以省略。使用时是 别名.列名(多表查询时有用)
distinct是去掉重复值
查询时可以对数据进行运算(不会修改表中的数据)
书写顺序:select -> from -> where -> group by -> having -> order by -> limit
执行顺序:from -> where -> group by -> having -> select -> order by -> limit
运算符*
数据库中的表结构确立后,表中的数据代表的意义就已经确定。通过MySQL运算符进行运算,就可以获取到表结构以外的另一种数据。
MySQL支持4种运算符:算术运算符、比较运算符、逻辑运算符、位运算符。
详细内容键文章末。
排序查询
介绍
如果我们需要对读取的数据进行排序,我们就可以使用MySQL的order by子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
特点
- asc代表升序,desc代表降序,如果不写默认升序
- order by用于子句中可以支持单个字段,多个字段,表达式,函数,别名
- order by子句,放在查询语句的最后面。LIMIT子句除外
聚合查询
简介
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断, 而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值; 另外聚合函数会忽略空值。
select 函数 from ... ;
聚合函数 | 作用 |
count() | 统计指定列不为NULL的记录行数; |
sum() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0 |
max() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; |
min() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; |
avg() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
ifnull(A,0) | 如果A为null就当做0处理 |
NULL值的处理
1、 count函数对null值的处理
如果count函数的参数为星号(*) ,则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数。
2、sum和avg函数对null值的处理
这两个函数忽略null值的存在,就好象该条记录不存在一样。
3、max和min函数对null值的处理
max和min两个函数同样忽略null值的存在。
分组查询
简介
分组查询是指使用group by字句对查询信息进行分组。
如果要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出现
分组之后的条件筛选
- 分组之后对统计结果进行筛选的话必须使用having,不能使用where
- where子句用来筛选FROM子句中指定的操作所产生的行
- group by子句用来分组WHERE子句的输出。
- having子句用来从分组的结果中筛选行
分页查询
简介
分页查询(limit)在项目开发中常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式。例如数据共有30条,每页显示5条,第一页显示1-5条,第二页显示6-10条。
INSERT INTO SELECT语句
简介
将一张表的数据导入到另一张表中,可以使用INSERT INTO SELECT语句
要求目标表Table2必须存在
正则表达式
介绍
正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串, 使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
MySQL通过REGEXP关键字支持正则表达式进行字符串匹配。
◆格式
模式 | 描述 |
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
. | 匹配除"\n"之外的任何单个字符。 |
[...] | 字符集合。匹配所包含的任意-一个字符。例如,'[abc]' 可以匹配"plain"中的'a'。 |
[^...] | 负值字符集合。匹配未包含的任意字符。例如,'[^abc]' 可以匹配"plain"中的'p'。 |
p1 | p2 | p3 | 匹配p1或p2或p3。例如,'z|food' 能匹配"z"或"food"。'(z|f)ood' 则匹配"zood" 或"food"。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配"z"以及"zoo"。*等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配"zo"以及"zoo",但不能匹配"z"。+等 |
? | 匹配前面的子表达式零次或一次。 |
{n} | n是一个非负整数。匹配确定的n次。例如,'o{2}'不能匹配"Bob"中的'o', 但是能匹配"food" 中的两个0。 |
{n,m} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。 |
匹配成功为1(true),否则为0(false)
DCL
介绍
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。
管理用户
查询用户
创建用户
修改用户密码
删除用户
注意:
- 主机名可以使用%通配。
- 这类SQL开发人员操作的比较少,主要是DBA ( Database Administrator 数据库管理员)使用。
权限控制
MySQL中定义了很多种权限,但是常用的就以下几种
权限 | 说明 |
ALL, ALL PRIVILEGES | 所有权限 |
SELECT | 查询数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
ALTER | 修改表 |
DROP | 删除数据库/表/视图 |
CREATE | 创建数据库/表 |
其他权限描述及含义,可以直接参考官方文档。
查询权限
授予权限
撤销权限
注意:
- 多个权限之间,使用逗号分隔
- 授权时,数据库名和表名可以使用*进行通配,代表所有
附
数据类型
数值类型
类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
TINYINT | 1 byte | (-128, 127) | (0,255) | 小整数值 |
SMALLINT | 2 bytes | (-32768, 32767) | (0, 65535) | 大整数值 |
MEDIUMINT | 3 bytes | (-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 | 4 bytes | (-3. 402823466 B+38,3. 402823466351 E+38) | 0和(1.175494351 E-38,3.402823466 E+38) | 单精度浮点数值 |
DOUBLE | 8 bytes | (-1.7976931348623157 E+308, 1.7976931348623157 E+308) | 0 和(2.2250738585072014 E-308,1.7976931348623157 E+308) | 双精度浮点数值 |
DECIMAL | 依赖于M(精度)和D (标度)的值 (精度是指位数,标度是指小数位数) | 依赖于M(精度)和D (标度)的值 | 小数值(精确定点数) |
字符串类型
类型 | 大小 | 描述 |
CHAR | 0-255 bytes | 定长字符串 |
VARCHAR | 0-65535 bytes | 变长字符串 |
TINYBLOB | 0-255 bytes | 不超过255个字符的二进制数据 |
TINYTEXT | 0-255 bytes | 短文本字符串 |
BLOB | 0-65 535 bytes | 二进制形式的长文本数据 |
TEXT | 0-65 535 bytes | 长文本数据 |
MEDIUMBLOB | 0-16777 215 bytes | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16777 215 bytes | 中等长度文本数据 |
LONGBLOB | 0-4294 967 295 bytes | 二 进制形式的极大文本数据 |
LONGTEXT | 0-4294 967 295 bytes | 极大文本数据 |
日期类型
类型 | 大小 | 范围 | 格式 | 描述 |
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 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:01 至2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值,时间戳(与时区有关) |
运算符
算术运算符
算术运算符 | 说明 |
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ 或 DIV | 除法运算,返回商 |
% 或 MOD | 求余运算,返回余数 |
比较运算符
比较运算符 | 说明 |
= | 等于 |
< 和<= | 小于和小于等于 |
> 和>= | 大于和大于等于 |
<=> | 安全的等于,两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |
<>或!= | 不等于 |
IS NULL或ISNULL | 判断一一个值是否为NULL |
IS NOT NULL | 判断一一个值是否不为NULL |
LEAST | 当有两个或多个参数时,返回最小值(参数如果有null则返回null) |
GREATEST | 当有两个或多个参数时,返回最大值(参数如果有null则返回null) |
BETWEEN AND | 判断一个值是否落在两个值之间 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
逻辑运算符
逻辑运算符 | 说明 |
NOT 或者 ! | 逻辑非 |
AND 或者 && | 逻辑与 |
OR 或者 || | 逻辑或 |
XOR | 逻辑异或 |
位运算符
位运算符 | 说明 |
| | 按位或 |
& | 按位与 |
^ | 按位异或 |
<< | 按位左移 |
>> | 按位右移 |
~ | 按位取反,反转所有比特 |
位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。