-
前言
- 不知道该怎么学,但是学吧,先跟着别人的博客写一篇基础,慢慢来。
-
一、SQL简述
-
-
1.SQL的概述
-
Structure Query Language(结构化查询语言)简称SQL,它被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。数据库管理系统可以通过SQL管理数据库;定义和操作数据,维护数据的完整性和安全性。
-
-
2.SQL的优点
-
1、简单易学,具有很强的操作性
2、绝大多数重要的数据库管理系统均支持SQL
3、高度非过程化;用SQL操作数据库时大部分的工作由DBMS自动完成
-
-
3.SQL的分类
-
1、DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP
2、DML(Data Manipulation Language) 数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE
3、DCL(Data Control Language) 数据控制语言,用来操作访问权限和安全级别; 常用语句:GRANT、DENY
4、DQL(Data Query Language) 数据查询语言,用来查询数据 常用语句:SELECT
-
-
-
二、数据库的三大范式
-
1、第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线;也就是说:每列的值具有原子性,不可再分割。
-
2、第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)。如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。
-
3、第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖。
-
-
三、数据库的数据类型
-
-
1.整数类型
TINYINT
:占用 1 字节,范围为 -128 到 127,或者 0 到 255(无符号)。SMALLINT
:占用 2 字节,范围为 -32,768 到 32,767,或者 0 到 65,535(无符号)。MEDIUMINT
:占用 3 字节,范围为 -8,388,608 到 8,388,607,或者 0 到 16,777,215(无符号)。INT
/INTEGER
:占用 4 字节,范围为 -2,147,483,648 到 2,147,483,647,或者 0 到 4,294,967,295(无符号)。BIGINT
:占用 8 字节,范围为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807,或者 0 到 18,446,744,073,709,551,615(无符号)。- 使用整数类型时,可以指定是否使用无符号(
UNSIGNED
),这可以让你存储更大的正数。
-
2.浮点数类型和定点数类型
-
浮点数类型
FLOAT
:单精度浮点数,占用 4 字节。适合存储较小范围的浮点数。DOUBLE
:双精度浮点数,占用 8 字节。适合存储较大范围的浮点数。
-
定点数类型
DECIMAL(M, D)
:定点数,存储精确的小数。M
表示数的总位数,D
表示小数点后的位数。DECIMAL
不会有浮点数的舍入误差问题,适合存储货币或高精度要求的数据。
-
-
3.字符串类型
CHAR(M)
:固定长度的字符串,长度最多为 255 个字符。即使实际存储的字符少于指定长度,也会填充空格。VARCHAR(M)
:可变长度的字符串,最多可以存储 65,535 个字符。实际占用的空间与存储的数据长度有关。TEXT
:适合存储大段文本,有多种类型:TINYTEXT
:最多存储 255 个字符。TEXT
:最多存储 65,535 个字符。MEDIUMTEXT
:最多存储 16,777,215 个字符。LONGTEXT
:最多存储 4,294,967,295 个字符。
ENUM
:字符串对象,允许从预定义的一组值中选择一个。比如ENUM('small', 'medium', 'large')
。SET
:字符串对象,可以从一组值中选择一个或多个。
-
5.日期与时间类型
-
-
5.1 YEAR类型
YEAR
:存储的格式为YYYY
,可以表示 1901 到 2155 之间的年份。
-
5.2 TIME类型
TIME
:存储的格式为HH:MM:SS
,表示一天中的时间或时间间隔,范围从-838:59:59
到838:59:59
。
-
5.3 DATETIME类型
-
DATETIME
:存储的格式为YYYY-MM-DD HH:MM:SS
,表示特定日期和时间,范围从1000-01-01 00:00:00
到9999-12-31 23:59:59
。DATETIME
不会随着时区变化而改变。
-
-
5.4 TIMESTAMP类型
TIMESTAMP
:存储的格式也是YYYY-MM-DD HH:MM:SS
,范围从1970-01-01 00:00:01 UTC
到2038-01-19 03:14:07 UTC
。适合用于记录数据的创建时间和更新时间。
-
-
6.二进制类型
-
BINARY(M)
:存储固定长度的二进制字符串,长度最多为 255 字节。类似于CHAR
,但存储二进制数据。 -
VARBINARY(M)
:存储可变长度的二进制字符串,长度最多为 65,535 字节。类似于VARCHAR
,但用于存储二进制数据。 -
BLOB
:适合存储大量二进制数据,有多种类型:TINYBLOB
:最多存储 255 字节。BLOB
:最多存储 65,535 字节。MEDIUMBLOB
:最多存储 16,777,215 字节。LONGBLOB
:最多存储 4,294,967,295 字节。
-
-
-
四、数据库、数据表的基本操作
-
-
1.数据库的基本操作
- 1.1 创建数据库
- CREATE DATABASE 数据库名;(默认utf8)
- CREATE DATABASE 数据库名 CHARACTER SET 编码 COLLATE utf8mb4_general_ci;
- 1.2 查看数据库
- SHOW DATABASES;
- 1.3 使用数据库
- USE 数据库名;
- 1.4 删除数据库
- DROP DATABASE 数据库名;
- 1.1 创建数据库
-
2.数据表的基本操作
-
-
2.1 创建数据表
- CREATE TABLE 表名(
字段名1 数据类型 约束条件,
字段名2 数据类型 约束条件,
...
); -
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, --primary key是设置主键,auto_increment是自动添加name VARCHAR(50) NOT NULL,age INT,email VARCHAR(100) );
- CREATE TABLE 表名(
-
2.2 查看数据表
- 查看表结构:使用
DESCRIBE
或SHOW COLUMNS
查看表的列定义。- DESCRIBE 表名;
- SHOW COLUMNS FROM 表名;
- 查看所有表:使用
SHOW TABLES
查看当前数据库中的所有表。- SHOW TABLES;
- 查看表结构:使用
-
2.3 修改数据表
- 添加列:使用
ALTER TABLE
来添加新列。- ALTER TABLE 表名 ADD 列名 数据类型;
- 修改列:使用
ALTER TABLE
修改现有列的属性。- ALTER TABLE 表名 MODIFY 列名 新类型;
- 重命名列:使用
ALTER TABLE
重命名列。- ALTER TABLE table_name CHANGE old_名 new_名 datatype;
- 在使用
ALTER TABLE
重命名列时,必须指定数据类型,即使你不想改变数据类型。
- 删除列:使用
ALTER TABLE
删除指定列。- ALTER TABLE table_name DROP column_name;
- 添加列:使用
-
2.4 删除数据表
- 使用
DROP TABLE
来删除表以及表中所有的数据。- DROP TABLE table_name;
- 删除所有数据(不加条件):
- DELETE FROM table_name;
DELETE
命令可以用来删除表中符合条件的部分或全部数据。它允许通过WHERE
子句指定条件来删除特定的行。如果不加WHERE
条件,则会删除表中的所有行。
- TRUNCATE TABLE table_name;
TRUNCATE
命令用于快速清空表中的所有数据,但保留表结构。与DELETE
不同,TRUNCATE
是一种 DDL(数据定义语言) 操作,它会重置表的AUTO_INCREMENT
计数器。TRUNCATE
操作比DELETE
更快,尤其是在数据量较大的情况下,因为它不逐行删除数据,而是直接清空表。TRUNCATE
不会触发DELETE
触发器。TRUNCATE
不能用于具有外键约束的表。
- DELETE FROM table_name;
- 使用
-
-
-
五、数据表的约束
-
-
1.主键约束(PRIMARY KEY)
-
主键约束用于唯一标识表中的每一行数据。主键列中的值必须是唯一的,且不能为空(
NOT NULL
)。一个表只能有一个主键,但可以由多个列组成。 -
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),email VARCHAR(100) );
这里
id
列是主键,值必须唯一,且自动递增。
-
-
2.非空约束(NOT NULL)
- 非空约束用于确保某一列的数据不能为空。
-
CREATE TABLE table_name (column1 datatype NOT NULL,column2 datatype,... );
-
3.默认值约束(DEFAULT)
-
默认值约束允许为列设置一个默认值,当插入数据时,如果没有为该列提供值,则使用默认值。
-
在此例中,
status
列的默认值是'active'
,如果插入数据时未提供status
,将自动使用默认值。CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,status VARCHAR(10) DEFAULT 'active' );
-
-
4.唯一性约束(UNIQUE)
-
唯一性约束确保列中的数据是唯一的,即同一列不能包含重复值。一个表可以有多个唯一约束。
-
email
列必须是唯一的,不能有重复值。CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE );
-
-
5.外键约束(FOREIGN KEY)
-
-
5.1 数据一致性概念
-
数据一致性就是确保数据库里的数据始终是正确的、完整的,并且符合预定的规则。外键约束是用来保持数据一致性的一种方法。简单来说,外键约束帮助你确保在一个表中引用的值在另一个表中是存在的。
例如,假设你有一个订单表和一个用户表。在订单表中,如果某个订单引用了一个用户 ID,外键约束确保这个用户 ID 在用户表中确实存在。这样可以防止你在订单表中插入一个无效的用户 ID(即在用户表中找不到这个 ID)。
-
CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,user_id INT,FOREIGN KEY (user_id) REFERENCES users(id) );
-
-
5.2 删除外键
- 可以使用
ALTER TABLE
命令来删除外键约束。 - ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
- 可以使用
-
5.3 关于外键约束需要注意的细节
- 父表的影响:当你删除或更新外键所引用的父表(主表)中的数据时,可以通过
ON DELETE
和ON UPDATE
来定义如何处理子表中的数据。例如,可以设置CASCADE
级联删除或更新,也可以设置SET NULL
使外键列变为NULL
。-
CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,user_id INT,FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE ); --在此例中,删除 users 表中的用户时,orders 表中相关的订单记录也会被删除(ON DELETE CASCADE)。更新用户时,订单中的 user_id 也会相应更新(ON UPDATE CASCADE)。
-
-
外键和自增列:外键列通常不应与
AUTO_INCREMENT
结合使用,因为外键是用于引用其他表的主键,而不是生成唯一标识。 -
索引要求:外键列必须有索引,MySQL 会自动为外键列创建索引,或者你需要手动添加索引。
- 父表的影响:当你删除或更新外键所引用的父表(主表)中的数据时,可以通过
-
-
-
六、数据表插入数据
-
-
1. 为表中所有字段插入数据
- INSERT INTO table_name VALUES (value1, value2, ...);
- 假设有一个名为
users
的表,包含id
,name
, 和email
列。如果你要插入一条记录,并且为所有字段提供值:- INSERT INTO users VALUES (1, 'Alice', 'alice@example.com');
-
2. 为表中指定字段插入数据
- 如果你只为部分字段提供值,可以明确指定列名。这种方法也允许插入记录时不按列的顺序排列值。
- INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
- 假设有一个名为
users
的表,包含id
,name
, 和email
列。如果你只想为name
和email
列插入数据,id
列自动生成(例如为自增列):- INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
-
3. 同时插入多条记录
- 可以使用单个
INSERT
语句同时插入多条记录,以提高插入效率。 - INSERT INTO table_name (column1, column2, ...) VALUES
(value1a, value2a, ...),
(value1b, value2b, ...),
...; - 假设有一个名为
users
的表,包含name
和email
列。要同时插入多条记录:- INSERT INTO users (name, email) VALUES
('Charlie', 'charlie@example.com'),
('Diana', 'diana@example.com'),
('Eve', 'eve@example.com');
- INSERT INTO users (name, email) VALUES
- 可以使用单个
-
-
七、更新数据
-
-
1. UPDATE基本语法
- UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
table_name
:要更新数据的表名。SET
:指定要更新的列及其新值。WHERE
:指定更新条件。只有符合条件的记录会被更新。
- UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
-
2. UPDATE更新部分数据
- 使用
UPDATE
语句时,可以通过WHERE
子句来限制更新的数据范围,只更新符合条件的记录。 - 假设有一个名为
employees
的表,包含id
,name
, 和salary
列。如果你只想更新id
为 3 的员工的薪水:- UPDATE employees
SET salary = 5000
WHERE id = 3;
- UPDATE employees
- 使用
-
3. UPDATE更新全部数据
- 如果你想更新表中的所有记录,可以省略
WHERE
子句,这将对表中的每一条记录进行更新。 - 假设你要将
employees
表中所有员工的薪水增加 1000:- UPDATE employees
SET salary = salary + 1000;
- UPDATE employees
- 如果你想更新表中的所有记录,可以省略
-
-
八、删除数据
-
-
1. DELETE基本语法
- DELETE FROM table_name WHERE condition;
table_name
:要删除数据的表名。WHERE
:指定删除的条件。只有符合条件的记录会被删除。
- DELETE FROM table_name WHERE condition;
-
2. DELETE删除部分数据
- 使用
WHERE
子句来限制删除的数据范围,只删除符合条件的记录。 - 假设有一个名为
employees
的表,如果你只想删除id
为 3 的员工记录:- DELETE FROM employees WHERE id = 3;
- 使用
-
3. DELETE删除全部数据
- 如果省略
WHERE
子句,将删除表中的所有记录,但保留表结构。 - DELETE FROM employees;
- 如果省略
-
4. TRUNCATE和DETELE的区别
-
DELETE
:- 逐行删除数据。
- 可以删除部分数据(使用
WHERE
子句)。 - 删除操作会触发
DELETE
触发器(如果有)。 - 不会重置自增列(
AUTO_INCREMENT
)。 - 较慢,特别是删除大量数据时。
-
TRUNCATE
:- 快速清空表中的所有数据。
- 不支持删除部分数据。
- 不会触发
DELETE
触发器。 - 会重置自增列(
AUTO_INCREMENT
)。 - 比
DELETE
快,适合删除大量数据时使用。
-
-
-
九、MySQL数据表简单查询
-
-
1.简单查询概述
- 简单查询用于从表中检索数据,通常涉及选择列和行。最基本的查询语句是
SELECT
。
- 简单查询用于从表中检索数据,通常涉及选择列和行。最基本的查询语句是
-
2.查询所有字段(方法不唯一只是举例)
- 要查询表中的所有字段,可以使用
*
,表示选择所有列。 - SELECT * FROM table_name;
- 假设有一个名为
students
的表,包含多个列。要查询所有列的所有记录:- SELECT * FROM students;
- 要查询表中的所有字段,可以使用
-
3.查询指定字段
- 要只查询特定的字段,可以指定列名。
- SELECT column1, column2 FROM table_name;
- 假设有一个名为
students
的表,包含sid
和sname
列。如果你只想查询sid
和sname
列:- SELECT sid, sname FROM students;
-
4.常数的查询
- 可以在
SELECT
语句中使用常数来进行查询。例如,可以直接选择一个常数值作为查询结果。
- 可以在
-
5.从查询结果中过滤重复数据
- 使用
DISTINCT
关键字来去除结果中的重复数据。 - SELECT DISTINCT column1, column2 FROM table_name;
- 假设有一个名为
students
的表,如果你只想查询不同的sname
(去重):- SELECT DISTINCT sname FROM students;
- 使用
-
6.算术运算符(举例加运算符)
- 可以在查询中使用算术运算符进行计算。常见的算术运算符包括
+
,-
,*
,/
, 和%
。 - 假设有一个名为
students
的表,包含score
列。要查询每个学生的分数加 10 的结果:- SELECT sid, sname, score + 10 AS new_score FROM students;
- 可以在查询中使用算术运算符进行计算。常见的算术运算符包括
-
总结
-
删除数据:
DELETE
:逐行删除,支持条件删除,较慢。TRUNCATE
:快速清空表,重置自增列,不能指定条件删除。
-
简单查询:
- 查询所有字段:
SELECT * FROM table_name;
- 查询指定字段:
SELECT column1, column2 FROM table_name;
- 使用常数:
SELECT column1, 10 AS constant_value FROM table_name;
- 过滤重复数据:
SELECT DISTINCT column FROM table_name;
- 算术运算:
SELECT column1, column2 + 10 FROM table_name;
- 查询所有字段:
-
-
-
十、函数
-
-
1.聚合函数
-
-
1.1、count()
-
1.2、max()
-
1.3、min()
-
1.4、sum()
-
1.5、avg()
-
-
2.其他常用函数
-
-
2.1、时间函数
-
2.2、字符串函数
-
2.3、数学函数
-
-
-
十一、条件查询
-
-
1.使用关系运算符查询
-
2.使用IN关键字查询
-
3.使用BETWEEN AND关键字查询
-
4.使用空值查询
-
5.使用AND关键字查询
-
6.使用OR关键字查询
-
7.使用LIKE关键字查询
-
-
7.1 普通字符串
-
7.2 含有%通配的字符串
-
7.3 含有_通配的字符串
-
-
8.使用LIMIT限制查询结果的数量
-
9.使用GROUP BY进行分组查询
-
-
9.1 GROUP BY和聚合函数一起使用
-
9.2 GROUP BY和聚合函数以及HAVING一起使用
-
-
10.使用ORDER BY对查询结果排序
-
-
十二、别名设置
-
-
1.为表取别名
-
2.为字段取别名
-
-
十三、表的关联关系
-
-
1.关联查询
-
2.关于关联关系的删除数据
-
-
十四、多表连接查询
-
-
1.交叉连接查询
-
2.内连接查询
-
3.外连接查询
-
-
3.1 左(外)连接查询
-
3.2 右(外)连接查询
-
-
-
十五、子查询
-
-
1.带比较运算符的子查询
-
2.带EXISTS关键字的子查询
-
3.带ANY关键字的子查询
-
4.带ALL关键字的子查询
-
-
总结