MySQL
温馨提示
正在学习整理中...
MySQL
MySQL 是一款领先的开源关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下产品 。
MySQL - 官网
MySQL - 长期支持版本
MySQL - 其他版本
学习视频
三大范式
- 第一范式( 1NF ) ( 原子性 ) ( 二维表 ) ( 函数依赖 )
- 第二范式( 2NF ) ( 在第一范式基础之上 并且不能存在部分依赖 )
- 第三范式( 3NF ) ( 在第二范式基础之上 并且不能存在传递依赖 )
三层架构
// 三层架构
// 浏览器 ==> Controller(请求处理, 响应数据) ==> Service(逻辑处理) ==> Dao(数据访问) ==> emp.xml
// 浏览器 ==> Controller(请求处理, 响应数据) ==> Service(逻辑处理) ==> Dao(数据访问) ==> 数据库什么是数据库
- 数据库:DataBase(DB),是存储和管理数据的仓库
- 数据库管理系统:DataBase Management System (DBMS),操纵和管理数据库的大型软件。
- SQL:Structured Query Language,操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准
MySQL概述
安装 配置
// 步骤一: 官网下载 MySQL
// 步骤二: 解压安装包
// 步骤三: 配置环境变量
// MYSQL_HOME E:\MySQL\mysql-9.1.0-winx64
// 步骤四: 检查 左下角搜索输入cmd 以管理员的身份运行
// 步骤五: 输入: mysql
// 初始化 MySQL 以管理员身份打开
mysqld --initialize-insecure
// 注册MySQL服务 搜索服务可以查询到
mysqld -install
// 启动/停止 MySQL服务
net start mysql // 启动
net stop mysql // 停止
// 修改默认账户密码
mysqladmin -u root password 123456
// 登录 MySQL
mysql -uroot -p
// 卸载MySQL
net stop mysql // 停止
mysqld -remove mysq1
再删除对应的文件夹MySQL链接
- 语法: mysql -u用户名 -p密码 [-h数据库服务器IP地址 -p端口号]
MySQL-企业开发使用方式
- mysql -u用户名 -p密码 [-h数据库服务器IP地址 -P端口号]
数据模型
- 关系型数据库(RDBMIS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
特点:
- 使用表存储数据,格式统一,便于维护
- 使用SQL语言操作,标准统一,使用方便,可用于复杂查询
// cmd 回车
// 创建数据库
create database db01:
// 在数据库里面可以创建多个表SQL简介
SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准,
通用语法
// SQL语句可以单行或多行书写,以分号结尾。
// SQL语句可以使用空格/缩进来增强语句的可读性。
// MySQL数据库的SQL语句不区分大小写。
// 注释:
// 单行注释:--注释内容或#注释内容(MySQL特有)
// 多行注释:/*注释内容*/SQL分类
SQL语句通常被分为四大类:
| 分类 | 全称 | 说明 |
|---|---|---|
| DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
| DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
| DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
| DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
数据库设计 - DDL
数据库相关的
差不多已经被图形化的工具而替代
数据库 - 登录MySQL
mysql -uroot -p数据库 - 查询
show databases; // 查询所有数据库
select database(); // 查询当前数据库数据库 - 创建
create database [if not exits] 数据库名称;
create database db01;
create database if not exits db01;数据库 - 使用
use db01;数据库 - 删除
drop database [if exits] 数据库名;图形化工具
MysSQL客户端工具 - 图形化工具;
DataGrip
介绍:DataGrip是JetBrains旗下的一款数据库管理工具,是管理和开发MySQL、Oracle、PostgreSQL的理想解决方案。
官网:安装下载地址
可以不用下载 在IDEA中也可以使用
数据库设计 - DDL
表相关的操作( 创建 查询 修改 删除 )
差不多已经被图形化的工具而替代
表 - 创建
语法 约束 数据类型 设计
create table 表名(
字段1 字段类型 [约束][comment 字段1注释],
...
字段n 字段类型 [约束][comment 字段n注释],
)[comment 表注释];
// eg:
create table tb_user(
id int primary key auto_increment comment 'ID 用户的唯一标识',
username varchar(50) not null unique comment '用户名',
name varchar(10) not null comment '用户名',
age int comment '年龄',
gender char(1) default '男' comment '性别'
) comment '用户表'约束
- 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
- 目的:保证数据库中数据的正确性、有效性和完整性。
| 约束 | 描述 | 关键字 |
|---|---|---|
| 非空约束 | 限制该字段值不能为null | not null |
| 唯一约束 | 保证字段的所有数据都是唯一、不重复的 | unique |
| 主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | primary key( auto_increment自增 ) |
| 默认约束 | 保存数据时,如果未指定该字段值,则采用默认值 | default |
| 外键约束 | 让两张表的数据建立连接,保证数据的一致性和完整性 | foreign key |
// 设计表结构的基本流程
// 步骤一: 页面原型 + 需求
// 步骤二: 原型字段( 类型 约束 )
// 步骤三: 基础字段( id createTime updateTime )
// 步骤四: 开始创建
// 注意事项:
// createTime: 记录的是当前这条数据的插入时间
// updateTime: 记录当前这条数据最后更新的时间数据类型
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
// 数值类型
tinyint // unsigned 加他表示没有负数
int // unsigned 无符号
bigint
double
// 字符串类型
char // eg: phone char(11)
varchar // eg: userName varchar(20)
// 日期时间类型
date YYYY-MMM-DD // 用的比较多
time HH:MM:SS
year YYYY
datetime YYYY-MMM-DD HH:MM:SS // 用的比较多 update_time
timestamp YYYY-MMM-DD HH:MM:SS表 - 查询
// 查询当前数据库所有表:show tables;
// 查询表结构:desc 表名;
// 查询建表语句:show create table 表名;表 - 修改
// 添加字段:alter table 表名 add 字段名 类型(长度)[comment注释][约束];
// 修改字段类型:alter table 表名 modify 字段名 新数据类型(长度);
// 修改字段名和字段类型:alter table 表名 change 旧字段名 新字段名类型(长度)[comment注释][约束];
// 删除字段:alter table 表名 drop column 字段名;
// 修改表名:rename table 表名 to 新表名;表 - 删除
// 删除表: drop table 表名;
// 注意事项: 删除表里面的所有数据数据库操作 - DML
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。
添加数据( INSERT )
insert into 表名(字段列表) values(字段值列表);
// 指定字段添加数据:insert into 表名( 字段名1,字段名2...) values(值1,值2...);
// 全部字段添加数据:insert into 表名 values(值1,值2,..);
// 批量添加数据(指定字段) :insert into 表名( 字段名1,字段名2...) values (值1,值2...),(值1,值2...);
// 批量添加数据(全部字段):insert into 表名 values (值1,值2,...),(值1,值2,...);修改数据( UPDATE )
update 表名 set 字段名 = 字段值, 字段名 = 字段值 [where 条件];
// 修改数据:update 表名 set 字段名1 = 值1,字段名2 = 值2,... [where 条件];
// 更新id为3的数据
update tb_emp set userName ='huawuque', name='花无缺',password='huawuqu123', updateTime = now() where id = 3;
// 更新所有的入职时间为2024-11-12
update tb_emp set entryData = '2024-11-12';
// 注意事项: 修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。删除数据( DELETE )
delete from 表名 [ where 条件 ];
// 删除数据:delete from 表名 [where条件];
// 删除 tb_emp 表中 ID 为1的员工
delete from tb_emp where id = 1;
// 删除 tb_emp 表中的所有员工
delete from tb_emp;
// 注意事项:
// 1.DELETE语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
// 2.DELETE语句不能删除某一个字段的值(如果要操作,可以使用UPDATE,将该字段的值置为NULL)。数据库操作 - DQL
- DQL英文全称是 Data Query Language(数据查询语言),用来查询数据库表中的记录。
- 关键字:SELECT
查询数据( SELECT )
// 基本查询
// select
// 字段列表
// from
// 表名列表
// 条件查询
// where
// 条件列表
// 分组查询
// group by
// 分组字段列表
// having
// 分组后条件列表
// 排序查询
// order by
// 排序字段列表
// 分页查询
// limit
// 分页参数基本查询
// 查询多个字段:select 字段1,字段2,字段3 from 表名;
// 查询所有字段(通配符):select * from 表名;
// 不推荐使用通配符 直接 全部字段名查询
// 设置别名:select 字段1 [as 别名1],字段2 [as 别名2] from 表名;
// 去除重复记录:select distinct 字段列表 from 表名;-- 示例代码:
-- 字段查询
select name, entryData from tb_emp;
-- 查询所有字段
select * from tb_emp;
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp;
-- 设置别名
select name as 姓名, entryData as 入职日期 from tb_emp;
-- 去除重复记录 查询职位
select distinct job from tb_emp;条件查询
// 条件查询:select 字段列表 from 表名 where 条件列表;| 比较运算符 | 功能 |
|---|---|
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| = | 等于 |
| <> 或 != | 不等于 |
| between...and... | 在某个范围之内 [min , max] |
| in(...) | 在in之后的列表中的值,多选一 |
| like 占位符 | 模糊匹配( _匹配单个字符, %任意字符 ) |
| is null | 是 null |
| 逻辑运算符 | 功能 |
|---|---|
| and 或 && | 并且(多个条件同时成立) |
| or 或 || | 或者(多个条件任意一个成立) |
| not 或 ! | 非 , 不是 |
-- 条件查询
-- 条件查询 where
-- 条件查询 小冯的信息
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where name = '小冯';
-- 条件查询 id小于8的数据
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where id < 8;
-- 条件查询 没有分配职位的员工
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where job is null;
-- 条件查询 分配职位的员工
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where job is not null;
-- 条件查询 密码不等于 123456 的员工信息
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where password != '123456';
-- 条件查询 入职日期在 2000-01-01(包含) 到 2006-01-01(包含) 之间的员工信息
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where entryData between '2000-01-01' and '2006-01-01';
-- 条件查询 入职日期在 2000-01-01(包含) 到 2006-01-01(包含) 之间 并且性别为女 的员工信息
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where entryData between '2000-01-01' and '2006-01-01' and gender = 2;
-- 条件查询 职位是2(讲师),3(学工主管),4(教研主管)的员工信息
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where job = 2 or job = 3 or job = 4;
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where job in(2,3,4);
-- 条件查询 姓名 为两个字的员工信息
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where name like '__';
-- 条件查询 查询 姓 颜 的员工信息
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp where name like '颜%';聚合函数(分组准备)
- 介绍:将一列数据作为一个整体,进行纵向计算。
- 语法:select 聚合函数(字段列表)from 表名;
| 函数 | 功能 |
|---|---|
| count | 统计数量 |
| max | 最大值 |
| min | 最小值 |
| avg | 平均值 |
| sum | 求和 |
注意事项
- null值不参与所有聚合函数运算
- 统计数量可以使用:count() count(字段) count(常量) 推荐使用count() 底层做了优化处理
-- 统计该企业员工数量
-- 1. count(字段)
select count(id) from tb_emp;
select count(name) from tb_emp;
-- 2. count(常量)
select count(0) from tb_emp;
-- 3. count(*) 推荐使用 底层进行了优化处理
select count(*) from tb_emp;
-- 统计该企业最早入职的员工信息
select min(entryData) from tb_emp;
-- 统计该企业最迟入职的员工信息
select max(entryData) from tb_emp;
-- 统计该企业员工ID的平均值
select avg(id) from tb_emp;
-- 统计该企业员工ID的之和
select sum(id) from tb_emp;分组查询
// 分组查询: select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];where与having区别
- 1.执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
- 2.判断条件不同:where不能对聚合函数进行判断,而having可以。
注意事项
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义,
- 执行顺序:where>聚合函数>having。
-- 根据性别分组, 统计男性和女性员工的数量
select gender,count(*) from tb_emp group by gender;
-- 先查询入取时间在‘2010-01-01,(包含)以前的员工,并对结果根据职位分组,获取员工数量大于等于4 的职位
select job, count(*) from tb_emp where entryData <= '2010-01-01' group by job having count(*) >= 4;排序查询
// 条件查询:select 字段列表 from 表名[where条件列表][groupby分组字段]order by 字段1 排序方式1,字段2 排序方式2...;
// 排序方式:
// ASC:升序(默认值) asc
// DESC:降序 desc
// 注意事项:
// 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序-- 根据入职时间, 对员工进行升序排序
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp order by entryData;
-- 根据入职时间, 对员工进行降序排序
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp order by entryData desc ;
-- 根据入职时间对公司的员工进行升序排序, 入职时间相同, 再按照更新时间进行降序排序
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp order by entryData ,updateTime desc ;分页查询
// 分页查询:select 字段列表 from 表名 limit 起始索引l,查询记录数;
// 注意事项:
// 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数
// 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
// 如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10
//起始索引的计算公式: (页码 - 1) * 每页的页数-- 起始索引0开始查询员工数据,每页展示10条记录
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp limit 0,10;
-- 查询第1页员工数据,每页展示10条记录
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp limit 0,10;
-- 查询第2页员工数据,每页展示10条记录
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp limit 10,10;
-- 查询第3页员工数据,每页展示10条记
select id, userName, password, name, gender, image, job, entryData, createTime, updateTime from tb_emp limit 20,10;
-- 起始索引的计算公式: (页码 - 1) * 每页的页数案例
流程控制函数
- if( 条件表达式, true取值, false取值 )
- case 表达式 when 值1 then 结果1 when 值2 then 结果2... else 结果n ... end
-- 案例一: 通过姓名:颜 性别:男 时间:2010-01-01 -- 2018-01-01 降序排序
select *
from tb_emp
where name like '%颜%'
and gender = 1
and entryData between '2010-01-01' and '2018-01-01'
order by entryData desc
limit 0, 10;
-- 案例二: 员工性别信息的统计 {name:'男性员工' , value: 18}
-- if( 条件表达式, true取值, false取值 )
select if(gender = 1, '男性员工','女性员工' ) as 性别, count(*) as 数量 from tb_emp group by gender;
-- 案例三: 员工职位信息的统计
-- case 表达式 when 值1 then 结果1 when 值2 then 结果2... else ... end
select (case job
when 1 then '班主任'
when 2 then '讲师'
when 3 then '学工主管'
when 4 then '教研主管'
else '未分配职位' end) 职位, count(*) 数量
from tb_emp
group by job;单表汇总
/*
SQL分为四类
1. DDL: 定义: 数据库(查询 创建 使用 删除) 表(创建 查询 修改 删除) 推荐使用图形化工具更加直观
2. DML: 操作表中数据: 增 删 改
3. DQL: 查询表中的数据 即查
4. DCL: 创建数据库用户 控制数据库的访问权限( 暂时没学 )
*/
-- =========================== DDL 数据库的相关的操作 ===========================
-- 1.数据库 查询
-- 查询所有
show databases;
-- 查询当前使用的数据库
select database();
-- 2.数据库 创建
create database db03;
-- 3.数据库 使用
use db02;
-- 4.数据库 删除
drop database db03;
-- =========================== DDL 表的相关的操作 ===========================
-- 1.表的创建
create table tb_user
(
user_id int auto_increment comment '用户的唯一标识',
user_name varchar(20) not null comment '用户的姓名',
user_gender char not null comment '用户的性别: 1 男 2 女',
user_phone varchar(11) not null comment '用户的手机号',
user_status char default 1 null comment '用户的状态 1 正常 2 锁定 3 删除',
user_password varchar(30) default 123456 null comment '用户的密码',
create_time datetime null comment '创建时间',
update_time datetime null comment '最后一次更新时间',
constraint user_id
primary key (user_id),
constraint user_phone
unique (user_phone)
)
comment '用户表';
create table tb_test(
test_id int comment '测试的唯一标识',
test_name varchar(30) not null comment '测试的姓名'
) comment '测试表';
-- 2.表的查询
-- 查询当前数据库所有表
show tables ;
-- 查询表结构
desc tb_user;
-- 查询建表语句
show create table tb_user;
-- 3.表的修改 代码繁琐 直接图形化工具完成
-- 右击表名 选择 Modify表(修改表) 更加直观
-- 4.表的删除
drop table tb_test;
-- =========================== DML 表中数据的操作(增 删 改) ===========================
-- 1.新增表中的数据
-- 单条数据添加
insert into tb_user(user_name, user_gender, user_phone, create_time, update_time) value ('王五' , 1 , '15232325656' , now(), now());
insert into tb_user(user_name, user_gender, user_phone, create_time, update_time) value ('张小鹏' , 1 , '15232329696' , now(), now());
insert into tb_user(user_name, user_gender, user_phone, create_time, update_time) value ('张亚' , 2 , '15232324565' , now(), now());
-- 多条数据添加
insert into tb_user(user_name, user_gender, user_phone, create_time, update_time)
values ('张三', 1, '13185859696', now(), now()),
('李四', 2, '18196965252', now(), now());
-- 2.修改表中的数据
update tb_user set user_name = '王二麻子', update_time = now() where user_id = 6;
-- 3.删除表中的数据
-- 删除特定的值
delete from tb_user where user_id = 8;
-- 删除里面的所有值
delete from tb_user;
-- =========================== DQL 表中数据的操作(查) ===========================
-- 1.基本查询 select ... from ...
-- 字段查询
select user_id, user_name, user_gender, user_phone, user_status, user_password, create_time, update_time from tb_user;
-- 通配符查询 * 不推荐使用
select * from tb_user;
-- 设置别名 [as] 别名名称
select user_id as 用户ID, user_name as 姓名, user_gender 性别, user_phone 手机号, user_status 状态, user_password 密码, create_time 创建时间, update_time 更新时间 from tb_user;
-- 2.条件查询 where
-- 查询所有的男性
select * from tb_user where user_gender = 1;
-- 模糊查询 张
select * from tb_user where user_name like '张%';
-- 3.聚合函数
-- 统计数据数量 count(*)
select count(*) from tb_user;
-- 最大值 max(字段名称)
select max(user_id) ID最大值 from tb_user;
-- 最小值 min(字段名称)
select min(user_id) ID最小值 from tb_user;
-- 平均值 avg(字段名称)
select avg(user_id) ID平均值 from tb_user;
-- 求和 sum(字段名称)
select sum(user_id) from tb_user;
-- 4.分组查询 group by ... having ...
select if(user_gender=1,'男','女') 性别, count(*) from tb_user group by user_gender;
-- 5.排序查询 order by
-- 升序 asc
select * from tb_user order by create_time;
-- 降序
select * from tb_user order by create_time desc;
-- 6.分页查询 limit
select * from tb_user limit 0,10;多表设计
一对多
在多的一方添加外键,关联另外一方的主键。
-- 根据页面原型及需求文档,完成部门及员工模块的表结构设计。
-- 使用图形化工具 添加外键约束 这种添加方式又叫物理外键物理外键
- 概念:使用foreign key定义外键关联另外一张表。
- 缺点:
- 影响增、删、改的效率(需要检查外键关系)
- 仅用于单节点数据库,不适用与分布式、集群场景。
- 容易引发数据库的死锁问题,消耗性能。
逻辑外键
- 概念:在业务层逻辑中,解决外键关联。
- 通过逻辑外键,就可以很方便的解决上述问题
一对一
任意一方,添加外键,并且唯一 , 关联另外一方的主键。
-- 案例:用户与身份证信息的关系
-- 关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率
-- 实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)多对多
通过中间表来维护,中间表的两个外键,分别关联另外两张表的主键。
-- 案例:学生与课程的关系
-- 关系:一个学生可以选修多门课程,一门课程也可以供多个学生选择
-- 实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键多表查询
概念
-- 多表查询:指从多张表中查询数据
-- 笛卡尔积:笛卡尔乘积是指在数学中,两个集合(A集合和B集合)的所有组合情况。(在多表查询时,需要消除无效的笛卡尔积)
-- 多表查询 笛卡尔积
select * from tb_emp,tb_dept;
-- 多表查询
select * from tb_emp,tb_dept;
-- 多表
select * from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.dept_id;分类
// 连接查询
// 内连接:相当于查询A、B交集部分数据
// 外连接:
// 左外连接:查询左表所有数据(包括两张表交集部分数据)
// 右外连接:查询右表所有数据(包括两张表交集部分数据)
// 子查询连接查询
内连接
-- 语法:
-- 1.隐式内连接:select 字段列表 from 表1,表2 where 条件...;
select tb_emp.name 姓名, tb_dept.name 部门名称 from tb_emp,tb_dept where tb_emp.dept_id = tb_dept.dept_id;
-- 2.显式内连接:select 字段列表 from 表1 [inner] join 表2 on 连接条件...;
select tb_emp.name 姓名, tb_dept.name 部门名称 from tb_emp inner join tb_dept on tb_emp.dept_id = tb_dept.dept_id
-- 注意点: 不能查询 null 的数据外连接
-- 左外连接:select 字段列表 from 表1 left [outer] join 表2 on 连接条件...;
select e.name , d.name from tb_emp e left join tb_dept d on e.dept_id = d.dept_id ;
-- 右外连接:select 字段列表 from 表1 right [outer] join 表2 on 连接条件...
select d.name, e.name from tb_emp e right join tb_dept d on e.dept_id = d.dept_id;子查询
概述
- 介绍:SQL语句中嵌套select语句,称为嵌套查询,又称子查询。
- 形式: select * from t1 where column1 = (select column1 from t2 ...);
- 子查询外部的语句可以是 insert / update / delete / select 的任何一个,最常见的是select。
分类
- 标量子查询:子查询返回的结果为单个值
- 列子查询:子查询返回的结果为一列
- 行子查询:子查询返回的结果为一行
- 表子查询:子查询返回的结果为多行多列
标量子查询
- 子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式
- 常用的操作符:= <> > >= < <=
-- 查询 学工部 的所有员工信息
-- 步骤一: 查询 学工部 的 ID
select dept_id from tb_dept where name = '学工部';
-- 步骤二: 根据 学工部 id 查询所有的员工信息
select * from tb_emp where dept_id = 1;
-- 步骤三: 将两条数据进行合并
select * from tb_emp where dept_id = (select dept_id from tb_dept where name = '学工部');
-- 查询在 李清照 入职之后的所有员工信息
select * from tb_emp where entry_data > (select entry_data from tb_emp where name = '李清照');列子查询
- 子查询返回的结果是一列(可以是多行)
- 常用的操作符:in、not in 等
-- 查询 学工部 和 教研部 所有的员工信息
select * from tb_emp where dept_id in ( select dept_id from tb_dept where name in ('学工部' ,'教研部'))行子查询
- 子查询返回的结果是一行(可以是多列)
- 常用的操作符:=、<>、in、not in
-- === 行子查询 ===
-- 查询与 小冯 入职日期和职位相同的员工信息
-- 步骤一: 查询 小冯 的入职日期和职位信息
select entry_data , job from tb_emp where name = '小冯';
-- 步骤二: 查询与入职日期相同和职位相同的员工信息
select * from tb_emp where job = 3 and entry_data = '2001-01-09';
-- 步骤三: 将上面的步骤合并在一起
select * from tb_emp where (entry_data,job) = (select entry_data , job from tb_emp where name = '小冯');表子查询
- 子查询返回的结果是多行多列,常作为临时表
- 常用的操作符:in
-- ==== 表子查询 ====
-- 查询入职日期是 2006-01-01 之后的员工信息,及其部门名称
-- 步骤一: 查询入职日期 2006-01-01 之后的员工信息
select * from tb_emp where entry_data > '2006-01-01';
-- 步骤二: 查询上面的员工信息和部门名称
select e.* , d.name from (select * from tb_emp where entry_data > '2006-01-01') e, tb_dept d where e.dept_id = d.dept_id;案例
-- 创建对应的表结构-- 需求分析:汇总
1. 内连接
-- 隐式: select 字段列表 from 表1,表2 where 条件...;
-- 显式: select 字段列表 from 表1 [inner] join 表2 on 条件...;2. 外连接
-- 左外: select 字段列表 from 表1 left join 表2 on 条件...;
-- 右外: select 字段列表 from 表1 right join 表2 on 条件...;3.子查询( 嵌套查询 )
-- 标量子查询
-- 返回的结果是单个值( 数字、字符串、日期等). 最简单的形式
-- 列子查询
-- 返回的结果是一列( 可以为多行 )
-- 行子查询
-- 返回的结果是一行( 可以为多列 )
-- 表子查询
-- 返回的结果是多行多列, 常作为临时表事务
概念
事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
操作
- 开启事务:start transaction;/ begin;
- 提交事务:commit;
- 回滚事务:rollbadk;
-- 开启事务
start transaction;
-- 多条SQL语句
...
-- 提交事务
commit;
-- 回滚事务
rollback;四大特性( ACID )
原子性
事务是不可分割的最小单元,要么全部成功,要么全部失败
一致性
事务完成时,必须使所有的数据都保持一致状态
隔离性
数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性
事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
索引
介绍
索引(index)是帮助数据库高效获取数据的数据结构
优点:
- 提高数据查询的效率,降低数据库的IO成本。
- 通过索引列对数据进行排序,降低数据排序的成本, 降低CPU消耗。
缺点:
- 索引会占用存储空间
- 索引大大提高了查询效率,同时却也降低了insert、 update、delete的效率。
结构
MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的B+Tree结构组织的索引。
B + Tree ( 多路平衡搜索树 )
- 每一个节点,可以存储多个key(有n个key,就有n个指针)
- 所有的数据都存储在叶子节点,非叶子节点仅用于索引数据。
- 叶子节点形成了一颗双向链表,便于数据的排序及区间范围查询
语法
创建索引
create [unique] index 索引名 on 表名(字段名...);查看索引
show index from 表名;删除索引
drop index 索引名 on 表名;
注意事项:
- 主键字段,在建表时,会自动创建主键索引。
- 添加唯一约束时,数据库实际上会添加唯一索引。
