课程来源:黑马程序员 MySQL数据库入门到精通
老师讲解很细致呀,本文只是对讲课笔记的整理,有问题欢迎大家指正!
引擎请下一篇:【黑马程序员数据库】数据库引擎

java 学习笔记指路
基础知识

Python转java补充知识
Java中常见的名词解释

前端

【黑马程序员pink老师前端】HTML
【黑马程序员pink老师前端】JavaScript基础大总结
【黑马程序员pink老师前端】JavaScript函数与作用域
【黑马程序员pink老师前端】JavaScript对象

数据库

【黑马程序员数据库】数据库基础大总结
【黑马程序员数据库】数据库引擎
【黑马程序员数据库】数据库索引

SQL编程

【牛客】SQL刷题篇入门篇
【牛客】SQL刷题篇进阶篇

Java 框架

spring框架学习
Mybatis-plus 快速入门
Maven基础
Zookeeper初认识
HTTP简介
Tomcat
Servlet
vue入门

目录

0. 数据库学习流程❤️

在这里插入图片描述

1. 数据库概念❤️

1.1 基础概念⭐

名称全称简称
数据库存储数据的仓库,数据是有组织的进行存储DataBase(DB)
数据库管理系统操纵和管理数据库的大型软件DataBase Management System(DBMS)
SQL操纵关系型数据库的编程语言,定义了一套操纵关系型数据库统一标准Structured Query Language(SQL)

1.2 关系和非关系库⭐

常见的数据库:

  • 关系型数据库, Oracle、MySQL、SQLServer、Access
  • 非关系型数据库, MongoDB、Redis、Solr、ElasticSearch、Hive、HBase

在这里插入图片描述

在这里插入图片描述

1.3 MySQL的数据模型⭐

在这里插入图片描述

2. MySQL基础❤️

2.1 MySQL安装⭐

官网下载,全点next就好
设置个简单一点的密码,比如:123456

2.1.1 连接🔥

在这里插入图片描述

2.1.2 启动、停止🔥

  1. Windows->服务 中直接启动
    在这里插入图片描述
    在这里插入图片描述
  2. Windows+r->cmd 启动
  • mysql -u root -p
  • mysql [-h 127.0.0.1] [-p 3306] -u root -p

注:这种方式需要配置PATH环境,IP和端口可以省略
win10配置PATH环境方法
控制面板->系统->左侧【高级系统设置】->环境变量->path
此台电脑->右键【属性】->下滑倒数第二个【高级系统设置】->环境变量->path
在这里插入图片描述

2.2 MySQL可视化开发工具⭐

Navicat
以直觉化的图形用户界面而建的,可以兼容多种数据库,支持多种操作系统。

SQLyog
是一个快速而简洁的图形化管理MySQL数据库的工具,它能够在任何地点有效地管理你的数据库,由业界著名的Webyog公司出品

MySQL Workbench
社区版完全免费,而商业版则是按年收费。支持数据库的创建、设计、迁移、备份、导出和导入等功能,并且支持 Windows、Linux 和 mac 等主流操作系统。

DataGrip
是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql、创建表、创建索引以及导出数据等

2.3 MySQL分类⭐

在这里插入图片描述
注意:SQL不区分大小写

2.4 SQL通用语法⭐

1.SQL语句可以单行或多行书写,以分号结尾。
2.SQL语句可以使用空格/缩进来增强语句的可读性。
3.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
4.注释:

  • 单行注释:--注释内容或 # 注释内容(MySQL特有)
  • 多行注释:/*注释内容*/

2.5 MySQL数据库操作-DDL⭐

DDL分类:

  • 对数据库的常用操作
  • 对表结构的常用操作
  • 修改表结构

2.5.1 对数据库的常用操作🔥

功能SQL语句
创建数据库create database if not exists 库名 default charset=utf8mb4; 或 create database 库名;
查看所有数据库show databases;
选择要操作的数据库use 库名;
删除数据库drop database if exists 库名;
修改数据库编码alter database 库名 character set utf8;
注意:
  • utf8mb4可以存储4个字节,utf8存储3个字节,推荐使用utf8mb4
  • 输入 if not exists 会在创建数据库的时候先判断是否已经存在,如果已经存在就不创建,也不会报错。

2.5.2 对表结构的常用操作🔥

2.5.2.1 数据类型
  • 数值类型
  • 日期和时间类型
  • 字符串类型

数值类型
在这里插入图片描述
日期和时间类型
在这里插入图片描述
字符串类型
在这里插入图片描述

2.5.2.2 创建表
create table [if not exists]表名(
  字段名1 类型[(宽度)] [约束条件] [comment '字段说明'],
  字段名2 类型[(宽度)] [约束条件] [comment '字段说明'],
  字段名3 类型[(宽度)] [约束条件] [comment '字段说明']
)[表的一些设置];
2.5.2.3 对表结构的其他操作

在这里插入图片描述

2.5.3 修改表结构 🔥

功能语法格式
修改表添加列alter table 表名 add 列名 类型(长度) [约束];
修改列名和类型alter table 表名 change 旧列名 新列名 类型(长度) 约束;
修改表删除列alter table 表名 drop 列名;
修改表名rename table 表名 to 新表名;

2.6 MySQL数据库操作-DML⭐

DML分类:

  • 插入insert
  • 删除delete
  • 修改update

2.6.1 插入🔥

语法格式:

insert into(列名1,列名2,列名3...) values (1,2,3...);
// 不指定列,向表中插入所有列
insert intovalues (1,2,3...);
// 一次插入多行数据
insert into(列名1,列名2,列名3...) values (1,2,3...),(1,2,3...),(1,2,3...);

例子:

-- 指定列插入单行数据,数据类型、顺序、个数需匹配
insert into student(sid,name,gender,age,birth,address,score) values
(1001,'男',18,'1996-12-23','北京',83.5);
-- 不指定列插入单行数据
insert into student values(1001,'男',18,'1996-12-23','北京',83.5);
-- 插入多行数据
insert into student(sid,name,gender,age,birth,address,score) values(1002,'男',18,'1996-12-23','北京',83.5),(1003,'女',18,'1997-12-23','北京',53.5);

2.6.2 删除🔥

delete from 表名 [where 条件];
truncate table 表名;
truncate 表名;

注意:没有where 条件会删除整张表的数据。

2.6.3 修改🔥

update 表名 set 字段名=,字段名=...;
update 表名 set 字段名=,字段名=... where 条件;
-- 将所有学生的地址修改为重庆
update student set address = '重庆';
-- 讲id为1004的学生的地址修改为北京
update student set address = '北京' where id = 1004
-- 讲id为1005的学生的地址修改为北京,成绩修成绩修改为100
update student set address = '广州',score=100 where id = 1005

注意:没有where 条件,则修改整张表

2.7 MySQL约束⭐

2.7.1 概念(constraint)🔥

约束实际上就是表中数据的限制条件

2.7.2 作用🔥

表在设计的时候加入约束的目的就是为了保证表中的记录完整性和有效性,比如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。

2.7.3 分类🔥

  • 主键约束(primary key) PK
  • 自增长约束(auto_increment)
  • 非空约束(not null)
  • 唯一性约束(unique)
  • 默认约束(default)
  • 零填充约束(zerofill)
  • 外键约束(foreign key) FK

2.7.4 主键约束🔥

2.7.4.1 概念
  • MySQL主键约束是一个列或者多个列的组合,其值能唯一地标识表中的每一行,方便在RDBMS中尽快的找到某一行。
  • 主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。
  • 每个表最多只允许一个主键
  • 主键约束的关键字是:primary key
  • 当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
2.7.4.2 添加单列主键

创建单列主键有两种方式,一种是在定义字段的同时指定主键,一种是定义完字段之后指定主键。
方法一:

-- 在 create table 语句中,通过 PRIMARY KEY 关键字来指定主键。
-- 在定义字段的同时指定主键,语法格式如下:
create table 表名(
   ...
   <字段名> <数据类型> primary key
   ...
)

方法二:

-- 在定义字段之后再指定主键,语法格式如下:
create table 表名(
   ...
   [constraint <约束名>] primary key [字段名]
 
);
2.7.4.3 添加多列联合主键

所谓的联合主键,就是这个主键是由一张表中多个字段组成的。

注意:

  1. 当主键是由多个字段组成时,不能直接在字段名后面声明主键约束。
  2. 一张表只能有一个主键,联合主键也是一个主键
create table 表名(
   ...
   primary key(字段1,字段2,…,字段n)
);
2.7.4.4 修改表结构添加主键

主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。

create table 表名(
   ...
);
alter table <表名> add primary key(字段列表);
2.7.4.5 删除主键

主键约束不仅可以在创建表的同时创建,也可以在修改表时添加。

alter table <数据表名> drop primary key;

2.7.5 自增长约束🔥

2.7.5.1 概念

在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。

通过给字段添加 auto_increment 属性来实现主键自增长

2.7.5.2 语法
字段名 数据类型 auto_increment
2.7.5.3 特点
  • 默认情况下,auto_increment的初始值是 1,每新增一条记录,字段值自动加 1。
  • 一个表中只能有一个字段使用 auto_increment约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
  • auto_increment约束的字段必须具备 NOT NULL 属性。
  • auto_increment约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等。
  • auto_increment约束字段的最大值受该字段的数据类型约束,如果达到上限,auto_increment就会失效。
2.7.5.4 指定自增字段初始值

如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。例如,如果表中插入的第一条记录的 id 值设置为 5,那么再插入记录时,id 值就会从 5 开始往上增加

1、方式1:创建表时指定

create table t_user2 (
  id int primary key auto_increment,
  name varchar(20)
)auto_increment=100;

2、方式2:创建表之后指定

create table t_user3 (
  id int primary key auto_increment,
  name varchar(20)
);
alter table t_user2 auto_increment=100;
2.7.5.5 delete和truncate在删除后自增列的变化

delete数据之后自动增长从断点开始,会保留自增长从断点开始+1。

truncate数据之后自动增长从默认起始值1开始。

2.7.6 非空约束🔥

2.7.6.1 概念

MySQL 非空约束(not null)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。

2.7.6.2 语法

1.方式一:

<字段名><数据类型> not null;

2.方式二:

alter table 表名 modify 字段 类型 not null;
2.7.6.3 删除非空约束
语法:alter table 表名 modify 字段 类型

2.7.7 唯一约束🔥

2.7.7.1 概念

唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。

2.7.7.2 语法

1.方法一:

<字段名> <数据类型> unique

2.方法二:

alter table 表名 add constraint 约束名 unique();
2.7.7.3 删除唯一约束
语法:alter table <表名> drop index <唯一约束名/列名>;

2.7.8 默认约束🔥

2.7.8.1 概念

MySQL 默认值约束用来指定某列的默认值。

2.7.8.2 语法

1、方法一:

<字段名> <数据类型> default <默认值>;

2.方法二:

alter table 表名 modify 列名 类型 default 默认值;
2.7.8.3 删除默认约束
语法:alter table <表名> modify column <字段名> <类型> default null;

2.7.9 零填充约束🔥

2.7.9.1 概念

1、插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的0
2、zerofill默认为int(10)
3、当使用zerofill 时,默认会自动加unsigned(无符号)属性,使用unsigned属性后,数值范围是原值的2倍,例如,有符号为-128+127,无符号为0256。

2.7.9.2 语法
create table t_user12 (
  id int zerofill , -- 零填充约束
  name varchar(20)  
);
2.7.9.3 删除零填充约束
alter table t_user12 modify id int;

2.7.10 思维导图🔥

请添加图片描述

2.8 MySQL数据库操作-DQL⭐

2.8.1 概念🔥

  • 数据查询功能,返回数据库中存储的数据应该根据需要对数据进行筛选以及确定数据以什么样的格式显示。
  • MySQL数据库使用select语句来查询数据。

2.8.2 应用🔥

在这里插入图片描述

2.8.3 语法🔥

select
  [all|distinct]
  <目标列的表达式1> [别名],
  <目标列的表达式2> [别名]...
from <表名或视图名> [别名],<表名或视图名> [别名]...
[where<条件表达式>]
[group by <列名>
[having <条件表达式>]]
[order by <列名> [asc|desc]]
[limit <数字或者列表>];

关键词 distinct 去重,用于返回唯一不同的值。

2.8.4 简化语法🔥

select *| 列名 fromwhere 条件

2.8.5 运算符🔥

MySQL支持4种运算符: 算术运算符、比较运算符、逻辑运算符、位运算符
运算符优先级:
括号:();
乘、除、求模运算符:*、/、%;
加减运算符:+、- ;
比较运算符:=、>、<、>=、<=、<>、!=、!>、!<;
位运算符:^、&、|;
逻辑运算符:NOT;
逻辑运算符:AND;
逻辑运算符:OR。

2.8.5.1 算术运算符
运算符描述
+
-
*
/ 或 DIV除,返回商
% 或 MOD取余
2.8.5.2 比较(关系)运算符

比较运算符是两个数据进行比较时所使用的运算符,比较运算后,会返回一个布尔值(true / false)作为比较运算的结果。

运算符名称说明
=等于
<小于号
>大于号
>=大于等于号(大于或者等于)
<=小于等于号(小于或者等于)
<=>安全的等于,两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0
!= 或 <>不等号
IS NULL 或 ISNULL判断一个值是否为 NULL
IS NOT NULL判断一个值是否不为 NULL
LEAST当有两个或多个参数时,返回最小值
GREATEST当有两个或多个参数时,返回最大值
BETWEEN AND判断一个值是否落在两个值之间
(NOT) IN判断一个值(不)是IN列表中的任意一个值
LIKE通配符匹配
REGEXP正则表达式匹配
2.8.5.3 逻辑运算符
逻辑运算符说明
AND 或 &&逻辑与
`OR 或
NOT 或 !逻辑非
XOR逻辑异或
2.8.5.4 位运算符
位运算符说明
&按位与
``
~按位取反,反转所有比特
^按位异或
<<按位左移
>>按位右移

2.8.6 排序查询(order by)🔥

2.8.6.1 语法

按字段的先后顺序来分主次,先排字段名1,再排字段名2。

select 
字段名1,字段名2,……
from 表名
order by 字段名1 [asc|desc],字段名2[asc|desc]……
2.8.6.2 说明

1.asc代表升序,desc代表降序,如果不写默认升序
2.order by用于子句中可以支持单个字段,多个字段,表达式,函数,别名
3.order by子句,放在查询语句的最后面。LIMIT子句除外

2.8.7 聚合查询🔥

之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。

2.8.7.1 语法
-- 1 查询商品的总条数
select count(*) from product;
-- 2 查询价格大于200商品的总条数
select count(*) from product where price > 200;
-- 3 查询分类为'c001'的所有商品的总和
select sum(price) from product where category_id = 'c001';
-- 4 查询商品的最大价格
select max(price) from product;
-- 5 查询商品的最小价格
select min(price) from product;
-- 6 查询分类为'c002'所有商品的平均价格
select avg(price) from product where category_id = 'c002';
2.8.7.2 说明
聚合函数作用
count()统计指定列不为NULL的记录
sum()计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0
max()计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算
min()计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算
avg()计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0
2.8.7.3 函数对null值处理
函数处理办法
count( )如果count函数的参数为星号(*),则统计所有记录的个数。而如果参数为某字段,不统计含null值的记录个数
sum( ) 和 avg( ) 、max( ) 和 min( )忽略null值

2.8.8 分组查询(group by)🔥

2.8.8.1 语法
select 字段1,字段2from 表名 group by 分组字段 having 分组条件;
2.8.8.2 实现过程

在这里插入图片描述

  • 先执行分组、然后将分组以后的id提取出来,再执行统计每组的个数,最后进行查询操作。
  • group by后面可用逗号隔开加多个参数,只有都相同,才会分往同一个组。
  • 如果要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出现:因为会导致列不匹配,例如:当按省分组学生后,只能出现省和该省统计的人数,如果出现其他列,如学生名,就会报错。
2.8.8.3 分组之后的条件筛选-having
  • 分组之后对统计结果进行筛选的话必须使用having,不能使用where
  • where子句用来筛选 FROM 子句中指定的操作所产生的行
  • group by 子句用来分组 WHERE 子句的输出。
  • having 子句用来从分组的结果中筛选行

2.8.9 分页查询(limit)🔥

2.8.9.1 语法
-- 方式1-显示前n条
select 字段1,字段2... from 表明 limit n
-- 方式2-分页显示
select 字段1,字段2... from 表明 limit m,n
  • m: 整数,表示从第几条索引开始,计算方式 (当前页-1)*每页显示条数
  • n: 整数,表示查询多少条数据

2.8.10 Insert_into_select语句🔥

  • 将一张表的数据导入到另一张表中,可以使用INSERT INTO SELECT语句
  • 将一张表的数据导入到另一张表中,有两种选择 SELECT INTO 和 INSERT INTO SELECT
2.8.10.1 语法

方法一:

insert into Table2(field1,field2,) select value1,value2,from Table1;
 
insert into Table2 select * from Table1;

要求目标表Table2必须存在

方法二:

SELECT vale1, value2 into Table2 from Table1

要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。

2.8.11 思维导图🔥

请添加图片描述

2.8.12 正则表达式查询🔥

2.8.12.1 概念

正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。

MySQL通过REGEXP关键字支持正则表达式进行字符串匹配。

2.8.12.2 格式
模式描述
^匹配输入字符串的开始位置
$匹配输入字符串的结束位置
.匹配除 “\n” 之外的任何单个字符
[…]字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’
[^…]负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’
`p1p2
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次

3. MySQL多表操作❤️

3.1 多表关系⭐

一对一关系
一对一关系
多对多关系

3.2 外键约束

3.2.1 定义外键规则

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。
    必须为主表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这 个外键的内容就是正确的。
  • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
  • 外键中列的数目必须和主表的主键中列的数目相同。(简单来说,如果主表是组合主键,从表也必须是组合主键)
  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。

3.2.2 创建外键约束(一对多)

方式1:在创建表时设置外键约束

语法:
在 create table 语句中,通过 foreign key 关键字来指定外键,具体的语法格式如下:

[constraint <外键名>] foreign key 字段名 [,字段名2,…] references <主表名> 主键列1 [,主键列2,…]

实现:为"emp"表中的"dept_id"字段创建为外键,并命名为"emp_fk",然后关联"dept"表中的"deptno"主键字段。
在这里插入图片描述

create database mydb3; 
use mydb3;
-- 创建部门表(主表)
create table if not exists dept(
deptno varchar(20) primary key ,  -- 部门号
name varchar(20) -- 部门名字
);
-- 创建部门表(从表)
create table if not exists emp(
eid varchar(20) primary key , -- 员工编号
ename varchar(20), -- 员工名字
age int,  -- 员工年龄
dept_id varchar(20),  -- 员工所属部门
constraint emp_fk foreign key (dept_id) references dept (deptno) -- 外键约束
);
方式2:在创建表时设置外键约束

添加外键约束的前提是:从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据
语法:

alter table <从表名> add constraint <外键名> foreign key (字段名) references <主表名> (主键列1);

实现:

-- 创建部门表(主表)
create table if not exists dept2(
deptno varchar(20) primary key ,  -- 部门号
name varchar(20) -- 部门名字
);
				
-- 创建部门表(从表)
create table if not exists emp2(
eid varchar(20) primary key , -- 员工编号
ename varchar(20), -- 员工名字
age int,  -- 员工年龄
dept_id varchar(20)  -- 员工所属部门
);
 
-- 创建外键约束
alter table emp2 add constraint dept_id_fk foreign key(dept_id) references dept2 (deptno);

3.2.3 验证外键约束的作用

数据插入

-- 1、添加主表数据
-- 注意必须先给主表添加数据
insert into dept values('1001','研发部');
insert into dept values('1002','销售部');
insert into dept values('1003','财务部');
insert into dept values('1004','人事部’);
-- 2、添加从表数据
-- 注意给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列
insert into emp values('1','乔峰',20, '1001');
insert into emp values('2','段誉',21, '1001');
insert into emp values('3','虚竹',23, '1001');
insert into emp values('4','阿紫',18, '1002');
insert into emp values('5','扫地僧',35, '1002');
insert into emp values('6','李秋水',33, '1003');
insert into emp values('7','鸠摩智',50, '1003');
insert into emp values('8','天山童姥',60, '1005');  -- 1005,主表不存在该列,不可以添加

删除数据

-- 3、删除数据
 /*
   注意:
       1:主表的数据被从表依赖时,不能删除,否则可以删除
       2: 从表的数据可以随便删除
 */
delete from dept where deptno = '1001'; -- 从表中有引用,不可以删除
delete from dept where deptno = '1004'; -- 从表中没有引用,可以删除
delete from emp where eid = '7'; -- 可以删除

3.2.4 删除外键约束

当一个表中不需要外键约束时,就需要从表中将其删除。外键一旦删除,就会解除主表和从表间的关联关系
语法:

alter table <从表名> drop foreign key <外键约束名>;

实现:

alter table emp drop foreign key emp_fk;

3.2.5 创建外键约束(多对多)

在多对多关系中,A表的一行对应B的多行,B表的一行对应A表的多行,我们要新增加一个中间表,来建立多对多关系。
在这里插入图片描述

  • 中间表含有两个外键,属于从表
  • 成绩表和学生表各有一个主键,属于主表。

实现:

-- 学生表和课程表(多对多)
 
-- 1 创建学生表student(左侧主表)
 
create table if not exists student(
    sid int primary key auto_increment,
    name varchar(20),
    age int,
    gender varchar(20)
);
-- 2 创建课程表course(右侧主表)
create table course(
   cid  int primary key auto_increment,
   cidname varchar(20)
);
-- 3创建中间表student_course/score(从表)
create table score(
    sid int,
    cid int,
    score double
);
-- 4建立外键约束(2次)
alter table score add foreign key(sid) references student(sid);
alter table score add foreign key(cid) references course(cid);
-- 5给学生表添加数据
insert into student values(1,'小龙女',18,'女'),(2,'阿紫',19,'女'),(3,'周芷若',20,'男');
-- 6给课程表添加数据
insert into course values(1,'语文'),(2,'数学'),(3,'英语');
-- 7给中间表添加数据
insert into score values(1,1,75),(1,2,83),(2,1,67),(2,3,80),(3,2,90),(3,3,88);
-- 注意:在删除表时,需要先删除从表再删除主表。因为先删除主表会导致从表引用错误。中间表是从表,可以随便删除。

3.3 多表联合查询

3.3.1 概念

多表查询就是同时查询两个或两个以上的表,显示来自多张表的数据。

分类:

  • 交叉连接查询
  • 内连接查询
  • 外连接查询
  • 子查询
  • 表自关联

join实现的功能:通过两张表关联的列(比如商品id),将两张表的列进行合并。

3.3.3 交叉连接查询

交叉连接查询返回被连接的两个表所有数据行的笛卡尔积。笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配,假如A表有m行数据,B表有n行数据,则返回 m*n 行数据。笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选。
语法:

select * from1,2,3.;

3.3.4 内连接查询

在这里插入图片描述
语法:

隐式内连接(SQL92标准):select * from A,B where 条件; 
显示内连接(SQL99标准):select * from A inner join B on 条件;

inner可以省略
常用实现:

from ods_itcast_order_goods a join ods_itcast_goods b  on  a.goodsId = b.goodsId

给 ods_itcast_order_goods 表起名为a,ods_itcast_goods 表起名为b,使用 goodsId 这一列进行关联。后面可以直接用b.goodsName调用 ods_itcast_goods 表中数据。

3.3.5 外连接查询

名称语法关系
左外连接select * from A left outer join B on 条件;在这里插入图片描述
右外连接select * from A right outer join B on 条件;在这里插入图片描述
满外连接select * from A full outer join B on 条件;在这里插入图片描述

3.3.6 基本子查询

3.3.6.1 概述
3.3.6.2 子查询关键字(all)
3.3.6.3 子查询关键字(any和some)
3.3.6.4 子查询关键字(in)
3.3.6.5 子查询关键字(exists)

3.3.7 自关联查询

MySQL有时在信息查询时需要进行对表自身进行关联查询,即一张表自己和自己关联,一张表当成多张表来用。注意自关联时表必须给表起别名。
语法:

select 字段列表 from1 a ,1 b where 条件;
select 字段列表 from1 a [left] join1 b on 条件;

3.4思维导图

请添加图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐