【MySQL】详细版SQL用法 (含多表查询、约束、触发器)

  • DDL:用于定义和管理数据库结构(如创建、修改、删除表等)
  • DML:用于对表中的数据进行增删改
  • DQL:用于查询数据

DDL

数据库操作

  1. 查询所有的数据库:
show databases;
  1. 查询当前数据库是哪个:
select database();
  1. 创建:
create database [if not exists] 数据库名 [default charset 字符集]collate 排序规则)
  1. 删除:
drop database [if exists] 数据库名;
  1. 使用某个数据库:
use 数据库名

表操作

  1. 查询当前数据库的所有表:
show tables;
  1. 查询表结构:
desc 表名;
  1. 创建:
create table (
	字段1  字段1类型 (comment 字段 1 注释),
    字段2  字段2类型 (comment 字段 2 注释),
    ...... 
)(comment 表注释);
create table 表名 as select *from 另一张表名   ----- 复制另一张表
  1. 添加字段:
alter table 表名 add 字段名 类型 (长度) [comment 注释] [约束];
  1. 修改数据类型:
alter table 表名 modify 字段名 新数据类型 (长度);
  1. 修改字段名和字段类型:
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束];
  1. 删除字段:
alter table 表名 drop 字段名;
  1. 修改表名:
alter table rename to 新表名;
  1. 删除表:
drop table [if exists] 表名;
  1. 删除指定表,并重新创建表:
truncate table 表名;

DML

  1. 给指定字段添加数据:
insert into 表名(字段1, 字段2...) values(1,2...);
  1. 给全部字段添加数据:
insert into 表名 values(1,2...);
  1. 批量添加:
insert into 表名(字段1, 字段2...) values(1,2...), (1,2),...insert into 表名 values(1,2...), (1,2),...
  1. 修改数据:
update 表名 set 字段名1 =1, 字段名2 =2, ...[where 条件];
  1. 删除数据:
delete from 表名 [where 条件];

DQL

select 查询

  1. 查询多个字段:
select 字段1, 字段2, .... from 表名;
select *from 表名;
  1. 设置别名:
select 字段1 [as 别名1], 字段2[as 别名2],...from 表名;
  1. 去除重复记录:
select distinct 字段列表 from 表名;
  1. 条件查询:
select 字段列表 from 表名 where 条件列表;
  • like 模糊查询 _,一个下划线表示一个占位符
  • 如选择名字为两个字的,where name like '__ __';
  • '%' 的使用,如查询身份证号最后一位为 X 的,where id like '%X'; 这个是不管前面为多少,只管末位为 X
  1. 分组查询:
select 字段列表 from 表名 [where 条件] group by [having 分组过滤后的条件];

注意:

  • where 是分组之前进行过滤,不满足 where 条件的,不参与分组,而 having 是分组之后对结果进行过滤。
  • where 不能对聚合函数进行过滤,而 having 可以
  • 执行顺序:where > 聚合函数 > having
  • 分组后,一般查询的字段为聚合函数和分组的字段,其他字段无意义
  1. 排序查询:
select 字段列表 from 表名 order by 字段1 排序方式, 字段2 排序方式;

注意:
降序:desc,升序:asc,升序是默认,可以不写

  1. 分页查询:
select 字段列表 from 表名 limt 起始索引, 查询记录数;
  • 起始索引从 0 开始,起始索引 =(查询页码 - 1) * 每页显示记录数
  • 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10

聚合函数

  • count —> 统计数量
  • max —> 最大值
  • min —> 最小值
  • avg —> 平均值
  • sum —> 求和
select count (id) from 表名;
select count (*) from 表名;
  • 这是作用于列的
  • null 不参与聚合函数运算

约束

约束条件

约束描述关键字
非空约束限制该字段的数据不能为nullnot null
唯一约束保证该字段的所有数据都是唯一、不重复的unique
主键约束主键是一行数据的唯一标识,要求非空且唯一primary key
默认约束保存数据时,如果未指定该字段的值,则采用默认值default
检查约束保证字段值满足某一个条件check
外键约束用来让两张表的数据之间建立连接欸,保证数据的一致性和完整性foreign key
自增自动增长auto_increment

外键约束

  1. 添加外键:
create table 表名 (
   字段名   数据类型
   ..........
  [constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名)
);
或者
alter table 表名 add constraint 外键名称 foreign key [外键名称] references 主表[主表列名];
  1. 删除外键:
alter table 表名 drop foreign key 外键名称;
  1. 外键更新和删除行为:
行为说明
No action在父表中删除/更新对应记录时,首先检查记录是否有对应外键,如果有则不允许删除/更新
Restrictno action 一致 Cascade
cascade在父表中删除/更新对应记录时,首先检查记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录
set null在父表中删除对应记录时,首先检查记录是否有对应外键,如果有则设置子表中该外键值为null(要求该外键允许为空)
set default父表有变更时,设置子表中外键值为一个默认值(innodb不支持)
alter table 表名 add constraint 外键名称 foreign key (外键字段) references 主表名(主表字段名 on update cascade on delete cascade;

主键约束

  1. 创建:
create table 表名 (
   字段名   数据类型
   ..........
   constraint [主键名称] primary key (字段1,字段2...)
);
或者
alter table 表名 add constraint 主键名称  primary key(字段);
  1. 删除:
alter table 表名 drop primary key;

唯一约束

  1. 创建:
create table 表名 (
   字段名 数据类型
   ..........
  constraint [名称] unique(字段)
);
或者
alter table 表名 add constraint 名称 unique(字段);
  1. 删除:
alter table 表名 drop index 名称;

检查约束

  1. 创建:
create table 表名 (
   字段名   数据类型
   ..........
  constraint [名称] check(age>1 and age<20)
);
或者
alter table 表名 add constraint 名称 check(age>1 and age<20);
  1. 删除:
alter table 表名 drop constraint 名称;

触发器

  1. 创建:
create trigger 触发器名字
  before/after insert/update/delete
  on 表的名字 for each row
begin
  具体往哪张表插入什么数据
end;
  1. 查看触发器:
show triggers;
  1. 删除:
drop trigger 触发器的名字;

多表查询

连接

  1. 内连接:
  • 隐式内连接:
select 字段列表 from1,2 where 条件;
  • 显示内连接:
select 字段列表 from1 [inner] join2 on 连接条件;
  1. 外连接:
  • 左外连接:表 1 为全部信息显示
select 字段列表  from1 left [outer] join2 on 条件;
  • 右外连接:表 2 为全部信息显示
select 字段列表 from1 right [outer] join2 on 条件;
  1. 自连接:
select 字段列表  from  表A  别名A  join 表A 别名B on 条件;

查询

  1. 联合查询:
select 字段列表 from 表A
union [all]           -----------------加了 all全部查询,没加 all,会去重
select 字段列表 from 表B;

注意:联合查询的列数需要保持一致,还有字段类型也要保持一致

  1. 子查询:
  • 标量子查询:
select *from 表名 where 字段名 = (select *from 表名 where 条件);
  • 列子查询:
select *from 表名 where 字段名 in (select *from 表名 where 条件);
操作符描述
in在指定的集合范围内选择,多选一
not in不在指定范围内
any有任意一个满足即可
Some与 any 同理
all所有值都必须满足
<>不等于
  • 行子查询:示例:
select *from 表名 where (id,name)=(select id,name from 表名 where 条件);
  • 表子查询:返回的是多行多列,常用 in
select e.*, d.* from (select *from emp where 条件) e left join depet_id on e.dept._id=d.id;

事务

  • 概念:是一组操作的集合,不可分割,事务会把所有的操作作为一个整体一起向系统提交或撤销操作的请求,即这些操作要么同时成功,要么同时失败
  • 四大特性:
名称描述
原子性事务是不可分割的最小单元,要么全部成功,要么全部失败
一致性事务完成时,必须使所有的数据都保持一致的状态
隔离性数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性事务一旦提交或回滚,它对数据库中的数据改变就是永久的
  • 并发事务问题
问 题描 述
脏读一个事务读到另一个事务还没有提交的数据
不可重复读一个事务先后读取同一条记录,但两次读取得数据不同
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在
  • 事务的隔离级别
隔离级别脏读不可重复读幻读
read uncommitted
read committed×
repeatable read (默认)××
serializable×××
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值