【一】数据库基础:SQL语句、函数、约束、多表查询、事务

一、SQL

(一)、DDL

DDL:数据定义语言

1、数据库操作

sql 复制代码
#查询所有数据库
show databases;
#查询当前数据库
select database();
#创建
create datebase [if not exist] 数据库名[default charset 字符集][collate 排序规则];
#删除
drop database [if exist] 数据库名;
#使用
use 数据库名;

2、表操作

前提是要进入当前数据库

sql 复制代码
#查询**当前数据库**所有表
show tables;
#查询表结构
desc 表名;
#查询指定表的建表语句
show create table 表名;
sql 复制代码
# 创建
create table 表名(
字段1 字段1类型 [comment 字段1注释],
字段2 字段2类型 [comment 字段2注释],
......
) [comment 表注释];

#[...] 为可选参数,最后一个字段后面没有,逗号

字段类型

char(10):固定十位,当输入2位后,其他用0补齐,性能好

varchar(10):最长10位,根据内容计算占用空间,性能差

sql 复制代码
#修改表
#添加字段
alter table 表名 add 字段名 字段类型(长度) [comment 注释] [约束];
#修改字段
#修改数据类型
alter table 表名 modify 字段名 新数据类型(长度);
#修改字段名和字段类型
alter table 表名 change 旧字段名 新字段名 类型(长度)[comment 注释] [约束]
#删除字段
alter table 表名 drop 字段名;
#修改表名
alter table 表名 rename to 新表名;
#删除表
drop table [if exists] 表名;
#删除指定表,并重新创建
truncate table 表名;

(二)、DML

DML:Data Manipulation Language (数据操作语言),对数据库中表的记录进行增删改。

1、insert_添加数据

sql 复制代码
#给指定字段添加数据
insert into 表名(字段名1,字段名2....)values(值1,值2...);
#给所有字段添加数据
insert into 表名 values (值1 , 值2....);
#批量插入
insert into 表名(字段名1,字段名2....)values(值1,值2...),(值1,值2...),(值1,值2...)..;
insert into 表名 values (值1 , 值2..),(值1 , 值2....),...;

注意:

  • 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
  • 字符串和日期型数据应该包含在引号中。
  • 插入的数据大小,应该在字段的规定范围内

2、update_修改数据

sql 复制代码
#没有条件时,代表修改整张表的数据
update 表名 set 字段名1 = 值1,字段名2 = 表2,... [where 条件];

3、delete_删除数据

sql 复制代码
delete from 表名 [where 条件];
#delete的条件可有可无,没有时代表删除整张表啊数据
#delete不能删除某一个字段的值(可以用update)

(三)、DQL

DQL:Data Query Language(数据查询语言)

1、基本查询

sql 复制代码
#查询多个字段
select 字段1,字段2....from 表名
select * from 表名;
#设置别名
select 字段1[as 别名],字段2[as 别名] ...from 表名;
#去重
select distinct 字段列表 from 表名;

2、条件查询

sql 复制代码
select 字段列表 from 表名 where 条件列表;
#占位符 ------ %
#查询姓名为2个字的员工
select * from emp where name    like '__';
#查询身份证号最后一位为X的员工
select * from wmp where idcard like '%X'

条件:

3、聚合函数

将一列数据作为一个整体,进行纵向计算

注意:所有null值不参加聚合运算

sql 复制代码
select 聚合函数(字段列表) from 表名;

4、分组查询

sql 复制代码
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件]

where和having区别

where是分组之前进行过滤,不满足where条件,不参与分组

having是分组之后对结果进行过滤

where不能对聚合函数进行判断,having可以

5、排序查询

关键字:asc(升序,可省略) desc(降序)

sql 复制代码
select 字段列表名 from 表名 order by 字段1 排序方式1,字段2 排序方式2;

6、分页查询

sql 复制代码
select 字段列表 from 表名 limit 起始索引,查询记录数;

注意

  • 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
  • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
  • 如果查询的是第一页数据,起始索引可以省略,直接简写为limit10。

(四)、DCL

DCL:Data Control Language,管理用户控制数据库的访问

1、管理用户

2、权限控制

常用权限:

二、函数

函数是指一段可以直接被另一段程序调用的程序或代码。

1、字符串函数

sql 复制代码
select 函数名(参数);
#企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0。比如:1号员工的工号应该为00001。
update emp set workno = lpad(workno,5,'0');

2、数值函数

sql 复制代码
#生成随机六位数验证码
select lapd(round(rand() * 1000000,0),6,0);

3、日期函数

4、流程函数

三、约束

约束是作用于表中字段上 的规则,用于限制存储在表中的数据,保证数据库中数据的正确、有效和完整性。

sql 复制代码
create table user(
id int primary key auto_increment comment '主键';
name varchar(10) not null unique comment'姓名';
age int check(age > 0 && age < 120) comment'年龄';
status char(1)  default '1' comment '状态';
gender char(1) comment'性别'
)comment'用户表';
sql 复制代码
#添加外键
create table 表名(
字段名 数据类型,
..
[constraint][外键名称]foreign key(外键字段名) references 主表(主表列名)
);
#或者
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);
#删除外键
alter table 表名 drop foreign key 外键名称;

外键删除更新行为:

sql 复制代码
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主键列表名) on update 约束 on delete 约束;

四、多表查询

表关系:

  • 一对一:多用于单表拆分,将一张表基础字段放在另一张表中,详情字段放在另一张表中,在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(unique)
  • 一对多:在多的一方建立外键,指向另一方的主键
  • 多对多:需要中间表,中间表至少包含两个外键,分别关联两方主键。

笛卡尔积:集合A和集合B的所有组合情况,多表查询时需要消除无效的笛卡尔积

(一)、连接查询

1、内连接

内连接:A、B交集部分数据。

sql 复制代码
# 隐式内连接
select 字段列表 from 表1,表2 where 条件;
# 显式内连接
select 字段列表 from 表1 [inner] join 表2 on 连接条件...;

注意:

  1. 内连接两种写法性能、结果完全相同,只是语法层面不同
  2. 新项目一律使用显式 INNER JOIN + ON
  3. 隐式逗号写法属于老旧语法,可读性差,容易笛卡尔积,只在老项目遗留代码会见到;
  4. ONWHERE的条件位置,仅对外连接生效,对内连接没有区别

2、外连接

sql 复制代码
#左外连接:查询左表所有数据以及两张表交集部分
select 字段列表 from 表1 left [outer] join 表2 on 条件;
#右外连接:查询右表所有数据以及两张表交集部分
select 字段列表 from 表1 right [outer] join 表2 on 条件;

注意:

  1. ON:关联阶段过滤 ,是两张表做连接时的条件,只影响被连接的次表 ,驱动表的数据不会丢失
  2. WHERE:连接完成后过滤 ,是对连接之后的完整结果集做筛选,不满足条件的整行直接被删掉,会丢失左表数据
  3. 表和表的关联字段,必须写在 ON
  4. 外连接,想保住左表全部数据,右表的筛选条件放 ON
  5. 条件放WHERE,就代表可以接受左表数据被删掉。
  6. 只有外连接才有这个差异;内连接 ON 和 WHERE 结果完全一致

3、自连接

当前表与自身表的连接查询,自连接必须使用表别名。自连接查询可以是内连接查询也可以是外连接查询。

sql 复制代码
SELECT 字段列表 from 表A 别名A , 表A 别名B where 条件;
SELECT 字段列表 from 表A 别名A join 表A 别名B on 条件;

4、联合查询

将多次查询的结果合并起来形成一个新的查询结果集。

sql 复制代码
查询语句1 union[all] 查询语句2;

注意:

  • 对于联合查询的多张表的列数 必须保持一致字段类型 也需要保持一致
  • unionall会将全部 的数据直接合并 在一起,union会对合并之后的数据去重

(二)、子查询

SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。

子查询外部的语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个

sql 复制代码
select * from t1 where column1  = (SELECT column1 from t2);

根据查询结果不同可以分为:

  • 列子查询(子查询结果为一列)
  • 行子查询(子查询结果为一行)
  • 表子查询(子查询结果为多行多列)
  • 标量子查询(子查询结果为单个值)

根据子查询的位置分为:where 之后、from之后、select之后。

1、标量子查询

子查询返回的结果是单个值 (数字、字符串、日期等),最简单的形式,这种子查询成为标量子查询。

常用操作符:= <> > >= < <=

2、列子查询

子查询返回的结果是一列 (可以是多行),这种子查询称为列子查询

常用操作符:

3、行子查询

子查询返回的结果是一行(可以是多列) ,这种子查询称为行子查询

常用的操作符:= <> IN NOT IN

4、表子查询

子查询返回的结果是多行多列 ,这种子查询称为表子查询。常出现在from之后

常用的操作符:IN

五、事务

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 默认MysQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

sql 复制代码
# 查看设置事务提交方式
select @@autocommit;
#设置为手动提交
set @@autocommit = 0;
#手动提交
commit;
#回滚
rollback;

#========方式二,不修改提交方式===============
#开启事务
start transaction;
#或
begin;
#提交
commit;
#回滚
rollback;

事务四大特性:

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

并发事务问题:

事务隔离级别:解决并发事务问题

sql 复制代码
#查看事务隔离级别
select @@transaction_isolation;
#设置事务隔离级别 session会话级别针对当前客户端窗口有效,global 针对所有有效
set [session|global] transaction isolation level{read uncommited | read comminted | repeatable read | serializable}
相关推荐
Wang's Blog1 小时前
PostgreSQL笔记58: 性能监控工具全景——从内核指标到操作系统诊断
数据库·笔记·postgresql
mengge.cloud1 小时前
0823Keepalived + LVS(DR) + MariaDB主主 小白完整实战教程
linux·运维·网络·oracle·负载均衡·mariadb·lvs
智购科技智能售货柜10 小时前
2026自动售货机整机可靠性测试:从高低温交变到EMC电磁兼容的认证工程实践~YH
运维·服务器·数据库·人工智能·物联网
ltl10 小时前
RocksDB 架构演进:相对 LevelDB 的 diff 地图
数据库
ltl10 小时前
存储读取性能优化:索引、Bloom Filter 与读放大
数据库
xier_ran14 小时前
【infra之路】GPU 存储层次总结:L1 / L2 / HBM
java·网络·数据库
山甫aa15 小时前
Javaweb---MyBatis增删改查
java·数据库·后端·mybatis·springboot
其实防守也摸鱼16 小时前
接口审计:从原理到实践的万字深度指南
数据库·安全·自动化·github·copilot