SQL的初步学习(一)(以MySQL为例)
目录
一、SQL (Structured Query Language) 概述
二、SQL 基础语法
1.DDL(数据定义语言)
a.数据库操作
(1)查询数据库
(2)使用数据库
(3)创建数据库
(4)删除数据库
b.表操作
(1)基础知识
数据类型
(2)查询表
查询当前数据库所有的表
查询表结构
查询建表语句
(3)创建表
约束
(4)修改表
添加字段
修改字段类型
修改字段名和字段类型
删除字段
修改表名
(5)删除表
2.DML(数据操作语言)
a.insert语法
b.update语法
c.delete语法
一、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 条件];