目录
3.5 like子句(使用百分号 %字符来表示任意字符,如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的)
3.6 ORDER BY(排序) 语句(如果有多个排序条件,只有前面的排序之后还是相同,才会运用后面的排序机制)
1.数据库(建库同时指定字符集和校验规则)
1.1 建数据库的基本语法(database)
-- IF Not EXISTS 表示如果数据库不存在才执行创建操作,避免因为表存在而引发错误。
CREATE DATABASE [IF NOT EXISTS] database_name
[CHARACTER SET charset_name]
[COLLATE collation_name];
1.2 drop 命令删除数据库
-- IF EXISTS 表示如果数据库存在才执行删除操作,避免因为表不存在而引发错误。
DROP DATABASE <database_name>; -- 直接删除数据库,不检查是否存在
DROP DATABASE [IF EXISTS] <database_name>; -- 检查是否存在,如果存在才删除
1.3 选择数据库(use)
USE database_name;
2.数据表(建表同时指定字符集和校验规则)
2.1 创建数据表基本语法(table)
CREATE TABLE table_name (
column1 数据类型 [约束] [默认],
column2 数据类型 [约束] [默认],
...
[表间的约束,eg:外键]
[主键,eg:primary key(column1,column2)]
)[引擎 eg:engine=innodb] [字符集 eg:character set utf8 or default charset=utf8] [校验规则 eg:collate utf8mb4_general_ci];
2.2 删除数据表(drop)
DROP TABLE table_name ; -- 直接删除表,不检查是否存在
DROP TABLE [IF EXISTS] table_name; -- 检查是否存在,如果存在才删除
2.3 alter
- 修改表名
ALTER TABLE <原表名> RENAME [TO] <新表名>
- 改字段的数据类型
- 可以修改数据类型或者约束
ALTER TABLE <表名> MODIFY <字段名> <数据类型>
- 添加字段
ALTER TABLE <表名> ADD <字段名> <数据类型>
- 删除字段
ALTER TABLE <表名> DROP <字段名>
- 添加外键约束
ALTER TABLE <表名> ADD [CONSTRAINT <约束名>] FOREIGN KEY (<外键字段名>)references
<对应主键所在表>(<对应主键字段名>)
2.4 创建表的同时创建索引
CREATE TABLE 表名(字段名 数据类型 [完整性约束条件],
[UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY
[索引名](字段名1 [(长度)] [ASC | DESC])
);
UNIQUE:可选。表示索引为唯一性索引。
FULLTEXT;可选。表示索引为全文索引。
SPATIAL:可选。表示索引为空间索引。
长度:可选。指索引的长度,必须是字符串类型才可以使用。
2.5 数据枚举(ENUM)类型
数据库枚举(ENUM
)类型在数据库设计中有很多用途和优势,主要包括以下几点:
1. 约束数据输入
枚举类型可以限制数据列的值只能是指定的几个选项之一。例如,性别字段可以使用 ENUM('男', '女')
,这样在插入或更新数据时,只能输入 '男'
或 '女'
,有效地避免了非法或不一致的输入。
2. 提高数据质量
通过限制允许的值,枚举类型可以减少数据输入错误。例如,如果一个字段允许的值是 ENUM('工学院', '会计学院', '经济学院', '音乐学院', '美术学院')
,那么用户只能从这些选项中选择,避免了手动输入可能导致的拼写错误或误解。
3. 增强查询性能
枚举类型的数据在内部被存储为整数索引(通常是基于枚举列表的顺序),而不是实际的字符串值。这可以减少存储空间的使用,并且提高某些查询的性能,因为整数索引比字符串比较更快。
3.数据的操作(CRUD)
3.1 插入数据
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
插入多条数据
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...),(value1, value2, value3, ...),(value1, value2, value3, ...);
3.2 查询数据
SELECT [all|distinct] column1 [as '别名'], column2 [as '别名'], ...
FROM table_name [as '别名']
[WHERE condition]
[ORDER BY column_name [ASC | DESC]]
[LIMIT number];
参数说明:
column1, column2, ... 是你想要选择的列的名称,如果使用 * 表示选择所有列。
table_name 是你要从中查询数据的表的名称。
WHERE condition 是一个可选的子句,用于指定过滤条件,只返回符合条件的行。
ORDER BY column_name [ASC | DESC] 是一个可选的子句,用于指定结果集的排序顺序,默认是升序(ASC)。
LIMIT number 是一个可选的子句,用于限制返回的行数。
3.3 更新数据
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
3.4 删除数据
DELETE FROM table_name
WHERE condition;
3.5 like子句(使用百分号 %字符来表示任意字符,如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的)
SELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE pattern;
参数说明:
column_name 是你要应用 LIKE 子句的列的名称。
pattern 是用于匹配的模式,可以包含通配符。
3.6 ORDER BY(排序) 语句(如果有多个排序条件,只有前面的排序之后还是相同,才会运用后面的排序机制)
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
3.7 GROUP BY(分组) + HAVING语句
SELECT column1, aggregate_function(column2)
FROM table_name
WHERE condition
GROUP BY column1
HAVING condition;
参数说明:
column1:指定分组的列。
aggregate_function(column2):对分组后的每个组执行的聚合函数。
where condition:表示查询条件
having condition: 是对分组应用的筛选条件,这里的condition是对分组的筛选,比如可以这样筛选aggregate_function(column2) > 90
聚合函数:
COUNT():用于计算选定列的行数。
SUM():用于计算选定列的总和。
AVG():用于计算选定列的平均值。
MAX():用于选取选定列的最大值。
MIN():用于选取选定列的最小值。
注意事项:
count(*),*表示所有字段,也可以填字段名称
GROUP BY 子句通常与聚合函数一起使用,因为分组后需要对每个组进行聚合操作。
SELECT 子句中的列通常要么是分组列,要么是聚合函数的参数。
可以使用多个列进行分组,只需在 GROUP BY 子句中用逗号分隔列名即可
SELECT column1, column2, aggregate_function(column3)
FROM TABLE_NAME
WHERE condition
GROUP BY column1, column2;
3.8 查询语句的条件顺序
在MySQL数据库中,查询语句的条件可以按照以下顺序进行组合和使用:
- 1. SELECT:选择要查询的列或表达式。
- 2. FROM:指定要查询的表。
- 3. WHERE:设置查询的条件,用于筛选满足条件的行。
- 4. GROUP BY:按照指定的列对结果进行分组。
- 5. HAVING:对分组后的结果进行条件过滤。
- 6. ORDER BY:按照指定的列对结果进行排序。
- 7. LIMIT:限制返回结果的数量。
这些条件可以根据需要进行组合和调整,以满足具体的查询需求。
3.9 查询操作符
操作符包括以下几种:
- 算术操作符:用于数学运算的操作符,例如加法
+
,减法-
,乘法*
,除法/
等。 - 比较操作符:用于比较两个值的关系,例如等于
=
,不等于<>
或!=
,大于>
,小于<
,大于等于>=
,小于等于<=
等。 - 逻辑操作符:用于连接条件表达式的操作符,例如逻辑与
AND
,逻辑或OR
,逻辑非NOT
等。 - 字符串操作符:用于对字符串进行操作的操作符,例如连接字符串的操作符
||
,字符串匹配的操作符LIKE
等。 - 位操作符:用于进行位运算的操作符,例如按位与
&
,按位或|
,按位取反~
等。 - 赋值操作符:用于给变量赋值的操作符,例如赋值
=
,加等于+=
,减等于-=
等。 - NULL判断操作符:用于判断字段是否为NULL值的操作符,例如
IS NULL
,IS NOT NULL
。 - 其他操作符:*表示全部列
操作符的使用方式:
- 等于:
=
,用于检查两个值是否相等。 - 不等于:
<>
或!=
,用于检查两个值是否不相等。 - 大于:
>
,用于检查左边的值是否大于右边的值。 - 小于:
<
,用于检查左边的值是否小于右边的值。 - 大于等于:
>=
,用于检查左边的值是否大于或等于右边的值。 - 小于等于:
<=
,用于检查左边的值是否小于或等于右边的值。 - BETWEEN:用于检查某个值是否在指定范围内,语法为
BETWEEN value1 AND value2
。 - NOT BETWEEN:用于检查某个值是否不在指定范围内,语法为
NOT BETWEEN value1 AND value2
。 - IN:用于检查某个值是否在给定的值列表中,语法为
IN (value1, value2, ...)
。 - NOT IN:用于检查某个值是否不在给定的值列表中,语法为
NOT IN (value1, value2, ...)
。 - LIKE:用于在搜索中匹配模式,可以使用通配符
%
(代表任意字符序列)和_
(代表任意单个字符)。 - NOT LIKE:与 LIKE 相反,用于不匹配指定模式。
- IS NULL:用于检查字段是否为空值。
- IS NOT NULL:用于检查字段是否不为空值。
4.多表查询
4.1 笛卡尔积
笛卡尔积是指在进行SQL查询时,如果没有指定任何条件或者连接条件,多张表之间会做笛卡尔积运算。笛卡尔积将两个表的所有行组合在一起,生成的结果是第一个表中每一行和第二个表中每一行的组合。这种情况下可能会导致结果集非常大,因此应该避免无意义的笛卡尔积操作。
要避免在数据库查询中使用不必要的笛卡尔积,可以使用连接操作(JOIN)指定表之间的关联条件,以便获取所需的结果集。
4.2 连接(内连接、左连接、右连接)
①.INNER JOIN(INNER JOIN 返回两个表中满足连接条件的匹配行,也就是它们的交集)
查到的是整合成的另外一张表
SELECT [all|distinct] column1 [as '别名'], column2 [as '别名'], ...
FROM table_name [as '别名'] inner join table_name2 on 连接条件
[WHERE 查询条件表达式]
SELECT *
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;
与上面结果一样,也可以这样实现
SELECT [all|distinct] column1 [as '别名'], column2 [as '别名'], ...
FROM table_name [as '别名'] , table_name2 [as '别名']
WHERE 连接条件 [AND 查询条件表达式]
SELECT *
FROM table1,table2
where table1.column_name = table2.column_name;
②.LEFT JOIN(左连接以左表为基础,根据on 后给出的条件将两表连接起来,最终的结果会将左表所有的信息列出,而右表只列出on条件与左表满足的部分,其余部分为NULL.)
SELECT *
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
③.RIGHT JOIN(右连接以右表为基础,根据on 后给出的条件将两表连接起来,最终的结果会将右表所有的信息列出,而左表只列出on条件与右表满足的部分,其余部分为NULL.)
SELECT *
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;
4.3 自连接查询
-- 5、查询同时买了“sm01”和“sm02”商品的订单信息:订单号order_id、商品编号item_id、数量quantity和折扣discount。
select A.order_id,A.item_id,A.quantity,A.discount,B.order_id,B.item_id,B.quantity,B.discount
from order_details A inner join order_details B
on A.order_id = B.order_id
where A.item_id = 'sm01' and B.item_id = 'sm02';
4.4 相关子查询和不相关子查询
写代码一般先写子查询,从内层到外层
相关子查询:
相关子查询是指内部查询依赖外部查询的结果进行计算。换句话说,内部查询中的条件是由外部查询中的结果传递给内部查询的。通常情况下,相关子查询会在外层查询的WHERE
子句或FROM
子句中使用。
例如,查找员工工资高于平均工资的员工可以使用相关子查询
SELECT employee_name
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
不相关子查询:
不相关子查询是指内部查询与外部查询没有直接关联,内部查询的结果不依赖于外部查询的结果。不相关子查询通常在SELECT
子句或FROM
子句中独立存在。也就是涉及两张表
5.外键
5.1 定义
外键(Foreign Key)是关系数据库中的一个重要概念,用于建立表与表之间的关联关系。在关系数据库中,数据通常分布在多个表中,外键定义了一个表中的列(或多列)与另一个表中的列之间的关系。
5.2 作用
外键的作用是确保数据的完整性和一致性.
5.3 语法
1.创建外键
foreign key (字段) references 表名(字段)
ALTER TABLE 表名
ADD CONSTRAINT 外键约束名
FOREIGN KEY (外键列名) REFERENCES 关联表名(关联列名);
2.删除外键
ALTER TABLE 表名
DROP FOREIGN KEY 外键约束名;
ALTER TABLE 表名
DROP CONSTRAINT 外键约束名;
5.4 外键的条件
- 1.在外键所在的表中,必须存在一个对应的主键或唯一约束,作为参照目标。
- 2.外键列的数据类型和长度必须与对应的参照列相同。
- 3.外键约束可以是单列或多列。
- 4.当参照目标表中的记录被删除或更新时,外键约束才可以指定相应的动作(如级联删除、设置为NULL等。)
5.5 举例
create database test02;
use test02;
create table class(
class_id int primary key,
name varchar(32)
);
create table student(
id int not null,
name varchar(32),
foreign key (id) references class(class_id)
);
insert into class values(001,"ggs"),(002,"gzdx");
-- 这里插入失败,原因是class_id是001和002,外键被约束只能是001和002这里面选
insert into student VALUES(003,"lhx"),(004,"zgj");
-- 插入成功
insert into student VALUES(001,"lhx"),(002,"zgj");
注意:
alter table `参加` add constraint `FK_参加_职工` foreign key (`职工号`) references `职工`(`职工号`) on delete cascade;
1452 - Cannot add or update a child row:
错误代码 1452 和其描述表明,您尝试添加一个外键约束时出现了问题,因为在子表(
参加
表)中存在至少一个职工号
的值,在父表(职工
表)中没有对应的值。这违反了外键约束,因为外键要求子表中的每个值都必须在父表中有一个对应的存在的值。
6.分页查询
6.1 语法
SELECT * FROM table
ORDER BY id -- 这里可以是任何你想要排序的字段
LIMIT start,rows;
表示从start + 1行开始取,取出rows行,start从0开始
6.2 公式
select * from table
order by column
limit 每页显示记录数 * (第几页 - 1),每页显示记录数
7.存储引擎
7.1 定义
存储引擎(Storage Engine)是负责管理表的存储和检索的组件,它们之间有不同的特性、优缺点
以及适用场景
7.2 介绍三个常见的存储引擎
1.InnoDB:
事务支持:InnoDB 支持事务,这意味着它提供了 ACID(原子性、一致性、隔离性、持久性)特性。
行级锁定:InnoDB 使用行级锁定来管理并发访问,这使得它在高并发环境中表现良好。
外键支持:InnoDB 支持外键约束,可以确保数据的完整性。
崩溃恢复:InnoDB 提供了崩溃恢复功能,可以在数据库异常关闭后进行自动恢复。
CPU 和内存消耗较高:相对于 MyISAM,InnoDB 的 CPU 和内存消耗较高,但提供了更好的数据完整性和事务支持。
默认存储引擎:MySQL 5.5.5 版本之后,InnoDB 成为 MySQL 的默认存储引擎。
2.MyISAM:
不支持事务:MyISAM 不支持事务,因此不提供事务的 ACID 特性。
表级锁定:MyISAM 使用表级锁定,这在高并发环境下可能导致性能瓶颈。
全文索引:MyISAM 提供了全文索引的支持,这使得它在某些特定场景下效率较高。
较快的读取速度:在读取密集型的应用场景下,MyISAM 可能比 InnoDB 更快。
不支持外键约束:MyISAM 不支持外键约束,因此需要在应用层面进行数据完整性的控制。
容易损坏:MyISAM 表容易因为崩溃或断电而损坏,需要手动修复。
3.MEMORY:
存储在内存中:MEMORY 存储引擎将数据存储在内存中,因此读写速度非常快。
不支持事务:与 MyISAM 类似,MEMORY 也不支持事务。
表级锁定:类似于 MyISAM,MEMORY 使用表级锁定。
临时表:MEMORY 表通常用于存储临时数据,例如临时结果集或缓存数据。
数据易丢失:由于数据存储在内存中,因此在服务器重新启动或崩溃时,数据会丢失。
7.3 总结
如果应用程序需要事务支持和数据完整性,则应选择 InnoDB。如果应用程序对读取性能更为重要且不需要事务支持,则可以考虑使用 MyISAM。
而对于临时性数据或缓存数据,MEMORY 可能是一个不错的选择
8.数据库相关函数
8.1 字符串函数
MySQL中内置了很多字符串函数,常用的几个如下:
8.2 数值函数
8.3 日期函数

8.4 流程函数
流程函数也是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率。
9.DCL
9.1 管理用户
①.查询用户
select * from mysql.user;
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;
DROP USER '用户名'@'主机名' ;
- 在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户。
- 主机名可以使用 % 通配。
- 这类SQL开发人员操作的比较少,主要是DBA( Database Administrator 数据库 管理员)使用。
9.2 权限控制
MySQL中定义了很多种权限,但是常用的就以下几种:
①.查询权限
SHOW GRANTS FOR '用户名'@'主机名' ;
②.授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
③.撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
- 多个权限之间,使用逗号分隔
- 授权时, 数据库名和表名可以使用 * 进行通配,代表所有。