MySQL新手快速入门

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 表名;

数据类型

数值类型

类型大小范围
TINYINT1 Bytes(-128,127)
SMALLINT2 Bytes(-32 768,32 767)
MEDIUMINT3 Bytes(-8 388 608,8 388 607)
INT或INTEGER4 Bytes(-2 147 483 648,2 147 483 647)
BIGINT8 Bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)
FLOAT4 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)
DOUBLE8 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的值

日期和时间类型

类型大小范围格式用途
year11901/2155YYYY年份值
date31000-01-01/9999-12-31YYYY-MM-DD日期值
time3‘-838:59:59’/‘838:59:59’HH:MM:SS时间值或持续时间
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值
TIMESTAMP41970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳

字符串类型

类型大小
char0-255 bytes
VARCHAR0-65535 bytes
TINYBLOB0-255 bytes
TINYTEXT0-255 bytes
BLOB0-65 535 bytes
TEXT0-65 535 bytes
MEDIUMBLOB0-16 777 215 bytes
MEDIUMTEXT0-16 777 215 bytes
LONGBLOB0-4 294 967 295 bytes
LONGTEXT0-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条开始显示 显示5SELECT * 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 joinouter可以省略)
语法:SELECT * FROM A LEFT OUTER JOIN B ON 条件;

左外连接获得的查询结果是左边的表A的全部信息和A,B两张表的交集,左边A表的全部包含A表中在B表中没有对应关系的信息

右连接

右外连接(right outer joinouter可以省略)
语法: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;

好了,以上就是本次数据库入门的基础部分内容了,适用于所有刚入门的学习数据库的同学们哦!!如果哪里写的不好的也请同学们多多指教,我也会去改善不足,提高作品的质量!!
要是感觉本篇文章还不错的同学,可以点波关注,后续有时间将会给大家分享其他内容,一同进步!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值