MySql学习笔记

Mysql

Mysql语句

库管理:创建库

方式一:创建数据库,使用默认的字符集和排序方法
CREAT DATABASE 数据库名;

方式二:判断并创建默认字符集库(推荐)
CREATE DATABASE IF NOT EXISTS 数据库名;

方式三:创建指定字符集或者排序方式
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
CREATE DATABASE 数据库名 COLLATE 排序规则;

方式四:创建指定字符集和排序规则库
CREATE DATABASE 数据库名 CHARACTER SET 字符集 COLLATE 排序规则

库管理:查看和使用库

方式一:展示当前所有库
SHOW DATABASES;

方式二:查看当前使用库
SELECT DATABASE();

方式三:展示指定库下所有表
SHOW TABLES FROM 数据库名;

方式四:展示创建库的信息
SHOW CREATE DATABASE 数据库名;

方式五:切换库/选中库
USE 数据库名;

方式六:查看当前库的字符集和排序规则
show variables like 'character_set_database';查看字符集
show variables like 'collation_database';查看排序规则

库管理:修改库

修改库编码字符集
ALTER DATABASE 数据库名 CHARACTER SET 字符集;//修改字符集

ALTER DATABASE 数据库名 COLLATE 排序方式;//修改排序方式

ALTER DATABASE 数据库名 CHARACTER SET 字符集 COLLATE 排序方式;//修改字符集和排序方式

库管理:删除库(提桶跑路)

方式一:直接删除库
DROP DATABASE 数据库名;

方式二:判断并删除库(推荐)
DROP DATABASE IF EXISTS 数据库名;

表的创建

create table [if not exists] 表名(
列名 类型 [列可选约束] ,
列名 类型 [列可选约束] [comment'列可选注释']
[列可选约束]

)[表可选约束][comment'表可选注释'];

  1. 必写项:表名、列名、列类型,其他选写
  2. 推荐使用if not exists 判断创建是否存在
  3. 注释不是必须但是是很有必要的
  4. 如果写了多个列,列之间用“,”分割

表的数据类型

整数类型

类型 存储(字节) 最小值(有符号) 最小值(无符号) 最大值(有符号) 最大值(无符号)
tinyint 1 -128 0 127 255
smallint 2 -3768 0 32767 65535
mediumint 3 -8388608 0 838867 16777215
int 4 -2147483648 0 2147483647 4294967295
bigint 8 -2^63 0 2^63-1 2^64-1

浮点数类型

类型 字节 M(小数+整数位数) D(小数位数)
float 4 M最大为24 D最大为8
double 8 M最大为53 D最大为30

定点数

类型 字节 M(小数+整数位数) D(小数位数)
decimal 动态计算 M最大为65 D最大为30

字符串

字符串 特点 长度 长度范围 存储空间
char(M) 固定长度 M 0<=M<=255 M*4个字节(utf8mb4)
varchar(M) 可变长度 M Mysql一行最多65535字节 M*4+1个字节(utf8mb4)

时间

类型 名称 字节 日期格式 最小值 最大值
year 1 YYYY/YY 1901 2155
time 时间 3 HH:MM:SS -838:59:59 838:59:59
date 日期 3 YYYY-MM-DD 1000:01:01 9999:12:03
datetime 日期时间 8 YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59
timestamp 日期时间 4 YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:00 2038-01-19 03:14:07

插入默认添加时间 datetime | timestamp default current_timestamp
修改默认修改时间(插入的默认时间) datetime | timestamp default current_timestamp on undate current_timestamp

有符号即有负号,默认为有负号,无符号时需要加unsigned

修改表

修改表中列(字段)

  1. 添加一列,可指定x字段前或后
    alter table 表名 add 字段名 字段类型 [first|after 字段名];
  2. 修改列名
    alter table 表名 change 原字段名 字段名 新字段类型 [first|after 字段名];
  3. 修改列类型
    alter table 表名 modify 字段名 新字段类型 [first|after 字段名];
  4. 删除一列
    alter table 表名 drop 字段名;

修改表名
alter table 表名 rename [to] 新表名;

删除表

  1. 删除数据表
    drop table if exists 数据表1[数据表2、数据表3。。。。];
  2. 清空表中数据
    truncate table 表名;

数据操作DML

插入表中数据

为表中所有字段(列)插入数据:insert into 表名 values(value1,value2,.....)

为表中每个字段插入数据,值的顺序和和数据库中定义的顺序需一一对应

为表中特定一行字段插入数据:insert into 表名(列名1,列名2.....)values(value1,value2.....)

同时插入多行数据
insert into 表名 values(value1,value2,....),(value1,value2,value3....)
insert into 表名(列名1,列名2.....)values(value1,value2.....),(value1,value2.....)
values也可以写成value,但是values更规范
字符和日期型数据应写在单引号内

修改表中数据

  1. 修改表中所有数据(全表修改)
    update 表名
    set column1=value1,column2=value2....
    更新表中所有行的指定列数据

  2. 修改表中符合条件行的数据(条件修改)
    update 表名
    set column1=value1,column2=value2....
    [where condition]

删除表中所有数据

  1. 删除表中所有数据(全表删除)
    delete from 表名

  2. 删除表中符合条件的数据(条件删除)
    delete from 表名[where condition]

数据查询DQL

基础select语法

  1. 非表查询
    select n;
    输出n;n可以是数、计算式、函数;

  2. 指定表
    select 列名1,列名2,列名3 from 表名;
    获取到表中的某些列
    select 表名.列名(多表查询时使用,与上述作用相同) 表名.*(该表中的所有列)from 表名;

  3. 查询列,起别名
    select 列名 as 别名,列名,列名 as 别名 from 表名;
    其中as可以省略

  4. 对查询结果去重
    select distinct 列名 [列名,列名]from 表名;

  5. 给查询结果加一个常数
    select 列名 '常数' 列名(三者位置不固定) from 表名;

如果有使用*等通配符需要放在第一位
ifnull(列名,若列为空给予的值)

显示表结构

describe 表名;或 desc 表名;

过滤数据

select 字段一、字段2 from 表 where 后接过滤条件

运算符号

逻辑运算符

逻辑且 :&& AND
否定:! NO
逻辑或:OR ||
逻辑异或:XOR
Mysql将所有非零非NULL的值计算为TRUE

查找函数
find_in_set(a,b);查找b中的内容,若包含a则返回找到的第一个的下角标,反之返回0;

单行和多行函数


单行函数:对一行中某一列操作函数,其返回值是单一值
单行函数包括:数字、日期、字符、流程、信息、时间函数
多行函数:对多行中某列操作函数,其返回值是单一值
多行函数包括:聚合函数


数字
image
时间
image
image
image

流程控制函数
case
格式一

case
	when condition1 then result1
	when condition2 then result2
	.
	.
	.
	else default result
end [as 别名] //将结果单拿出来作为一列

格式二

case expr(列名或表达式)
	when value1 then result1
	when value2 then result2
	.
	.
	.
	else default result
end [as 别名] //

多行函数/聚合函数

函数 用法
AVG(列名) 计算某一列的平均值(数值型)
SUM(列名) 计算某一列的和(数值型)
MIN 计算某一列的最小值(任意类型)
MAX 计算某一列的最大值(任意类型)
COUNT(列名/*/1) 计算某一列或行的记录数(任意类型)

分组查询

image

排序查询

image

数据切割(分页查询)

image


image


约束

概念:表级别的规定,数据的限制语法
作用:确保数据的准确性、可靠性、正确性
添加时机:1.创建表时直接添加 2.创建表之后通过alter table 语句添加

约束分类

三个重点:作用、添加、删除

域(列)级约束(此类约束只对当前列值有效果)
  • 非空约束:NOT NULL ,列非空约束
  • 默认值约束:default ,某列默认值
  • 检查约束:check ,检查约束
实体(行)级约束(此类约束需要对比同一表中其他行数据才有效果)
  • 主键约束:primary key ,主键唯一且不为空约束
  • 唯一约束:unique,限制某一列值表中唯一
  • 自增长约束:auto_increment,数字类型字段插入数据自增长约束
引用(多表)级约束(此类约束,需要对比其他表的列才有效果)
  • 参照(外键约束):foreign key,限定表中某一列,正确引用其他表的数据值

域级约束

非空约束

作用:限定某个字段/列的值不允许为空
关键字:NOT NULL
特点

默认:所有类型列默认都可以为NULL,包括数字类型
列上添加:非空约束只能添加到列上!
多次使用:一个表中可以有很多列进行非空限定!
空值判定:空字符不是null,0也不是null!

添加:
建表时添加

	create table 表名称(
	字段名 数据类型,
	字段名 数据类型 NOT NULL,
	字段名 数据类型 NOT NULL,
)

建表后修改

alter table 表名称 modify 字段名 数据类型 not null;

删除

alter table 表名称 modify 字段名 数据类型 NULL;
OR
alter table 表名称 modify 字段名 数据类型;
#不加默认允许为NULL
默认值约束

作用:限定某个字段/列的添加默认值
关键字:default
特点

位置约定:默认值约束不能添加到唯一(不能重复)或者主键(不能重复)上,其他列都可以
生效时机:当插入数据时,没有显示赋值,赋予默认值!
细节特点:添加约束时,default默认值,默认值对应正确数据类型!

添加:

建表时添加

create table 表名称(
	字段名 数据类型 default 默认值,
	字段名 数据类型 not null default 默认值);

建表后修改

alter table 表名称 modify 字段名 数据类型 default 默认值;
#如果这个字段原来有非空约束,需要保留非空约束,那么在加默认值约束时,还得保留非空约束,否则非空约束就被删除了
alter table 表名称 modify 字段名 数据类型 default 默认值 not null;

删除:

alter table 表名称 modify 字段名 数据类型;
#删除默认值约束,也不保留非空约束
alter table 表名称 modify 字段名 数据类型 not null
#删除默认值约束,保留非空约束
检查约束

作用:检查某个字段的值是否符合XX要求,一般指的是值得范围
关键字:check(限制表达式)
特点:

新特性:5.7版本不支持check约束,8+版本才支持check约束
万能约束:check(表达式), 可以自定义表达式,变成任何约束!
不推荐:不推荐使用check约束,进行数据检查,建议程序级限制!

添加:
建表时添加

create table 表名称(
	字段名 数据类型
	check(表达式),#check约束属于表级别,不用添加到列后
	字段名 数据类型 not null default 默认值);

建表后修改

alter table 表名 add constraint 约束名 check (表达式);
#约束名不能重复

删除:

alter table 表名 drop constraint 约束名;

拓展:查看约束

select * 
from information_schema.table_constraints
where table_schema = '库名
and table_name = 'emp3';

实体(行)级约束

唯一约束

作用:限定某个字段或者组合字段,在表中的数据是唯一
关键字:unique
特点:

约束数量:同一个表可以有多个唯一约束
空值处理:唯一性约束允许列值为空
约束名称:在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同

添加:
建表时添加

create table 表名称(
	字段名 数据类型 unique,
	字段名 数据类型 unique key);
create table 表名称(
	字段名 数据类型,
	[constraint约束名]unique key(字段名));

建表后修改

alter table table_name
add constraint constraint_name(约束名) unique(列名,列名);

删除

alter table 表名
drop constraint 约束名;
主键

概念:区分一行不重复的列,主键列永不为空
关键字:
特点:

主键数量:每个表只能有一个主键
单一和复合:主键可以有单列和多列组成(复合主键)
主键列类型:可以是任意类型,只要唯一且不重复、不为null就行
主键命名:一般采用identify(标识单词)缩写xxid或xx_id等,但没有明确要求
主键索引:创建主键时,系统会默认在所在的列或列组合上建立对应的主键索引(能够根据主键自主查询的,就根据主键自主查询,效率更高)。如果删除主键约束了,主键约束对应的索引就会自动删除,主键索引固定命令:primary
主键约束

概念:针对主键列的数据约束和限制,确保主键列不会出现错误数据(保证唯一且不为空)
建表时添加:

create table 表名称(
	字段名 数据类型 primary key,#列级模式
);
create table 表名称(
	字段名 数据类型,
	[constraint 约束名] primary key (字段名)#表级模式
);

建表后修改
alter table 表名称 add primary key(字段列表);#字段列表可以是一个字段,也可以是多个字段
删除
删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在,唯一消失

删除主键约束和索引
alter table 表名称 drop primary key;
自增长约束

作用
限定某个整数类型字段,插入数据不显示维护,值自动增长
关键字
auto_increment
特点

添加位置:只能添加到键列(主键,唯一),普通列不可以
约束数量:每一张表只能有一个自增长约束
数据类型:增加自增长的列必须是整数类型
特殊情况:如果给自增长字段设置0或者null,列数据会自增长赋值,如果是非零和非空数据,那么将设置真实值

建表时添加

create table 表名称(
	字段名 数据类型 primary key auto_increment
);
create table 表名称(
	字段名 数据类型 unique key auto_increment
)

建表后修改

alter table 表名称 modify 字段名 数据类型 auto_increment

删除

alter table 表名称 modify 字段名 数据类型
外键

定义:引用或参照其他主键列值的列,我们称为外键,外键的值的范围应当对应主键的值的范围
特点

外键数量:每个表中可以包含多个外键
外键跨表:外键时跨表引用其他表的主键,被引用为主表,外键表为子表
外键类型:外键类型不能时任意类型,应该和主键类型对应,尽量命名相同
主外键关系:关系型数据库,关系指的就是主外键关系,有主外键的两张表能水平联查
其他影响:存在主外键关系(外键约束),删除主表数据时,可能会因为子表引用而删除失败。可以先删除子表的所有引用数据再删除
外键约束

作用:外键应该引用主键的值,但是如果不添加约束,可能会出现错误数据

建表时添加

create table 主表名称(
	字段1 数据类型 primary key
);#子表中添加主外键约束
create table 子表名称(
	字段1 数据类型 primary key;
	[CONSTRAINT <外键约束名称>] FOREIGN KEY(外键)
	references 主表名(主键)[on update xx][on delete xx]
);

建表后修改

alter table 子表名 add [constraint 约束名] foreign
key(子表的字段) references 主表名(被引用字段)[on uodate xx][on delete xx];

删除

第一步,先查看约束名和删除外键约束
select * from information_scherma.table_constraints where table_name = '表名称';#查看某个表的约束名
alter table 子表明 drop foreign 外键约束名;

第二步,查看索引名和删除索引
show index from 表名称;#查看某个表的索引名
alter table 子表名 drop index 索引名;
级联(约束等级设计)
Cascade 在父表上undate/delete记录时,同步update/delete子表的匹配记录
Set null 在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null
No action 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
Restrict 同no action,都是立即检查外键约束
Set default 父表有变更时,子表将外键列设置成一个默认的值,但lnnodb不能识别

样例

alter table 子表名 add constraint 外键约束名
foreign key (子表外键列) references 主表名 (主表主键列)
on delete cascade
on update cascade

约束总结(面试题)

  1. 建不建立外键约束有什么区别?
建外键约束,你操作(创建表、添加、修改、删除)会受到限制。从语法层面收到限制。例如:在员工表中不可能添加一个员工信息,它的部门的值在部门表中找不到。
不建外键约束,你的操作(创建表、删除表、添加、修改、删除)不受限制,要保证数据的引用完整性,只能依靠程序员的自觉,或者是在java程序中进行限定。例如:在员工表中,可以添加一个员工的信息,它的部门指定为一个不完全不存在的部门。
  1. 建不建立外键约束对查询有什么影响?
没有
添加约束可能影响查询速度和效率
  1. 表中字段为什么不想要null的值
1)不好比较。null是中特殊值,比较时只能用专门的is null 和 is not null来比较。碰到运算符,通常返回null
2)效率不高。影响提高索引效果。因此,我们往往在建表时 not null default "" 或default 0
  1. 带AUTO_INCREMENT约束的字段是从1开始的吗?
在MySQL中,默认AUTO_INCREMENT的初始值是1,每新增一条记录,字段值自动加1。设置自增属性(AUTO_INCREMENT)的时候,还可以指定一条插入记录的自增字段的值,这样新插入的记录的自增字段从初始值开始递增,如在表中插入第一条记录,同时指定id值为5,则以后插入的记录的id值就会从6开始往上增加。添加主键时,往往需要设置字段自动增加属性。
除此之外,可以在创建表的时候,指定自增长起始值。
  1. 是不是每个表都可以任意选择存储引擎?
外键约束(FOREIGN KEY)不能跨引擎使用
MySQL支持多种存储引擎,每一个表都可以指定一个不同的存储引擎,需要注意的是:外键约束是用来保证数据的参照完整性的,如果表之间需要关联外键,却指定了不同的存储引擎,那么这些表之间是不能创建外键约束的。所以说,存储引擎的选择也不完全是随意的。
  1. 请问你会不会创建数据库时给你的表添加完备的约束呢?
不会,一般情况下,我们只会添加一些单表的约束(实体约束和域约束)
不会添加外键和级联操作!
根据阿里开发规范,【强制】不得使用外键与级联,一切外键概念必须在应用层解决
(概念解释)学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的student_id,同时触发成绩表中的student_id更新,外键与级联更新适用与单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度

数据库多表关系

为什么要拆表存储数据

  1. 提高查询效率
分表存储不同数据类型可以根据数据特征和查询模式进行优化
  1. 防止数据冗余
将不同数据类型存储在不同的表中可以避免数据冗余
  1. 更方便进行数据存储
分表存储不同数据类型可以简化数据管理和维护工作

多(两)表(数据)关系

  1. 一对一
两个表之间的每行数据都是唯一的对应关系
例如,一个员工与唯一的员工档案

2.一对多

一个表关联另一个表多行数据反方向只关联一行数据!
例如,一个作者与多个文章的关系。
  1. 多对多
两个表中的记录都可以与对方表中的多个记录相关联
例如,学生和课程之间的关系,一个学生可以选秀多门课程,而一门课程也可以由多个学生选修。

总结

1. 分表存储数据:关系型数据库,数据就是安装类别存储到对应的表结构中,每个表中的数据类型单一
2. 表和表的关系:两表之间的数据可以通过主外键进行引用,且创建数据行之间的关系,表关系就是数据行的关系
3. 具体关系分类:两表(数据)之间的关系具体分为三种:一对一、一对多、多对多
4. 多表结构约束:我们需要根据分析的实体之间关系,为之创建对应的表结构和添加合适的表约束限制
5. 查询语法扩展:因为数据分表存储,我们不仅要掌握单表查询,还需要根据多表关系,进行多表数据之间的关联查询(重点)

数据库多表关系维护

一对一表关系

一对一特点:双方的数据行都对应对方至多一条数据

一对一解决冗余:一对一并不能解决数据冗余的问题
一对一存在意义:一张表中有冷热数据,将表拆分成两张表存储,一张存热,一张存冷数据
一对一关系维护:子表外键对应的数据不能重复(外键唯一)
			方案一:子表的外键和主键融合,两张表公用同一个主键
			方案二:子表的外键添加唯一约束
一对多表关系

一对多特点:主表对应多条子表数据,子表对应主表至多一条数据

一对多解决冗余:一对多可以解决数据冗余问题
一对多存在意义:一个实体对应多个子元素,通过分表,解决数据冗余问题和提高数据操作效率!
一对多关系维护:子表外键对应的数据可以重复(外键不唯一)
  • 方案一:正常创建子主表添加外键约束即可
多对多表关系

多对多表关系的特点:双方的数据都可以对应对方多条数据

多对多特殊情况:多对多需要创建中间表建立数据之间的关联
多对多关系维护:中间表包含两个外键,主表数据之间间接关联

多表查询

步骤

多张真实表->合并语法->中间虚拟表->查询语句->虚拟表 查询语句(单表查询相关语法)
即,将多张表数据利用‘多表查询语法’合并成单张虚拟表,按照多表结果合并的方向,可以分为:水平合并语法和垂直合并语法

垂直合并语法

语法:union(合并记录同时去掉重复数据)/union all(合并记录,且不去掉重复数据)
作用:将多个表结果汇总
主外键:不要求
细节:

实现要求:只要求合并的结果集之间的列数和对用的类型相同即可
主外键要求:union只是结果垂直汇总,不涉及行数据水平连接,不要求有主外键
重复数据认定:一行中的所有列值都相同,认定为重复行

水平合并语法

语法:连接查询
连接查询:

内连接:from 表1[inner]join表2 on 主 = 外 (标准)
	   from 表1,表2 where 主 = 外 (非标准)
外连接:from 表1 left|right[outer]join 表2 on 主 = 外
自然连接:from 表1 natural [left|right]join 表2

作用:将多表结果水平整合
主外键:要求
细节:

核心要求:水平连接时行和行数数据连接,要求两个表必须有关系(主外键)
正确连接:为了正确的将行数据之间连接,水平连接需要额外判定主外键相等
拆表产物:因为关系型数据库特点,数据进行拆表存储,所以水平连接语法非常重要
语法理解:别看水平连接有多种语法,但是基本大同小异,只要理解内外区别即可
内连接查询语法
内连接是什么

内连接是一种用于从两个或多个表中检索数据的查询方式。内连接会根据指定的连接条件,将两个表中满足条件的行经行匹配,并返回匹配成功的行

语法:
select * from 表1 [inner] jion 表2 on 表1.主键 = 表2.外键(标准)
select * from 表1,表2 where 表1.主键 = 表2.外键(非标准)
细节
1. 以上两种语法功能和效果相同,推荐标准语法
	标准的内连接更通用!两者效果一致,内连接的特点就是两个表必须满足主外键相等,方可返回数据!
2. 为了避免错误的数据连接,连接查询必须添加主外键相等条件
	连接查询就是将所有数据行互相拼接一次!例如:A和B连接查询,A有3条数据,B有4条数据,会出现12条数据的结果,但是数据行不一定正确连接,这就是经典的笛卡尔积问题!我们可以通过添加主外键相等,进行正确数据筛选!
3. 多表查询要考虑不同表存在相同字段名的问题
	多表中很大概率存在相同的名称的列(主外键一般命名相同),在select后或者条件比较列的时候,需使用表名.列名!但是表名可能较长,可以给表起别名,语法为:from 表 别名 | from as 别名!这样就可以通过:表别名.列名

外连接
外连接是什么

外连接是一种用于从两个或多个表中检索数据的查询方式,与内连接不同的是外连接会返回所有符合条件的行,同时还会返回未匹配的行。外连接分为左外连接(left join)、右外连接(right join)!

语法

select * from 表1 left [outer] join 表2 on 表1.主键 = 表2.外键(左外)
select * from 表1 right [outer] join 表2 on 表1.主键 = 表2.外键 (右外)

细节
1. 内连接和外连接语法效果区别
	内连接:只满足匹配条件的行数,两个表必须存在且主外键值相等才会返回
	外连接:可以通过左和右指定一个逻辑主表,逻辑主表数据一定会查询到
2. 外连接语法可以省略和优化
	外连接的语法也可以省略[outer]
	left|right outer join = left|right join
	left和right就是指定左还是右是逻辑主表
3. 外连接的连续性
	建议将分析的逻辑主表放在第一个位置(最左),那么本次查询必然全部是左外连接!
	from 逻辑主表 left join 表2 on 主 = 外 left join 表3 on 主 = 外 left join
内外连接语法总结
1. 外连接需要添加主外键判定,去除笛卡尔积问题。
2. 内连接属于‘公平’查询法,双方都满足主外键相等方可查询。
3. 外连接属于‘不公平’查询法,可以指定一方为逻辑主表,逻辑主表的数据一定会查询出来。
4. 一般情况主外键的条件添加到on后,其他条件依然使用where。
5. 如果右逻辑主表,建议放在最左侧,后续一致可以使用左外连接。
6. 多表联合查询,关联主外键条件个数为n-1。
多表查询关键字顺序
select ......
from ......
left|right join on
left|right join on
left|right join on # 多表连接
where and
group by
having
order by ...asc/desc
limit ...
自然连接查询语法
是什么

自然连接是一种内连接和外连接的升级版,会自动找到两个表中相同的列名,判定相等,也可以省略 on 主 = 外的语法!
但是也值得注意,除了主外键其他列名相同,他也会自动判定相等!稍显不靠谱!

语法
select * from emp natural jion dept; # 自然内连接
select * from emp nature left/right join dept; # 自然外连接
细节
1. 自然连接就内和外连接语法升级版本
	自然连接可以变成内连接或者外连接,会自动查找相同的列判定相等!
	使用自然连接要求:主外键命名要相同,除主外键之外命名要不相同!
2. 自然连接可以指定判定哪些列
	例如:employees e JOIN departments d USING(department_id);
	使用 USING 指定数据表里的`同名字段`进行等值连接。
	因为其繁琐性,不是很推荐使用!
自连接查询语法
是什么

自连接是指在数据库中,一个表与自身进行连接的操作。它在查询中使用相同表的别名来表示不同的实例,然后通过连接条件将这两个实例进行连接。
!自连接不是新的语法,就是单张表进行多次使用一种场景!

注意:自连接依然使用内外连接语法实现
1. 自连接不是新语法,而是一种特殊的查询场景
	自连接和自然连接不一样,自然连接是新的语法,自连接指定的是一张表连接自己实现特殊的多表查询的情况!
2. 自连接具体实现语法问题
	自连接这种情况,依然需要内连接或者外连接或者自然连接具体语法实现!
3. 自连接的应用场景
	一个表中就存在数据的引用关系,要查询的数据关联在同一个表的其他行!!
	例如:员工表中右员工编号,领导编号,而领导编号应用的也是同一张表的其他行数据!如果查询员工信息和员工的领导信息,就是典型的自连接场景!

image

一个表中的数据引用一个表中的一行数据
自连接依然使用内外自然连接实现
自连接!=自然连接

以内连接举例,本质上就是内连接的左右都是同一张表,只不过是左侧表的主键选取与右侧表主键选取不同

子查询
子查询语法是什么

子查询是指在sql中嵌套另一个完整的select查询语句,这个嵌套的查询通常被称为子查询或内部查询

# 例如:查询嵌套子查询
select student_id,student_name,score from t_score WHERE score>(select AVG(score)from t_score);

注意:子查询也可以在insert、update、或delete语句中使用,用于提供额外的条件、过滤结果或进行比较。

# 例如:其他类型嵌套子查询
update t_scores
				set score = (select avg(列名)from 表名)
				where student_id = 5;
标量子查询:子查询返回单行单列,这个值通常用于条件判断、过滤或者作为select查询的一部分
行子子查询:子查询返回一行多列,通常用于更新或插入数据,或者作为一个整体来比较。
列子子查询:子查询返回一列多行,通常用于 in、any、all、等条件中,或者作为其他查询的条件。
表子子查询:子查询返回多行多列,通常不能用于查询条件,用于连接或联合查询中的虚拟表

数据库的高级和新特性

。。。。。。。。。。。

posted on 2025-02-07 10:41  侯广  阅读(44)  评论(0)    收藏  举报