- 一. 数据库
- 什么是数据库?
- 数据库的分类
- 二. SQL
- 三. 数据库操作
- 创建数据库
- 使用数据库
- 删除数据库
- 查看所有数据库
- 四. MySQL 常用数据类型
- ✈️数值类型
- 字符串类型
- 日期类型
- 五. 表操作:基础增删改查(CRUD)
- 创建表、查看表结构、删除表
- 新增数据
- 查询数据(初阶)
- 全列查询
- 指定列查询
- 查询字段为表达式
- 为查询字段起别名
- 查询结果去重:DISTINCT(行去重)
- 排序:ORDER BY
- 条件查询:WHERE (含相关逻辑操作符)
- 分页查询:LIMIT
- 更新数据
- 删除数据
- 六. 表操作:查询数据(进阶)
- 聚合查询
- 聚合函数
- GROUP BY子句
- HAVING
- 联合查询
- 内连接
- 外连接(左外连接、右外连接)
- 自连接
- ☕️子查询
- 合并查询(UNION)
一. 数据库
什么是数据库?
数据库是一个用来存储和管理数据的集合,它可以以结构化的方式存储数据,并且可以被多个用户或应用程序访问和操作。
数据库的分类
常见的数据库有两种:关系型数据库和非关系型数据库。
关系型数据库(RDBMS)是指采用关系模型来存储和管理数据的系统。在关系型数据库中,数据使用二维表格的形式进行存储,其中表格中的每一行数据即为一条记录,表格可有自定义的多个列(字段),用来描述一个实体的相关特性。
关系型数据库使用结构化查询语言(SQL)来进行数据操作和查询。常用的关系型数据库有:Oracle、MySQL、SQL Server等。
非关系型数据库(NoSQL)是指不局限于传统的关系型数据库模型的各种数据库系统,它不规定基于SQL实现。非关系型数据库中基于键值对实现(Key-Value):如memcached、redis等;基于文档型:如mongodb;基于图型:如 neo4j。
二. SQL
什么是SQL?
SQL是一种用于管理关系型数据库系统的标准化查询语言。SQL可被用于数据库的创建、访问、操作和管理。
SQL的基本命令包括:(注:sql语句中的关键字不区别大小写,该文章均使用小写)
- DDL(Data Definition Language):用于定义数据库对象的命令。如create(创建数据库,表,视图等)、alter(修改表结构)、drop(删除数据库,表等)。
- DML(Data Manipulation Language):用于操作数据库中数据的命令。如:insert(插入数据)、update(更新数据)、delete(删除数据)。
- DQL(Data Query Language):用于查询数据库中数据的命令。如:select(查询符合指定条件的数据)。
- DCL(Data Control Language):用于控制数据库用户访问权限和数据库完整性的命令。如:grant(授权)、revoke(撤销权限)。
在本文中,将对DML和DQL着重进行叙述。
在一个关系型数据库服务器中,数据一般由多个二维表格来组织,而表又存在于数据库中。其中每个表可以独立存在,也可以通过一定的约束建立联系。
因此在创建表前我们需要创建存放表的数据库。
三. 数据库操作
创建数据库
语法:
create database (if not exists) 数据库名 (charset = 字符集名称) ;
注意:
- 每条sql语句都由 ; 结束。
- ()内容为可选项,可根据实际需求进行添加。
- charset = 字符集名称:可以指定数据库采用的字符集,在MySQL 5.7中默认字符集为latin1,若要在数据记录中添加中文属性,应指定支持中文字符集,如UTF8、GBK等。
使用数据库
创建好的数据库后需要选中才能进行接下来的数据操作。
语法:
use 数据库名;
删除数据库
语法:
drop database 数据库名;
注意:删除数据库是一项很“刑”的操作,平时也应该谨慎进行,切勿做那个“从删库到跑路”的人。
查看所有数据库
语法:
show databases;
四. MySQL 常用数据类型
✈️数值类型
字符串类型
日期类型
五. 表操作:基础增删改查(CRUD)
创建表、查看表结构、删除表
语法:
创建表:
create table 表名 (
列名1 数据类型,
列名2 数据类型,
…
);
查看表结构:
desc 表名;
删除表:
drop table 表名;
例子如下:
创建表
查看表结构
新增数据
语法:
形式一:指定列插入
insert into 表名 (指定列1,指定列2, …) values
(指定列1的数值, 指定列2的数值, …),
(记录二),
(记录三) ,… ;
形式二:全列插入
insert into 表名 values (所有列对应数值), (记录二), (记录三),… ;
注意:
- 插入数据可一次插入多条记录,每条记录用括号括起来,记录之间用逗号作为分隔。
- 若指定列插入,记录中值的类型也需与之对应;若没有指定列插入,则默认为全列插入。
例子如下:
(多行指定列插入)
(单行全列插入)
查询数据(初阶)
全列查询
语法:
select * from 表名;
例子如下:
指定列查询
语法:
select 列名1, 列名2, … from 表名;
例子如下:
查询字段为表达式
语法:
select 多个列组成的表达式 [如:列1 + 列2] from 表名;
注意:
[ ]表示举例,可根据实际需要填写。
若存在以下 score 表结构和表数据:
则查询字段为表达式的例子如下:
为查询字段起别名
语法:
select 查询字段 as 别名 from 表名;
注意:
- 一条查询语句中可以为多个字段起别名
- as可以省略,但会降低 sql语句的可读性,一般建议添加
例子如下:
查询结果去重:DISTINCT(行去重)
语法:
select distinct 字段名 from 表名;
注意:
若要使用 DISTINCT 关键字进行去重,则查询的列只能有一个。
若存在以下 score 表:
使用 distinct 进行去重操作后:
排序:ORDER BY
语法:
select 列名1, 列名2, … from 表名 order by 列名 desc (asc);
注意:
- order by 列名 后面加 desc 表示排序结果按指定列降序,加 asc 表示排序结果按指定列升序;若没有指定排序规则,若默认排序结果为升序。
- 查询结果集可以指定按多个字段排序,查询的结果集优先遵循第一个字段的排序规则,若两个记录第一个字段的大小相等,则以第二个字段的排序规则继续排序…
若存在以下 score 表:
指定一个字段进行降序排序:
指定多个字段进行排序:
条件查询:WHERE (含相关逻辑操作符)
语法:
select 字段1, 字段2, … from 表名 where 查询条件;
比较运算符:
逻辑运算符:
注意:
- WHERE条件可以使用表达式,但不能使用别名。
- AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分。
- 在使用 where 进行条件查询时,应尽量使用小括号()保证逻辑的正确。
若存在以下 exam_result 表:
比较运算符:>, >=, <, <=, =, , != , (比较字段的大小关系)
示例如下:
比较运算符:BETWEEN a0 AND a1(寻找字段大小介于 a0 ~ a1 的记录,包含边界值)
示例如下:
比较运算符:IN(寻找所有包含在列举值的字段的记录)
示例如下:
比较运算符:IS NULL, IS NOT NULL
示例如下:
比较运算符:LIKE
LIKE的常见用法:
查询字段前 n 个字符为指定字符的字段:如 name like ‘孙%’
查询包含指定字符的字段:如 name like ‘%三%’
查询字段后 n 个字符为指定字符的字段:name like ‘%空’
查询包含特定字符数的字段,且字段查询规则为自定义:name like ‘孙_’
示例如下:
逻辑运算符:AND
示例如下:
逻辑运算符:OR
示例如下:
逻辑运算符:NOT
示例如下:
分页查询:LIMIT
语法:
形式一:
select 字段 from 表名 limit 数字(代表此次查询记录的条数)
形式二:
select 字段 from 表名 limit num1 offset num2;(表示从表的第一条记录偏移量为 num2 的记录开始,查询 num1 条记录)
形式三:
select 字段 from 表名 limit num1, num2; (表示从表的第一条记录偏移量为 num1 的记录开始, 查询 num2 条记录)
若存在以下 student 表:
形式一:(从表头数据开始查询出指定数量的记录)
形式二:(从偏移位置开始查询指定数量的记录)
形式三:
更新数据
语法:
UPDATE 表名 SET 列名1 = 即将更新的值 [, 列名2 = 即将更新的值] [, …] [WHERE 判断条件] [ORDER BY …] [LIMIT …];
注意:
[ ] 表示可根据需要进行添加。
若存在以下 exam_result 表
示例一:将所有英语成绩不及格的同学分数加上10分
示例二:将总分排名倒数前三的同学的语文成绩加上10分
删除数据
语法:
DELETE FROM 表名 [WHERE 判断条件] [ORDER BY …] [LIMIT …];
注意:
[ ] 表示可根据需要进行添加。
若存在以下 student 表:
删除示例如下:
六. 表操作:查询数据(进阶)
聚合查询
聚合函数
聚合函数可以实现常见的统计总数、计算平局值等操作。常见的聚合函数有:
若存在以下 exam_result 表
示例如下:
COUNT(不包含NULL)
SUM(NULL不参与运算)
AVG(NULL不参与运算)
MAX
MIN
GROUP BY子句
在 select语句中使用 GROUP BY 子句可以对指定字段进行分组查询。
在一张表中使用 GROUP BY 进行分组查询时需满足:select 指定的查询字段必须是通过GROUP BY子句指定的“分组依据字段”,其他字段若想出现在查询结果中,则必须以聚合函数的形式包含在 select 语句中。
语法:
SELECT 字段1 [, 聚合函数] … FROM 表名 GROUP BY 字段1, 字段2…
注意:聚合函数通常需要配合GROUP BY 子句使用。
例如:有一张职员表 emp ,该表包含这些字段:id、姓名(name)、职位(role)、薪水(salary)。
若想知道职员表 emp 中有何种职位,可以使用 GROUP BY 对职位 role 进行分组。示例如下:
若想知道职员表 emp 各个不同职位的平均工资情况,使用使用 GROUP BY 按职位 role 进行分组,并在 SELECT 中使用 聚合函数 AVG 得到职位的平均工资。示例如下:
HAVING
使用 GROUP BY 子句对数据进行分组后,若需要过滤部分分组后的记录,则可以使用 HAVING 对记录进行过滤,而不能使用 WHERE。
语法:
SELECT 查询字段 FROM 表名 GROUP BY 分组字段 HAVING 逻辑条件;
注意:
- HAVING 的作用是对分组后的数据进行过滤,因此 HAVING 必须搭配GROUP BY 进行使用,不能单独使用。
- HAVING 应写在 GROUP BY 后面。
- 若某 SELECT 语句中同时出现 WHERE 和 HAVING,并且对查询结果进行排序,则查询语句执行是:WHERE -> GROUP BY -> HAVING -> ORDER BY。(!!!)
若存在以下 emp 表:
示例一:查询职员表 emp 各个不同职位的平均工资情况,但过滤职位为 “董事长”的记录。
示例二:查询职员表 emp 各个不同职位的平均工资情况,使用 HAVING 过滤职位为 “董事长”的记录,并且将结果集按平均工资 AVG(salary) 进行升序排序。
示例三:查询职员表 emp 各个不同职位的平均工资情况,使用 WHERE 先排除 “小红”的记录,再使用 HAVING 过滤职位为 “董事长”的记录,并且将结果集按平均工资 AVG(salary) 进行升序排序。
联合查询
在实际的业务场景中,要查询的数据往往来自于不同的表中,因此要查询所需记录需要进行多表联合查询。多表联合查询是指:对多张表的数据取笛卡尔积。
语法:
形式一:
SELECT 查询字段 FROM 表1 JOIN 表2;
形式二:
SELECT 查询字段 FROM 表1, 表2;
注意:将多张表进行笛卡尔积后,新表的行数为各表行数的乘积,列数为各表列数之和。
示例如下:
注意:关联查询可以对关联表使用别名。
先创建以下表及初始化数据:
create table classes(id int, name varchar(30), `desc` varchar(50) );create table student (id int , name varchar(15), qq_mail varchar(30), classes_id int);create table course (id int, name varchar(20) );create table score (score decimal, student_id int, course_id int);insert into classes (id, name, `desc`) values(1, '计算机系2019级1班', '学习了计算机原理、C和Java语言、数据结构和算法'),(2, '中文系2019级3班','学习了中国传统文学'),(3, '自动化2019级5班','学习了机械自动化');insert into student ( id, name, qq_mail, classes_id) values(1, '黑旋风李逵','xuanfeng@qq.com', 1),(2, '菩提老祖',null,1),(3, '白素贞',null,1),(4, '许仙','xuxian@qq.com',1),(5, '不想毕业',null,1),(6, '好好说话','say@qq.com',2),(7, 'tellme',null,2),(8, '老外学中文','foreigner@qq.com',2);insert into course (id, name) values(1, 'Java'),(2, '中国传统文化'),(3, '计算机原理'),(4, '语文'),(5, '高阶数学'),(6, '英文');insert into score(score, student_id, course_id) values-- 黑旋风李逵(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),-- 菩提老祖(60, 2, 1),(59.5, 2, 5),-- 白素贞(33, 3, 1),(68, 3, 3),(99, 3, 5),-- 许仙(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),-- 不想毕业(81, 5, 1),(37, 5, 5),-- 好好说话(56, 6, 2),(43, 6, 4),(79, 6, 6),-- tellme(80, 7, 2),(92, 7, 6);
上述表的数据如下:
内连接
语法:
形式一:
SELECT 查询字段 FROM 表1 别名 [inner] JOIN 表2 别名 ON 连接条件 [AND 其他条件]
形式二:
SELECT 查询字段 FROM 表1 别名, 表2 别名 WHERE 连接条件 [AND 其他条件]
注意:
- [ ] 里的内容可以省略,inner一般可不写,AND其他条件看需求添加。
- 可在表名后为表起别名,上述起别名的写法省略了 AS关键字。
内连接说明:
由多表联合查询可知笛卡尔积的结果是将所有可能的结果进行排列组合,其中会产生大量“不合理”的记录。因此内连接就是需要剔除“不合理”记录,并在“合理”记录中查询特定的记录。(如下图)
实例一:查询“黑旋风李逵”同学的所有成绩
示例二:查询所有同学的总成绩,及同学的个人信息
外连接(左外连接、右外连接)
外连接分为左外连接和右外连接。
左外连接通俗来讲当两个表进行笛卡尔积时,左表的所有记录一定会出现在结果集,若右表中没有与之匹配的记录,则右表的字段返回NULL。
右外连接通俗来讲当两个表进行笛卡尔积时,右表的所有记录一定会出现在结果集,若左表中没有与之匹配的记录,则左表的字段返回NULL。
语法:
左外连接:
SELECT 查询字段 FROM 表1 LEFT JOIN 表2 ON 连接条件 AND 其他条件
右外连接:
SELECT 查询字段 FROM 表1 RIGHT JOIN 表2 ON 连接条件 AND 其他条件
左外连接示例如下:
自连接
自连接是指在同一张表连接自身进行查询。
语法:
SELECT 查询字段 FROM 表 别名1 JOIN 表 别名2 ON 连接条件 AND 其他条件
注意:某张表进行自连接时,必须为表起别名,否则无法进行联合查询。
自连接应用场景:
当某张表的字段如 score 表时,某个学生多门课程的成绩分布于表的多行记录,由于 WHERE 只能进行列与列之间的比较,因此想找出一名学生某门课程成绩比另一门课程高的所有学生情况,并且只用到一次查询就需要用到自连接操作。
示例:显示所有“计算机原理”成绩比“Java”成绩高的学生信息
☕️子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
语法:
单行子查询:
SELECT 查询字段 FROM 表名 WHERE 字段 = (返回一行记录的子查询查询语句)
多行子查询:
SELECT 查询字段 FROM 表名 WHERE 字段 IN (返回多行记录的查询语句)
单行子查询:查询与白素贞在一个班的所有同学信息
多行子查询:查询“语文”或“英文”课程的成绩信息
合并查询(UNION)
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
注意:
UNION 内部的每个 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同;并且使用UNION会自动去除结果集中的重复记录。
语法:
SELECT 查询字段 FROM 表名
UNION
SELECT 查询字段 FROM 表名;
UNION ALL 操作符也用于合并两个或多个 SELECT 语句的结果集。
它的使用规则与UNION相同,但使用UNION ALL会使结果集中包含重复记录。
语法:
SELECT 查询字段 FROM 表名
UNION ALL
SELECT 查询字段 FROM 表名;
UNION 示例:
UNION ALL 示例:
以上就是本篇文章的全部内容了,如果这篇文章对你有些许帮助,你的点赞、收藏和评论就是对我最大的支持。
另外,文章的不足之处,也希望你可以给我一点小小的建议,我会努力检查并改进。