目录
一、SQL (Structured Query Language) 概述
一、SQL (Structured Query Language) 概述
SQL 是一种用于管理关系数据库的标准语言。 它允许你:
创建数据库
创建表
插入数据
读取数据
更新数据
删除数据
定义数据库的权限
MySQL 简介
MySQL 是一种流行的关系型数据库管理系统 (RDBMS)。它以其速度、可靠性和易用性而闻名,广泛用于 Web 应用程序的开发。
二、SQL 基础语法
SQL 语句通常由关键词、标识符、字面值和操作符构成。 SQL 语句对大小写不敏感 (关键字除外,有些数据库会区分)。注意:SQL语句必须以分号结尾,否则直到分号之前的所有语句都被看成同一句。
1.DDL(数据定义语言)
a.数据库操作
(1)查询数据库
查询所有数据库
show databases;-- 等同于SHOW DATABASES;
查询当前数据库
select database();-- SELECT DATABASE();
(2)使用数据库
use后为需要使用的数据库名字。
use database_name;-- USE database_name;
(3)创建数据库
if not exists之后为创建的数据库的名字,if not exists可以不写,但如果不写,创建一个已经存在的同名数据库时会报错。
create database if not exists database_name;-- CREATE DATABASE IF NOT EXISTS database_name;
(4)删除数据库
if exists之后为要删除的数据库的名字,if exists 可以不写,但如果不写,删除一个不存在的数据库时会报错。
drop database if exists database_name;-- DROP DATABASE IF EXISTS database_name;
b.表操作
(1)基础知识
数据类型
数值类型 (Numeric Types)
数值类型用于存储数字相关的数据,可以进行算术运算。
整数类型 (Integer Types) : 存储整数 (没有小数部分的数字)
TINYINT: 1 字节 (8 位), 范围通常为 -128 到 127 (有符号) 或 0 到 255 (无符号)。 主要用于节省存储空间,存储较小的整数。
SMALLINT: 2 字节 (16 位), 范围通常为 -32,768 到 32,767 (有符号) 或 0 到 65,535 (无符号)。
MEDIUMINT: 3 字节 (24 位), 范围通常为 -8,388,608 到 8,388,607 (有符号) 或 0 到 16,777,215 (无符号)。
INT (INTEGER): 4 字节 (32 位), 范围通常为 -2,147,483,648 到 2,147,483,647 (有符号) 或 0 到 4,294,967,295 (无符号)。 常用的整数类型。
BIGINT: 8 字节 (64 位), 范围通常为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 (有符号) 或 0 到 18,446,744,073,709,551,615 (无符号)。 存储非常大的整数。
UNSIGNED: 许多数据库系统允许使用
UNSIGNED
修饰符,表示该整数类型只能存储非负数 (正数和零)。 例如INT UNSIGNED
。浮点数类型 (Floating-point Types): 存储带有小数部分的数字
FLOAT: 浮点数,单精度,通常占用 4 字节。 存储范围和精度有限。 表示近似值。
DOUBLE (DOUBLE PRECISION): 浮点数,双精度,通常占用 8 字节。 存储范围和精度比
FLOAT
更好。 表示近似值。DECIMAL (NUMERIC): 精确的十进制数。 可以指定精度 (总共的数字位数) 和标度 (小数位数)。 例如
DECIMAL(10, 2)
表示总共 10 位数字,其中 2 位是小数。 存储真实值,不会有精度损失。 比FLOAT
和DOUBLE
占用更多存储空间,但适合处理货币等需要精确计算的场景。
字符类型 (Character Types)
字符类型用于存储文本字符串。
CHAR(n): 定长字符串,
n
是字符串的长度 (字符数)。 如果存储的字符串长度小于n
,则用空格填充到n
。 效率高,但可能浪费空间。VARCHAR(n): 变长字符串,
n
是字符串的最大长度 (字符数)。 实际存储的长度根据字符串的实际长度而定。 更节省空间,但略微降低效率。 存储的内容长度不会超过 n。TEXT (TINYTEXT, MEDIUMTEXT, LONGTEXT): 用于存储长文本数据。
TINYTEXT
: 最大长度有限,通常几百个字符。TEXT
: 长度比TINYTEXT
长,通常几千或几万个字符。MEDIUMTEXT
: 更长的文本,可能几百万个字符。LONGTEXT
: 最长的文本,可以存储非常长的文本。TEXT 类型一般不设置长度。
ENUM: 枚举类型。 允许你从预定义的字符串列表中选择一个值。例如
ENUM('red', 'green', 'blue')
。 只存储整数,效率高。SET: 集合类型。 允许你从预定义的字符串列表中选择零个或多个值。 与 ENUM 类似,但存储的是一个bitmask,可以存储多个值的组合。 例如
SET('a', 'b', 'c')
允许存储 'a', 'b', 'c', 'a,b', 'a,c', 'b,c', 'a,b,c' 或 空字符串。
日期/时间类型 (Date and Time Types)
用于存储日期和时间信息。
DATE: 日期,格式为 'YYYY-MM-DD' (例如, '2023-10-27')。 只存储日期。
TIME: 时间,格式为 'HH:MM:SS' (例如, '14:30:00'), 或 'HH:MM:SS.ffffff' (带秒的小数表示)
DATETIME: 日期和时间,格式为 'YYYY-MM-DD HH:MM:SS' (例如, '2023-10-27 14:30:00')。 存储了日期和时间,通常结合使用。
TIMESTAMP: 时间戳。 存储日期和时间,通常与时区相关。 默认情况下,当插入或更新行时,会自动更新为当前时间。 也有
CURRENT_TIMESTAMP
作为一个值。 不同的 DBMS 对 TIMESTAMP 的具体行为略有差异。YEAR: 年份,通常存储为 4 位数字。
布尔类型 (Boolean Type)
BOOLEAN (BOOL): 存储布尔值 (真或假)。 一些数据库系统没有直接的 BOOLEAN 类型,会用
TINYINT(1)
或INT
来模拟,其中 0 通常表示FALSE
, 非0 值表示TRUE
。
二进制类型 (Binary Types)
用于存储二进制数据 (例如,图像、音频、文档等)。
BLOB (TINYBLOB, MEDIUMBLOB, LONGBLOB): 用于存储二进制大对象 (Binary Large Object)。
TINYBLOB
: 存储的小 BLOB。BLOB
: 普通的 BLOB。MEDIUMBLOB
: 存储中等大小的 BLOB。LONGBLOB
: 存储大型 BLOB。
BINARY(n): 定长二进制字符串。
VARBINARY(n): 变长二进制字符串。
其他类型
JSON: 用于存储 JSON (JavaScript Object Notation) 数据。 支持结构化数据,可以存储复杂的数据结构。
GEOMETRY: 用于存储几何数据 (例如,点、线、多边形等) 。 空间数据类型。
(2)查询表
查询当前数据库所有的表
show tables;-- SHOW TABALES;
查询表结构
desc table_name;-- DESC table_name;
查询建表语句
show create table table_name;-- SHOW CREATE TABLE table_name;
(3)创建表
create table 表名{
字段1 字段类型 [约束] [comment 字段1注释],
字段2 字段类型 [约束] [comment 字段2注释],
...
字段n 字段类型 [约束] [comment 字段n注释],
}[comment 表注释];
示例:
CREATE TABLE Customers (
CustomerID INT PRIMARY KEY, -- 主键
FirstName VARCHAR(255) NOT NULL, -- 不能为空
LastName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(100),
Country VARCHAR(100),
PostalCode VARCHAR(20)
);
约束
约束命名: 为了方便管理,建议为约束命名。 未命名的约束系统会自动生成名称,但难以记忆和管理。
创建约束: 可以在创建表时,直接在列定义后面添加约束。也可以使用 ALTER TABLE
语句添加约束。
-- 添加 NOT NULL 约束
ALTER TABLE employees
MODIFY COLUMN first_name VARCHAR(50) NOT NULL; -- MySQL 语法
ALTER TABLE employees
ALTER COLUMN first_name SET NOT NULL; -- SQL Server 和 PostgreSQL 语法
-- 添加 UNIQUE 约束
ALTER TABLE employees
ADD UNIQUE (email);
-- 添加 PRIMARY KEY 约束 ( 通常是列定义的时候创建,这里作为示例 )
ALTER TABLE employees
ADD PRIMARY KEY (employee_id);
-- 添加 FOREIGN KEY 约束
ALTER TABLE orders
ADD FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
-- 添加 CHECK 约束
ALTER TABLE employees
ADD CONSTRAINT CHK_age CHECK (age >= 18);
删除约束: 使用 ALTER TABLE
语句删除约束。
-- 删除 UNIQUE 约束
ALTER TABLE employees
DROP INDEX email; -- MySQL 语法 (根据索引名)
ALTER TABLE employees
DROP CONSTRAINT UK_email; -- SQL Server 语法 (根据约束名)
-- 删除 PRIMARY KEY 约束
ALTER TABLE employees
DROP PRIMARY KEY;
-- 删除 FOREIGN KEY 约束
ALTER TABLE orders
DROP FOREIGN KEY orders_ibfk_1; -- MySQL 语法 (根据约束名/索引名)
ALTER TABLE orders
DROP CONSTRAINT FK_customer_id; -- SQL Server 语法
-- 删除 CHECK 约束
ALTER TABLE employees
DROP CONSTRAINT CHK_age;
NOT NULL 约束 (NOT NULL Constraint)
作用: 确保某一列不允许包含空值。 每个列必须包含一个值,不能留空。
UNIQUE 约束 (UNIQUE Constraint)
作用: 确保某一列或多列的组合的值在表中是唯一的。 多个行不能在
UNIQUE
约束的列或组合列中包含相同的值。
PRIMARY KEY 约束 (PRIMARY KEY Constraint)
作用: 唯一的标识表中的每一行。
PRIMARY KEY
约束结合了NOT NULL
和UNIQUE
的功能。 一个表只能有一个PRIMARY KEY
约束。
FOREIGN KEY 约束 (FOREIGN KEY Constraint)
作用: 建立两个表之间的关系。 一个表中的
FOREIGN KEY
列引用另一个表中的PRIMARY KEY
列 (或UNIQUE
列)。FOREIGN KEY
约束确保了引用的完整性。
CHECK 约束 (CHECK Constraint)(部分数据库支持,MySQL 8.0.16 及之后支持)
作用: 检查列中的值是否满足指定的条件。
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
age INT CHECK (age >= 18), -- 使用 CHECK 约束
salary DECIMAL(10, 2) CHECK (salary > 0)
);
DEFAULT约束(DEFAULT Constraint)
DEFAULT
子句用于在定义列时指定一个默认值。 当向表中插入数据,但没有为该列提供值时,将使用指定的默认值。 这可以确保数据在没有显式设置的情况下也有一个合理的值。
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
hire_date DATE DEFAULT '2023-01-01', -- 默认雇佣日期为 '2023-01-01'
is_active BOOLEAN DEFAULT TRUE, -- 默认状态为激活
department_id INT DEFAULT NULL -- 默认部门为 NULL
-- 如果没有提供值,则使用默认值
);
AUTO_INCREMENT (AUTO_INCREMENT Constraint)(MySQL)
AUTO_INCREMENT
是 MySQL 独有的属性,用于自动生成唯一整数值。 它通常应用于表的 PRIMARY KEY
列,以确保每条记录都有一个唯一的标识符,且无需手动指定。
作用:
自动生成主键: 简化了主键生成过程,避免了手动编写用于生成唯一 ID 的代码。
确保唯一性: 自动生成的 ID 在表中是唯一的,防止了主键冲突。
提高数据完整性: 保证了主键的唯一性。
节省开发工作量: 无需手动管理主键值。
(4)修改表
添加字段
alter table 表名 add 字段名 类型(长度) [comment 字段注释] [约束];
修改字段类型
alter table 表名 modify 字段 新类型(长度);
修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
删除字段
alter table 表名 drop column 字段名;
修改表名
rename table 表名 to 新表名;
(5)删除表
drop table [if exists] 表名;-- DROP TABLE [IF EXISTS] 表名;
2.DML(数据操作语言)
a.insert语法
指定字段添加数据
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,...)...;
b.update语法
update 表名 set 字段名1=值1,字段名2=值2,...[where 条件];
c.delete语法
delete from 表名 [where 条件];