1. 创建数据库 #
-
CREATE DATABASE 用于创建数据库。
CREATE DATABASE database_name CREATE DATABASE my_db
-- 创建数据库之前判断是否已经存在 CREATE DATABASE IF NOT EXISTS my_db;
2. 创建数据表 #
-
CREATE TABLE 语句用于创建数据库中的表。
CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... )
-- 创建数据表之前,判断是否已存在 CREATE TABLE IF NOT EXISTS 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... )
-- 实例 CREATE TABLE Persons ( Id_P int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) )
3. Constraints 约束 #
- 约束用于限制加入表的数据的类型。
- 可以在创建表时规定约束(通过 CREATE TABLE 语句)
- 或者在表创建之后也可以(通过 ALTER TABLE 语句)
3.1. NOT NULL #
-
NOT NULL 约束强制列不接受 NULL 值。
-
这意味着,如果不向该字段添加值,就无法插入新记录或者更新记录。
CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) )
3.2. UNIQUE #
-
UNIQUE 约束唯一标识数据库表中的每条记录。
-
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
-
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
-
每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
-- 在 "Persons" 表创建时在 "Id_P" 列创建 UNIQUE 约束 CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), UNIQUE (Id_P) )
/* 命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束。 Id_P和LastName的组合必须唯一 */ CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) )
-- 当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束 ALTER TABLE Persons ADD UNIQUE (Id_P)
-- 命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束 ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
-- 撤销 UNIQUE 约束 ALTER TABLE Persons DROP INDEX uc_PersonID
3.3. PRIMARY KEY #
-
PRIMARY KEY 约束是唯一标识数据库表中的每条记录。主键必须是唯一的值。
-
主键列不能包含 NULL 值。
-
每个表都应该有一个主键,并且每个表只能有一个主键。
-
如果使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
-- 在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束: CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), PRIMARY KEY (Id_P) )
/* 命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束 这是一个复合主键,由两个列Id_P和LastName组成, 这意味着这两个列的组合在表中必须唯一,且不能为空。 */ CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName) )
-- 当表已被创建时,如需在 "Id_P" 列创建 PRIMARY KEY 约束 ALTER TABLE Persons ADD PRIMARY KEY (Id_P)
-- 命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束 ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
-- 撤销 PRIMARY KEY 约束 ALTER TABLE Persons DROP PRIMARY KEY
3.4. FOREIGN KEY #
-
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
-- 在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY CREATE TABLE Orders ( Id_O int NOT NULL, OrderNo int NOT NULL, Id_P int, PRIMARY KEY (Id_O), FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) )
-- 命名 FOREIGN KEY 约束,为外键约束指定了一个名称 CREATE TABLE Orders ( Id_O int NOT NULL, OrderNo int NOT NULL, Id_P int, PRIMARY KEY (Id_O), CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) )
-- 在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束 ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
-- 命名 FOREIGN KEY 约束,为外键约束指定了一个名称 ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
-- 撤销 FOREIGN KEY 约束 ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders
3.5. CHECK #
-
CHECK 约束用于限制列中的值的范围。
-
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
-
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
/* 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。 CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。 */ CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CHECK (Id_P>0) )
-- 命名 CHECK 约束,以及为多个列定义 CHECK 约束 CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes') )
-- 在表已存在的情况下为 "Id_P" 列创建 CHECK 约束 ALTER TABLE Persons ADD CHECK (Id_P>0)
-- 命名 CHECK 约束,以及为多个列定义 CHECK 约束 ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
-- 撤销 CHECK 约束 ALTER TABLE Persons DROP CHECK chk_Person
3.6. DEFAULT #
-
DEFAULT 约束用于向列中插入默认值。
-
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
-- 在 "Persons" 表创建时为 "City" 列创建 DEFAULT 约束 CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) DEFAULT 'Sandnes' )
-- 使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值 CREATE TABLE Orders ( Id_O int NOT NULL, OrderNo int NOT NULL, Id_P int, OrderDate date DEFAULT GETDATE() )
-- 表已存在的情况下为 "City" 列创建 DEFAULT 约束 ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES'
-- 撤销 DEFAULT 约束 ALTER TABLE Persons ALTER City DROP DEFAULT
4. 数据类型 #
4.1. DATE 函数 #
- 处理日期时,最难确保的是插入的日期的格式与数据库中日期列的格式相匹配
- 只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。
- MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
函数 | 格式 |
---|---|
DATE | YYYY-MM-DD |
DATETIME | YYYY-MM-DD HH:MM:SS |
TIMESTAMP | YYYY-MM-DD HH:MM:SS |
YEAR | YYYY 或 YY |
-
如果您希望使查询简单且更易维护,那么请不要在日期中使用时间部分
-- MySQL Date 函数 NOW() -- 返回当前的日期和时间 CURDATE() -- 返回当前的日期 CURTIME() -- 返回当前的时间 DATE() -- 提取日期或日期/时间表达式的日期部分 EXTRACT() -- 返回日期/时间按的单独部分 DATE_ADD() -- 给日期添加指定的时间间隔 DATE_SUB() -- 从日期减去指定的时间间隔 DATEDIFF() -- 返回两个日期之间的天数 DATE_FORMAT() -- 用不同的格式显示日期/时间 SELECT * FROM Orders WHERE OrderDate='2008-12-26'
4.2. NULL 值 #
-
NULL 值是遗漏的未知数据。
-
默认地,表的列可以存放 NULL 值。
-
如果表中的某个列是可选的,可以在不向该列添加值的情况下插入新记录。该字段将以 NULL 值保存。
-
NULL 用作未知的或不适用的值的占位符。
-
无法比较 NULL 和 0;它们是不等价的。
-
无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>
-
必须使用 IS NULL 和 IS NOT NULL 操作符。
SELECT LastName,FirstName,Address FROM PersonsWHERE Address IS NULL SELECT LastName,FirstName,Address FROM PersonsWHERE Address IS NOT NULL -- MySQL 里的 IFNULL 用法 SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products -- 或者 SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0)) FROM Products
4.3. Text 类型 #
数据类型 | 描述 |
---|---|
CHAR(size) | · 保存固定长度的字符串(可包含字母、数字以及特殊字符) · 在括号中指定字符串的长度, 最多 255 个字符。 |
VARCHAR(size) | · 保存可变长度的字符串(可包含字母、数字以及特殊字符) · 在括号中指定字符串的最大长度, 最多 255 个字符 · 如果值的长度大于 255,则被转换为 TEXT 类型 |
TINYTEXT | · 存放最大长度为 255 个字符的字符串 |
TEXT | · 存放最大长度为 65,535 个字符的字符串 |
BLOB | · 用于 BLOBs (Binary Large OBjects) · 存放最多 65,535 字节的数据 |
MEDIUMTEXT | · 存放最大长度为 16,777,215 个字符的字符串 |
MEDIUMBLOB | · 用于 BLOBs (Binary Large OBjects) · 存放最多 16,777,215 字节的数据 |
LONGTEXT | · 存放最大长度为 4,294,967,295 个字符的字符串 |
LONGBLOB | · 用于 BLOBs (Binary Large OBjects) · 存放最多 4,294,967,295 字节的数据 |
ENUM(x,y,z,etc.) | · 允许你输入可能值的列表 · 可以在 ENUM 列表中列出最大 65535 个值 · 如果列表中不存在插入的值,则插入空值 · 这些值是按照你输入的顺序存储的 · 可以按照此格式输入可能的值:ENUM(‘X’,‘Y’,‘Z’) |
SET | · 与 ENUM 类似,SET 最多只能包含 64 个列表项 · 不过 SET 可存储一个以上的值 |
4.4. Number 类型 #
- 有符号整数:有符号整数包括正数、负数和零。
- 无符号整数:无符号整数仅表示非负数(包括零)。
- 在MySQL中,默认是有符号的,但你可以使用UNSIGNED关键字来声明无符号。
数据类型 | 描述 |
---|---|
TINYINT(size) | · -128 到 127 常规 · 0 到 255 无符号* · 在括号中规定最大位数 |
SMALLINT(size) | · -32768 到 32767 常规 · 0 到 65535 无符号* · 在括号中规定最大位数 |
MEDIUMINT(size) | · -8388608 到 8388607 普通 · 0 to 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 类型,允许固定的小数点。 |
4.5. 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 |