概念
SQL 全称是 Structured Query Language,结构化查询语言,SQL 大致可以分成几类:
DDL:Data Definition Language 数据定义语言
DML:Data Manipulation Language 数据操作语言
DQL:Data Query Language 数据查询语言
DCL:Data Control Language 数据控制语言
因为大部分时候在操作表,为了便于记忆,可以不严谨地分为下面三种语句
管理表结构或库结构
管理表数据变化
管理表数据查询
SQL 可以单行写,也可以多行写,但一条语句结束要加分号。MySQL 关键字不区分大小写
注释有三种常见写法:
-- 单行注释,注意 -- 后面要有空格
# MySQL 特有的单行注释
/* */ 多行注释
数据类型
MySQL 中储存的数据有以下数据类型
- tinyint
1字节有符号整型,范围是-128-127 - tinyint unsigned
1字节无符号整型,范围是0-255 - int
4字节有符号整型,范围是-2147483648-2147483647 - int unsigned
4字节无符号整型,范围是0-4294967295 - bigint
8字节有符号整型,范围是-9223372036854775808-9223372036854775807 - bigint unsigned
8字节无符号整型,范围是0-18446744073709551615 - float
小数类型,4字节,不精准计算可以使用,不推荐使用 - double
小数类型,8字节,不精准计算可以使用,不推荐使用 - decimal
小数类型,精准计算使用,decimal(m,d),m表示数字总个数,d是小数点后的个数,m的最大值是65,d最大值是30,如果小数部分超过了限制的长度,会进行四舍五入 - char
固定长度字符串类型,最大255个字符 - varchar
可变长度字符串类型,最大21000个字符 - text
文本类型,最大65535个字符,使用的时候不需要指定字符串大小 - datetime
时间类型,保存的格式是年月日时分秒,存储时间与时区无关 - date
时间类型,保存的格式是年月日,存储时间与时区无关 - timestamp
时间戳类型,保存的是从1970-01-01 00:00:00到现在的时间戳,当将TIMESTAMP值插入到表中时,MySQL会将其从连接的时区转换为UTC后进行存储。当查询TIMESTAMP值时,MySQL会将UTC值转换回连接的时区进行显示,存储时间与时区有关,最大范围支持到2038-01-19 03:14:07
环境查看
使用 MySQL 时,应该先看当前环境
SHOW DATABASES; 查看所有数据库
USE 数据库名; 使用数据库
SELECT DATABASE(); 查看当前使用的数据库
SHOW TABLES; 查看当前数据库内所有表
DESC 表名; 查看表结构
数据库在使用时一般以库为单位,操作库里的表,所以需要使用 use
命令行里还有一个显示方式:
SHOW CREATE TABLE mytable\G;
\G 不是 SQL 语法本身,而是 MySQL 客户端的纵向显示方式,一般用于字段多的时候
管理结构
库
CREATE DATABASE IF NOT EXISTS db_test; 创建库db_test
DROP DATABASE IF EXISTS db_test; 删除库db_test
表
CREATE TABLE IF NOT EXISTS 表名 ( 创建表
字段名 数据类型 约束,
字段名 数据类型 约束
);
DROP TABLE IF EXISTS student; 删除表
ALTER TABLE stu ADD address VARCHAR(50); 添加字段
ALTER TABLE stu MODIFY address CHAR(50); 修改字段类型
ALTER TABLE stu CHANGE address addr VARCHAR(50); 修改字段名和字段类型
ALTER TABLE stu DROP addr; 删除字段
ALTER TABLE student RENAME TO stu; 修改表名
MODIFY:只改字段定义,不改字段名
CHANGE:字段名和字段定义一起改
约束
约束是表结构里很关键的一部分,把规则放到数据库层面可以避免错误数据被写进去
默认约束:DEFAULT,未指定值时自动使用默认值
CREATE TABLE test (
id INT PRIMARY KEY AUTO_INCREMENT,
bonus INT DEFAULT 0
);
建表后添加默认值:
ALTER TABLE test MODIFY bonus INT DEFAULT 0;
删除默认值本质是重新定义字段:
ALTER TABLE test MODIFY bonus INT;
非空约束:NOT NULL,字段必须有值
CREATE TABLE test (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL
);
建表后添加:
ALTER TABLE test MODIFY name VARCHAR(50) NOT NULL;
删除非空约束本质也是重新修改字段定义:
ALTER TABLE test MODIFY name VARCHAR(50);
唯一约束:UNIQUE,字段不能重复
CREATE TABLE test (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) UNIQUE
);
给约束命名:
CREATE TABLE test (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
CONSTRAINT uk_name UNIQUE(name)
);
建表后添加:
ALTER TABLE test ADD CONSTRAINT uk_name UNIQUE(name);
删除唯一约束时用的是 DROP INDEX:
ALTER TABLE test DROP INDEX uk_name;
MySQL 里唯一约束底层依赖唯一索引,所以删除是 DROP INDEX
主键约束:PRIMARY KEY,主键是一行数据的唯一标识,特点是:非空、唯一、一张表只能有一个主键
CREATE TABLE test (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
或者:
CREATE TABLE test (
id INT,
name VARCHAR(50),
CONSTRAINT uk_name PRIMARY KEY(id)
);
建表后添加:
ALTER TABLE test ADD PRIMARY KEY(id);
删除主键:
ALTER TABLE test DROP PRIMARY KEY;
主键通常使用自增 ID
外键约束:FOREIGN KEY,外键用于建立表和表之间的数据库层面的关系
比如员工属于部门,员工表里的部门 id 指向部门表的 id
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
addr VARCHAR(20)
);
CREATE TABLE emp(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20),
age INT,
dep_id INT,
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);
建表后添加外键:
ALTER TABLE test ADD CONSTRAINT uk_name FOREIGN KEY(id) REFERENCES test2(id);
删除外键:
ALTER TABLE test DROP FOREIGN KEY uk_name;
外键的意义是:如果部门表里 id=1 的部门还有员工引用,那么直接删除这个部门会失败。它保证的是引用完整性。
外键字段和被引用字段的数据类型要一致
被引用字段通常必须是主键或唯一键
两张表要使用支持外键的存储引擎,比如 InnoDB
删除外键用 DROP FOREIGN KEY,不是 DROP INDEX
Comments NOTHING