SQL语句
结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。
分类
- DDL
- 数据定义语言(Data Definition Language),定义对数据库对象(库、表、列、索引)的操作。
- DML
- 数据操作语言(Data Manipulation Language),定义对数据库记录的操作。
- DQL
- 数据查询语言(Data Query Language)。
- DCL
- 数据控制语言(Data Control Language),定义对数据库、表、字段、用户的访问权限和安全级别。
书写规范
- 在数据库系统中,SQL语句不区分大小写(关键字建议用大写) 。
- 字符串常量区分大小写。
- SQL语句可单行或多行书写,以分号";"结尾。
- 关键词不能跨多行或简写。
- 用空格和缩进来提高语句的可读性。
- 子句通常位于独立行,便于编辑,提高可读性。
- 注释
- SQL标准:多行注释使用"/**/";单行使用"-- "。
- MySQL:"#"。
数据库操作
编码问题
- 早期MySQL为了兼容像中文这种符号,提供了utf8编码。
- 现在因为表情包已经需要使用第四个字节存储,所以,utf8不建议使用了,建议使用另一种真正的Unicode编码 --- utf8mb4。
MySQL自带的数据库
-
Information_schema
- 主要存储了系统中的一些数据库对象信息,如用户表信息、列信息、权限信
息、字符集信息、分区信息等。(数据字典表)
- 主要存储了系统中的一些数据库对象信息,如用户表信息、列信息、权限信
-
performance_schema
- 主要存储数据库服务器的性能参数。
-
mysql
- 存储了系统的用户权限信息及帮助信息。
-
sys
- MySQL5.7新增,之前版本需要手工导入。这个库是通过视图的形式把information_schema和performance_schema结合起来,查询出更加令人容易理解的数据。
-
test
- 系统自动创建的测试数据库,任何用户都可以使用。
创建数据库
sql
-- 创建数据库。
CREATE DATABASE 数据库名称;
sql
-- 创建数据库,同时指定编码。
CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET 编码;
sql
-- 创建数据库,同时指定编码和排序规则。
CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET 编码 COLLATE 排序规则;
查询当前处于哪一个数据库
sql
SELECT DATABASE();
查看数据库版本
sql
SELECT VERSION();
查看当前用户
sql
SELECT USER();
以查询SQL语句的方式查看数据库
sql
SHOW CREATE DATABASE 数据库名;
删除数据库
sql
DROP DATABASE 数据库名;
-- 一般加上if exists语句,意为如果存在才删除,可以防止报错。
DROP DATABASE IF EXISTS 数据库名;
数据库表操作
创建表
sql
-- 语法。
CREATE TABLE 表名 (
字段1 数据类型 [约束条件],
字段2 数据类型 [约束条件],
......
字段n 数据类型 [约束条件]
);
-- 同样可以添加判断语句。
CREATE TABLE IF NOT EXISTS 表名 (
字段1 数据类型 [约束条件],
字段2 数据类型 [约束条件],
......
字段n 数据类型 [约束条件]
);
查询表中的所有数据
sql
SELECT * FROM 表名;
向表中插入数据
sql
INSERT INTO 表名 VALUES(字段1数据, 字段2数据, ......, 字段n数据);
-- 这种数据添加方式具有一定缺点,数据的顺序和数量要和字段一样。
INSERT INTO 表名(字段1, 字段n) VALUES(字段1数据, 字段n数据);
-- 这样可以只用输入前面写了字段的数据,没写的其他字段有默认值的取默认值,没有的默认为NULL。
查看表结构
sql
DESC 表名;
-- 此处desc是describe的缩写。
-- 故可以这样写:
DESCRIBE 表名;
以查询SQL语句的方式查看表结构
sql
SHOW CREATE TABLE 表名;
在查询语句后面以 "\G" 结尾,表示纵向显示每行记录。但如果以\G结尾,就不必在语句后加分号了。
删除数据库表
sql
DROP TABLE 表名;
-- 仍然可以加上判断语句
DROP TABLE IF EXISTS 表名;
数据类型
数据库用来存储数据的,而数据存在很多类型,因此MySQL数据提供了很多类型,供开发者使用。
MySQL中的主要数据类型
-
文本(Text)
数据类型 描述 CHAR(size) 保存固定长度的字符串(可包含字母、数字以及特殊字 符)。在括号中指定字符串的长度。最多 255 个字符。 VARCHAR(size) 保存可变长度的字符串(可包含字母、数字以及特殊字 符)。在括号中指定字符串的最大长度。最多 255 个字 符。 如果值的长度大于 255,则被转换为 TEXT 类型。 TINYTEXT 存放最大长度为 255 个字符的字符串。 TEXT 存放最大长度为 65535 个字符的字符串。 BLOB 用于 BLOBs (Binary Large OBjects)。存放最多 65535 字节的数据。 MEDIUMTEXT 存放最大长度为 16777215 个字符的字符串。 MEDIUMBLOB 用于 BLOBs (Binary Large OBjects)。存放最多 16777215 字节的数据。 LONGTEXT 存放最大长度为 4294967295 个字符的字符串。 LONGBLOB 用于 BLOBs (Binary Large OBjects)。存放最多 4294967295 字节的数据。 ENUM(x,y,z,etc.) 允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。 这些值是按照输入的顺序存储的。 SET 与 ENUM 类似, SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。 -
数字(Number)
数据类型 描述 TINYINT(size) -128 到 127 常规。 0 到 255 无符号。在括号中规定最大位数。 SMALLINT(size) -32768 到 32767 常规。 0 到 65535 无符号。在括号中规定最大位数。 MEDIUMINT(size) -8388608 到 8388607 普通。 0 到 16777215 无符号。在括号中规定最大位数。 INT(size) -2147483648 到 2147483647 常规。 0 到 4294967295 无符号。在括号中规定最大位数。 BIGINT(size) -9223372036854775808 到 9223372036854775807 常规。 0 到18446744073709551615 无符号。在括号中规定最大位数。 FLOAT(size,d) 带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 DOUBLE(size,d) 带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 DECIMAL(size,d) 作为字符串存储的 DOUBLE 类型,允许固定的小数点。 -
日期/时间(Date)
数据类型 描述 DATE() 日期。格式: YYYY-MM-DD 注释:支持的范围是从 '1000-01-01' 到 '9999-12-31' DATETIME() 日期和时间的组合。格式: YYYY-MM-DD HH:MM:SS 注释:支持的范围是'1000-01-01 00:00:00' 到 '9999-12- 31 23:59:59' TIMESTAMP() 时间戳。 TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储。格式: YYYY-MM-DD HH:MM:SS 注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC TIME() 时间。格式: HH:MM:SS 注释:支持的范围是从 '-838:59:59' 到 '838:59:59' YEAR() 2 位或 4 位格式的年。 注释: 4 位格式所允许的值: 1901 到 2155。 2 位格式所允许 的值: 70 到69,表示从 1970 到 2069
数据库约束
约束是在表上强制执行的数据校验规则。
大部分数据库支持下面五类完整性约束:
-
主键约束
-
从功能上看相当于非空且唯一,一个表中只允许一个主键,主键是表中唯一确定一行数据的字段。常在表中添加id字段作为主键。
-
一般建议主键采用"int类型"(id),一般建议由数据库自身维护这个字段的值。
-
当建立主键约束时,MySQL为主键创建对应的索引,称为主键索引,主键约束名总为PRIMARY。
-
创建方式
sqlCREATE TABLE 表名 ( id int PRIMARY KEY ); -- 创建后id字段的值强制非空且唯一,不满足条件的数据插入行为将会报错。
sql-- 我们一般将id作为主键,赋予自增的能力。 CREATE TABLE 表名 ( id int PRIMARY KEY AUTO_INCREMENT ); -- 这样写,表示插入一条数据,该数据的id字段默认为上一条数据的id值加1。需要注意的是,既使数据添加失败,id字段也会自增。 -- 自增情况下,存在自增的字段在添加数据时可以直接写DEFAULT或者NULL。
sql-- 除上述主键约束写法外,还存在一种写法。 CREATE TABLE 表名 ( id int AUTO_INCREMENT, PRIMARY KEY(id) );
-
-
唯一约束
-
唯一约束的作用,是保证该字段的值是唯一的。
-
唯一性约束条件的字段允许出现一个NULL。
-
同一张表内可建多个唯一约束。
-
唯一约束可由多列组合而成。
-
建唯一约束时MySQL会为之建立对应的索引,称为唯一索引。
-
如果不给唯一约束起名,该唯一约束默认与列名相同。
-
两种创建方式
sqlCREATE TABLE 表名 ( 字段 数据类型 UNIQUE );
SQLCREATE TABLE 表名 ( 字段 数据类型, UNIQUE(字段) );
-
-
默认值约束
-
给予给定的字段默认值。
-
创建方式
sqlCREATE TABLE 表名 ( 字段 数据类型 DEFAULT 默认值 );
-
-
非空约束
-
不允许字段的值为空。
-
创建方式
sqlCREATE TABLE 表名 ( 字段 数据类型 NOT NULL );
-
-
外键约束
- 用于确保数据完整性和实现表之间关系的一种数据库对象。
MySQL8以后支持检查约束,之前的版本不生效,写了也不报错。
-
检查约束
-
添加数据时检查添加数据是否符合给定条件,不符合不允许添加。
-
两种创建方式
sqlCREATE TABLE 表名 ( 字段 数据类型 CHECK(字段 IN (数据1, 数据2, ......)) );
sqlCREATE TABLE 表名 ( 字段 数据类型, 字段 ENUM(数据1, 数据2, ......) );
-
修改表的结构
修改字段(列)数据类型
sql
ALTER TABLE 表名 MODIFY 字段 数据类型;
-- 注意存在数据的情况下,修改不一定能成功,因为存在修改的数据类型与表中该字段中存在的数据的数据类型不符等情况。
在表中增加字段(列)
sql
ALTER TABLE 表名 ADD 字段 数据类型;
删除字段(列)
sql
ALTER TABLE 表名 DROP 字段;
修改字段(列)名
sql
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型;
更改表名(两种方案)
sql
ALTER TABLE 旧表名 RENAME 新表名;
sq
RENAME TABLE 旧表名 TO 新表名;
复制表结构和内容
复制表结构(两种方法)
sql
-- 在create table语句的末尾添加like子句,可以将源表的表结构复制到新表中。
CREATE TABLE 新表 LIKE 源表;
sql
-- 在create table语句的末尾添加一个select语句,可以实现将想要的源表的表记录及其字段结构拷贝到新表中。
CREATE TABLE 新表 SELECT */关键字 FROM 源表;
复制表内容
sql
-- 已经存在一张机构一致的表,复制数据。
INSERT INTO 新表 SELECT * FROM 原表;
注意
- 如果直接复制表结构,则会默认将约束也一起复制。
- 如果复制表结构的同时,复制数据,则不会复制约束。
数据库字典
由information_schema数据库负责维护。
- tables
- 存放数据库里所有的数据表、以及每个表所在数据库。
- schemata
- 存放数据库里所有的数据库信息。
- views
- 存放数据库里所有的视图信息。
- columns
- 存放数据库里所有的列信息。
- triggers
- 存放数据库里所有的触发器。
- routines
- 存放数据库里所有存储过程和函数。
- key_column_usage
- 存放数据库所有的主外键。
- table_constraints
- 存放数据库全部约束。
- statistics
- 存放了数据表的索引。