MySQL入门
前言
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一
一、数据库的概述
1.1 SQL语句概述
1.SQL 是用于访问和处理数据库的标准的计算机语言。
2.SQL指结构化查询语言,全称是 Structured Query Language。
3.SQL 可以访问和处理数据库。
4.SQL 是一种 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言。
1.2 数据库系统的分类
关系型数据库 | 非关系型数据库 |
---|---|
Oracle数据库 | Redis(缓存数据库) |
MySQL数据库 | Mongodb(文档数据库) |
SQLServer 数据库 | Elasticsearch(搜索服务) |
Sqlite(嵌入式关系数据库) | .Hbase(分布式、列示数据库) |
1.3 SQL与数据库的关系
1、SQL是一种用于操作数据库的语言,SQL适用于所有关系型数据库
2、MySQL、Oracle、SQLServer、DB2 是一个数据库软件,这些数据库软件支持标准SQL,也就是通过SQL可以使用这些软件,不过每一个数据库系统会在标准SQL的基础上扩展自己的SQL语法,大部分的3.NoSQL数据库有自己的操作语言,对SQL支持的并不好
3、SQL 属于 数据库编程语言 数据库 MySQL、Oracle、SQLServer、DB2 数据库软件
1.4 MySQL简介
1.MySQL数据库管理系统由瑞典的DataKonsultAB公司研发,该公司被Sun公司收购,现在Sun公司又被Oracle公司收购,因此MySQL目前属于 Oracle 旗下产品
2.MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版(免费版本)和商业版(收费),由于其体积小、速度快、总体拥有成本低,一般中小型网站的开发都选择 MySQL 作为网站数据库
1.5 MySQL的安装
解压安装
链接: https://dev.mysql.com/downloads/mysql/
二、数据库基本操作
2.1 DDL
数据库模式定义语言DDL(Data Definition Language),是用于描述数据库中要存储的现实世界实体的语言
1.对数据库创建、删除、修改操作
2.对表结构创建、删除、修改操作
数据库操作
查询
查询所有数据库的名称:
show databases;
查询某个数据库的字符集:查询某个数据库的创建语句
show create database 数据库名称;
查询当前正在使用的数据库名称
select database();
使用数据库
use 数据库名称;
创建
创建数据库:
create database 数据库名称;
创建数据库,判断不存在,再创建:
create database if not exists 数据库名称;
创建数据库,并指定字符集
create database 数据库名称 character set 字符集名;
删除
语法: 删除数据库
drop database 数据库名称;
判断数据库存在,存在再删除
drop database if exists 数据库名称;
修改
注意:一般不对数据库进行修改操作,因为修改的安全性低,容易导致数据的缺失
基本操作:修改数据库的字符集
alter database 数据库名称 character set 字符集名称;
表操作
创建表
create table if not exists 表名(
列名1 数据类型1[长度] 【字段约束】,
列名2 数据类型2[长度] 【字段约束】,
....
列名n 数据类型n[长度] 【字段约束】
);
* 注意:最后一列,不需要加逗号(,)
use classtitle;
CREATE TABLE if not exists class_user(
id INT,
name VARCHAR(20),
age int,
create_time date,
address VARCHAR(100)
);
修改表
alter table 表名 rename to 新的表名;
ALTER TABLE class_user RENAME TO classroom_user
删除表
drop table 表名;
drop table if exists 表名;
数据类型
数值类型
类型 | 大小 | 范围 |
---|---|---|
TINYINT | 1 Bytes | (-128,127) |
SMALLINT | 2 Bytes | (-32 768,32 767) |
MEDIUMINT | 3 Bytes | (-8 388 608,8 388 607) |
INT或INTEGER | 4 Bytes | (-2 147 483 648,2 147 483 647) |
BIGINT | 8 Bytes | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) |
FLOAT | 4 Bytes | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) |
DOUBLE | 8 Bytes | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 |
日期和时间类型
类型 | 大小 | 范围 | 格式 | 用途 |
---|---|---|---|---|
year | 1 | 1901/2155 | YYYY | 年份值 |
date | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
time | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 时间值或持续时间 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
字符串类型
类型 | 大小 |
---|---|
char | 0-255 bytes |
VARCHAR | 0-65535 bytes |
TINYBLOB | 0-255 bytes |
TINYTEXT | 0-255 bytes |
BLOB | 0-65 535 bytes |
TEXT | 0-65 535 bytes |
MEDIUMBLOB | 0-16 777 215 bytes |
MEDIUMTEXT | 0-16 777 215 bytes |
LONGBLOB | 0-4 294 967 295 bytes |
LONGTEXT | 0-4 294 967 295 bytes |
2.2 DML
数据操作语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、udpate 和select 等
DDL 和 DML 的区别
DDL 对数据库 表结构 增加、修改 删除操作
DML 表结构中的数据 增加(insert)、修改(update) 删除(delete) 查询(select )
insert 插入
格式
INSERT INTO 表名称 (列名1,列名2 ...) VALUES (值1, 值2,....)
INSERT INTO 表名称 VALUES (值1, 值2,....)
INSERT INTO `people_user` (`id`, `name`, `age`, `sex`) VALUES (1, 'xiaoming', 1, '男');
INSERT INTO `people_user` VALUES (1, 'xiaoming', 1, '男');
update 修改
格式
update 表名称 set 字段=值,字段=值,...; ---直接修改整张表的所有行数据
update 表名称 set 字段=值,字段=值,... where 条件 ---- 根据条件查找到对应行数
UPDATE people_user SET `name` = 'xiaoming', `age` = 25 WHERE `id` = 1;
UPDATE people_user SET `name` = 'xiaoming', `age` = 25
delete 删除
格式
delete from 表名称 where 条件 根据条件删除表中的数据
TRUNCATE people_user --清空表中所有的数据
delete from people_user where where id=1; 根据条件id=1 删除id=1 行数据
delete from people_user ---清空表中所有的数据
TRUNCATE people_user --清空表中所有的数据
区分TRUNCATE 和 delete 不同
truncate:会清空表中所有的数据,速度快,不可回滚;实质是删除整张表包括数据再重新创建表;
delete:逐行删除数据,每步删除都是有日志记录的,可以回滚数据;实质是逐行删除表中的数据;
三、约束
3.1 作用
用于限制表中的数据,为了保证表中数据的准确性和可靠性,不符合约束的数据,插入时就会失败
3.2 分类
名称 | 作用 |
---|---|
NOT NULL | 非空,用于保证该字段的值不能为空 |
DEFAULT | 默认值,用于保证该字段有默认值 |
PRIMARY KEY | 主键,用于保证该字段的值具有唯一性并且非空 |
UNIQUE | 唯一,用于保证该字段的值具有唯一性,可以为空 |
CHECK | 检查约束(MySql不支持),检查字段的值是否为指定的值 |
FOREIGN KEY | 外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值,在从表添加外键约束,用于引用主表中某些的值 |
主键约束注意点:
1、 主键可以是表中的某一列或者多列的组合,其中由多列组合的主键称为复合主键
2、每个表只能定义一个主键,主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在两行数据有相同的主键值,这是唯一性原则
3、在创建表时设置主键约束 在 CREATE TABLE 语句中,主键是通过 PRIMARY KEY 关键字来指定的
4、当创建主键的约束时,系统会默认所在的列和列组合 建立对应的索引,方便提高查询效率
1、 如果使用表中的 一列 主键-------单列主键
2、使用表中的 多个列(id,手机号码、身份证号码)多列-多列主键(复合主键)
条件:一张表中只能够允许有一个主键、主键值 不允许是为空 主键保证 每行数据完整唯一性
不允许重复的
mysql 查询高级知识 索引— 索引 方便提高查询效率
1.添加单列主键
2.添加多列联合主键 使用主键约束 PRIMARY KEY
3.3 单列主键
语法格式:
CREATE TABLE 表的名称 (
<字段名> <数据类型> PRIMARY KEY
}
CREATE TABLE `people_users` (
`id` int PRIMARY KEY ,
`name` varchar(255) ,
`age` int
) ;
3.4 复合主键
语法格式:
CREATE TABLE 表的名称 (
....
CONSTRAINT 主键名称 PRIMARY key (主键列);
}
CREATE TABLE `people_users` (
`id` int ,
`name` varchar(255) ,
`age` int,
CONSTRAINT key1 PRIMARY key (id,phone)
) ;
联合主键
联合主键(复合主键),由多个列(字段组成)
注意事项:
1.当主键是有一个列组成时,不能够直接在字段名称后面声明主键约束;
2.一张表只能够允许一个主键
CREATE TABLE `people_users` (
`id` int,
`name` varchar(255),
`age` int ,
`phone` varchar(11) ,
CONSTRAINT key1 PRIMARY KEY (id,phone)
);
3.5 自定增长约束
设置自动增长
在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值,每增加一条记录,主键自动增加
语法格式如下:
字段名 数据类型 AUTO_INCREMENT
注意:
1、一张表中只能存在一个自动增长的字段
2、AUTO_INCREMENT 约束的字段必须具备 NOT NULL 属性
3、AUTO_INCREMENT 约束的字段只能是整数类型
4、自动增长默认的初始值为1,每增加一条记录,该字段的值会增加1
CREATE TABLE `people_users` (
`id` int PRIMARY KEY AUTO_INCREMENT ,
`name` varchar(255),
`age` int ,
`phone` varchar(11)
);
自动增长设置初始值
因为MySQL默认初始值都是为1,但是我们想让我们的初始值为其他数值,那我们就可以在创建表的时候就去设置其初始值
CREATE TABLE `people_users` (
`id` int PRIMARY KEY AUTO_INCREMENT ,
`name` varchar(255),
`age` int ,
`phone` varchar(11)
)AUTO_INCREMENT=100;
delete与truncate 删除数据区别
delete 删除数据之后,自动增长还是从最后一个删除数据的id基础上做自增;
truncate 清空数据之后 自动增长是从初始值1开始
TRUNCATE 与delete 不同?
truncate:会清空表中所有的数据,速度快,不可回滚;实质是删除整张表包括数据再重新创建表;
delete:逐行删除数据,每步删除都是有日志记录的,可以回滚数据;实质是逐行删除表中的数据;
3.6 非空约束
not null 非空约束用于确保当前列的值不为空;在创建表时,如果指定 not null 该字段在插入数据时不允许为空
语法格式
<字段名><数据类型>NOT NULL
CREATE TABLE `people_users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int NOT NULL,
PRIMARY KEY (`id`)
);
3.7 唯一约束
唯一约束(Unique Key)是指所有记录中该字段的值不能重复出现
例如:
我们其中有一个记录的身份证值为‘123456’,那么该表中就不能出现另一个身份证号为‘123456’,唯一约束值可以为null
注意:
一张表中只允许出现一个主键约束,但是可以有多个唯一约束
语法规则:
UNIQUE KEY 约束名称 (约束字段)
CREATE TABLE `people_users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255),
`age` int DEFAULT NULL,
`phone` varchar(11) ,
PRIMARY KEY (`id`),
UNIQUE KEY `unique_phone` (`phone`) -- 指定约束名称和约束字段
);
3.8 默认约束
默认值(Default)的完整称呼是“默认值约束(Default Constraint)”,用来指定某列的默认值。在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。其中,“默认值”为该字段设置的默认值,如果是字符类型的,要用单引号括起来
语法格式
<字段名> <数据类型> DEFAULT <默认值>
CREATE TABLE `people_users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT 'xiaoming',
`age` int DEFAULT 1, --默认约束
`phone` varchar(11) ,
PRIMARY KEY (`id`)
);
四、DQL
4.1 何为DQL
DQL(Data Query Language)即数据库查询语言,用来查询所需要的信息,在查询的过程中,需要判断所查询的数据与表之间的关,我们可以使用select语句来查询数据
select * from 表的名称 where 查询的条件
DML与DDL区别?
DDL 对数据库 表结构 增加、修改 删除操作
DML 表结构中的数据 增加(insert)、修改(update) 删除(delete)
查询语法格式
SELECT [ALL|DISTINCT]
<目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名] [ ,<表名或视图名> [别名]] …
[WHERE <条件表达式>]
[GROUP BY <列名1> [HAVING <条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]
[limit <数字或者列表>]
分页、分组、排序
select *(列名称) from 表名称 where 条件
1.查询语句中可以使用一个或多个表,表之间使用逗号进行区分,并使用where语句来设定条件
2.select命令可以读取一条或多条记录
3.使用( * )星号来代替其他字段,select语句会返回表中的所有字段数据
4.使用 where 语句来包含任何条件。
5.使用 limit 属性来设定返回的记录数。
6.offset 指定 select 语句开始查询的数据偏移量。默认情况下偏移量为0
4.2 基本查询
-- 1.查询所有的学生
select * from class_student;
-- 2.查询学生的姓名和年龄
select name,age from class_student;
-- 3.别名称查询 使用关键字as
select * from class_student as student;
-- 4.列别名称
select name as 姓名,age 年龄 from class_student as student;
-- 5.去重复值
select DISTINCT class_id from class_student;
-- 6.查询结果是表达式(运算值);将所有的学生年龄+5岁
select name,age+5 as age from class_student;
4.3 运算符
4.3.1 算术运算符
算术运算符是MySQL中最常用的一类运算符。MySQL支持的算术运算符包括:加、减、乘、除、求余
运算符 | 作用 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
select 6+2;
select 6-2;
select 6*2;
select 6/2;
select 6%2;
4.3.2 比较运算符
比较运算符是查询数据时最常用的一类运算符。SELECT语句中的条件语句经常要使用比较运算符。通过这些比较运算符,可以判断表中的哪些记录是符合条件的
符号 | 描述 |
---|---|
= | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
<= | 小于等于 |
>= | 大于等于 |
between | 之间 |
not between | 不存在之间 |
in | 在集合中 |
not in | 不在集合中 |
like | 模糊匹配 |
regexp | 正则式匹配 |
is null | 为空 |
is not null | 不为空 |
4.3.3 逻辑运算符
逻辑运算符用来判断表达式的真假。如果表达式是真,结果返回1。如果表达式是假,结果返回0。逻辑运算符又称为布尔运算符
运算符号 | 作用 |
---|---|
not 或 ! | 逻辑非 |
and | 逻辑与 |
or | 逻辑或 |
xor | 逻辑异或 |
4.3.4 位运算符
参与运算符的操作数,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)6种
运算符号 | 作用 |
---|---|
& | 按位与 |
I | 按位或 |
^ | 按位异或 |
! | 取反 |
<< | 左移 |
>> | 右移 |
4.4 排序
如果我们需要对读取的数据进行排序,可以利用 order by 根据字段来进行升序或者降序排列 再返回结果
升序: 从小到大
降序:从大到小
order by 根据字段 数字、字母、汉字
语法格式
以下是 SQL SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:
SELECT field1, field2,…fieldN table_name1, table_name2…
ORDER BY field1, [field2…] [ASC [DESC]]
注意:
1.asc代表 升序排列 desc代表降序排列 默认是为升序;
升序就是从小到大、降序就是从大到小
2.order by 可以支持单个字段,多个字段 ;
3.order by 放在查询语句最后面,limit 分页除外;
一般的情况下我们使用数字排序,从小到大 或者从大到小;
如果是字母排序 则 根据字母的顺序 从A到Z排序 或者Z到A顺序
如果是汉字的拼音排序,用的比较多是在人名的排序中,按照姓氏的拼音字母,从A到Z排序
4.5 分页
在mysql中当数据量很大时,显示屏长度有限,我们可以对数据进行分页显示,例如数据总共100条,每页10条数据,可以分成10页
格式
方式1:显示前n条
select 字段1,字段2 ... from class_student limit n
方式2:分页显示
select 字段1,字段2 ... from class_student limit m,n
1.查询用户表中前5条数据
SELECT * from mayikt_student limit 5;
2.从第6条开始显示 显示5条
SELECT * from mayikt_student limit 5,5;
4.6 聚合查询
我们在之前的查询是根据条件一行一行的判断,而使用聚合查询,它是对列的值进行计算,让后返回一个单一的值
聚合函数 | 作用 |
---|---|
count | 统计指定列不为null的记录行数 |
sum() | 计算指定列的数据和 |
max() | 计算指定列的数据最大值 |
min() | 计算指定列的数据最小值 |
avg() | 计算指定列的数据平均值 |
1.查询学生表的总人数
SELECT count(*) from class_student
2.查询学生年龄大于18的 总人数
SELECT count(*) from class_student where age>18
3.查询classid=1 所有学生年龄总和
SELECT SUM(age) from class_student where class_id='1'
4.查询学生最大年龄
SELECT max(age) from class_student
5.查询学生最小年龄
SELECT max(age),min(age) from class_student
6.求学生年龄的平均值
SELECT avg(age) from class_student
4.7 分组查询
分组查询是指使用 group by 字句对查询信息进行分组
格式:
select 字段1,字段2 ... from 表名称 group by 分组字段 having 分组条件
分组的条件使用 having 不是where
1.统计class_id 分类对应学生的个数
SELECT class_id ,count(*) from mayikt_student group by class_id;
注意:
1.分组之后对统计结果进行分组条件筛选 必须使用having,不能够使用where
2.HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集
格式:
SELECT 字段1,字段2 ...
from mayikt_student GROUP BY 分组字段 having 分组条件;
统计每个班级学生人数大于1人以上的班级
SELECT class_id as 班级, count(*) as 人数 from class_student GROUP BY class_id HAVING
count(*) >1
注意事项 :
1、where 后不能跟聚合函数,因为where执行顺序大于聚合函数
2、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行
3、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组
五、多表关系
5.1外键约束
MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性
定义外键时,需要遵守以下规则:
1.主表必须已经存在于数据库中,或者是当前正在创建的表
2.必须在主表定义主键
3.主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中
4.外键中列的数据类型必须和主表主键中对应列的数据类型相同
创建主外键:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]
CREATE TABLE `class` (
`id` int NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `student` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`age` tinyint DEFAULT '0',
`address` varchar(255) DEFAULT NULL,
`class_id` int DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT class_id FOREIGN KEY (class_id) REFERENCES class(id) -- 外键约束
);
删除外键约束
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
ALTER TABLE student DROP FOREIGN KEY class_id;
验证:外键约束
1.先向主表新增数据,在向从表新增数据
2.外键列的值必须要在主表存在 或者是为空
3.主表的数据不能够随便删除,从表数据可以随便删除 或者先
删除从表所有数据没有任何关联主表的字段 在可以删除主表的对应的数据
5.2 联表查询
多表查询是指多张表联合一起查询
5.2.1 内连接
显示内连接:
SELECT * FROM A INNER JOIN B ON 条件;
隐示内连接:
SELECT * FROM A,B WHERE 条件;
查询每个班级下所有学生信息
-- 显示内连接
select * from class INNER JOIN student
on class.id = student.class_id;
-- 隐士内连接
SELECT * from class ,student where student.class_id=
class.id
5.2.2 外连接
外连接:左外连接、右外连接、全外连接(union)
左连接
左外链接(left outer join,outer可以省略)
语法:SELECT * FROM A LEFT OUTER JOIN B ON 条件;
左外连接获得的查询结果是左边的表A的全部信息和A,B两张表的交集,左边A表的全部包含A表中在B表中没有对应关系的信息
右连接
右外连接(right outer join,outer可以省略)
语法:SELECT * FROM A RIGHT OUTER JOIN B ON 条件;
右外连接获得的查询结果是右边的表B的全部信息和A,B两张表的交集,右边B表的全部包含B表中在A表中没有对应关系的信息
全外连接
select * from class left join student
on class.id=student.class_id
union
select * from class right join student
on class.id=student.class_id;
左连接 以左边为准 左变有该数据 就会返回 右变没有匹配上则直接返回为null
右连接 以右边为准 右变有该数据 就会返回 左变没有匹配上则直接返回为null
内连接左边与右边都是必须匹配才会返回
5.2.3 子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询,通俗易懂也就是SELECT 嵌套的查询,子查询中常用的操作符有 ANY(SOME)、ALL、IN 和 EXISTS
基本子查询
子查询方式:
select * from student
where age in (select max(age) from student)
子查询关键字之all
ALL关键字在子查询中用于比较子查询结果与外部查询中的值
SELECT 列名
FROM 表名
WHERE 列名 比较运算符 ALL (子查询)
SELECT column_name
FROM table_name
WHERE column_name > ALL (SELECT column_name FROM another_table)
子查询关键字之any
它表示只要子查询中的任何一个值满足条件,就会返回True
SELECT 列名
FROM 表名
WHERE 列名 比较运算符 ANY (子查询)
SELECT column_name
FROM table_name
WHERE column_name > ANY (SELECT column_name FROM another_table)
ANY关键字要求子查询返回的结果集必须是一个有序的、非空的列表。如果子查询返回的结果集为空,那么使用ANY关键字的比较将会返回False
子查询关键字之not in和in
NOT IN: NOT IN关键字用于筛选不在子查询结果集中的值
SELECT 列名
FROM 表名
WHERE 列名 NOT IN (子查询)
SELECT column_name
FROM table_name
WHERE column_name NOT IN (SELECT column_name FROM another_table)
IN: IN关键字正好相反,用于筛选在子查询结果集中的值
SELECT 列名
FROM 表名
WHERE 列名 IN (子查询)
SELECT column_name
FROM table_name
WHERE column_name IN (SELECT column_name FROM another_table)
需要注意的是,子查询中的结果集必须是一个有序的、非空的列表。如果子查询返回的结果集为空,不论是使用NOT IN还是IN关键字,都不会返回结果
子查询关键字之exists
EXISTS关键字用于检查子查询中是否存在结果。它通常与主查询的WHERE子句一起使用,以根据子查询的结果来过滤主查询的结果
SELECT 列名
FROM 表名
WHERE EXISTS (子查询)
# 假设我们有一个订单表(orders)和一个顾客表(customers),
#我们想要查询有关已下订单的顾客信息
#我们可以使用EXISTS关键字来过滤顾客表,只返回有订单的顾客
SELECT customer_id, customer_name
FROM customers
WHERE EXISTS (SELECT 1 FROM orders WHERE customers.customer_id = orders.customer_id)
请注意,EXISTS关键字本身不会返回子查询的结果集,它只返回一个布尔值(True或False)来指示子查询是否返回了结果
子查询之自关联查询
自关联查询是一种在表内进行连接的查询,其中使用了同一个表的多个实例。它允许我们在表内部根据特定的条件进行比较和检索数据
SELECT 列名
FROM 表名 AS 别名1, 表名 AS 别名2
WHERE 别名1.列名 = 别名2.列名
#假设我们有一个名为employees的表,
#其中包含员工的信息,
#包括员工ID(employee_id)和直接上级的员工ID(manager_id),
#我们可以使用下面的查询来获取员工及其直接上级的信息
SELECT e1.employee_id, e1.employee_name, e2.employee_id, e2.employee_name
FROM employees AS e1, employees AS e2
WHERE e1.manager_id = e2.employee_id;
好了,以上就是本次数据库入门的基础部分内容了,适用于所有刚入门的学习数据库的同学们哦!!如果哪里写的不好的也请同学们多多指教,我也会去改善不足,提高作品的质量!!
要是感觉本篇文章还不错的同学,可以点波关注,后续有时间将会给大家分享其他内容,一同进步!!