SQL语句分类

128 阅读10分钟

数据库设计-DDL

  • DDL英文全称是Data Definition Language(数据定义语言),用来定义数据库对象(数据库、表)。
  • DDL中数据库的常见操作:查询、创建、使用、删除。

项目开发流程

微信截图_20240827101338.png

针对数据库来说,主要包括三个阶段:

  • 数据库设计阶段:参考页面原型及需求文档设计数据库表结构
  • 数据库操作阶段:根据业务功能的实现,编写SQL语句对数据表中的数据进行增删改查操作
  • 数据库优化阶段:通过数据库的优化来提高数据库的访问性能。优化手段:索引、SQL优化、分库分表等

数据库操作

SQL语句说明
show databases;查询所有数据库
select database();查询当前数据库
use 数据库名;使用指定数据库
create database 数据库名;创建数据库
create database if not extists 数据库名;数据库不存在,则创建该数据库;如果存在则不创建
drop database 数据库名;删除指定数据库
drop database if exists 数据库名;如果数据库存在,再执行删除,否则不执行删除
use 数据库名;使用指定数据库

注意:

  • 在同一个数据库服务器中,不能创建两个名称相同的数据库。
  • 如果删除一个不存在的数据库,将会报错。
  • 语法中的database也可以替换schema。

表操作

创建

语法
create table 表名(
字段1 字段1类型 [约束] [comment 字段1注释 ],
字段2 字段2类型 [约束] [comment 字段2注释 ],
......
字段n 字段n类型 [约束] [comment 字段n注释 ]
) [ comment 表注释 ];
约束

微信截图_20240827103937.png

微信截图_20240827104027.png

主键auto_increment:

  • 每次插入新的记录时,数据库自动生成id字段(主键)下的值。
  • 具有auto_increment的数据是一个整数序列开始增长(从一开始自增)
数据类型

MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。

数值类型:

微信截图_20240827110117.png

字符串类型:

微信截图_20240827110213.png

日期类型:

微信截图_20240827110246.png

charvarchar都可以描述字符串,char是定长字符串,指定长度多少,就占用多少个字符串,和字段值的长度无关。而varchar是变长字符串,指定的长度为最大占用长度。相对来说,char的性能可能会更高些。

查询

  • 查看指定的表结构:desc 表名;
  • 查询指定表的建表语句:show create table 表名;

修改

添加字段

alter table 表名 add 字段名 字段类型(长度) [commnet 注释] [约束];

修改数据类型
  • alter table 表名 modify 字段名 新数据类型(长度);
  • alter table 表名 change 旧字段名 新字段名 字段类型(长度) [commnet 注释] [约束];
删除字段

alter table 表名 drop 字段名;

修改表名

rename table 表名 to 新表明;

删除

drop table [ if exists ] 表名;

数据库操作-DML

DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。

增加(insert)

向指定字段添加数据

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, ...);

insert操作的注意事项:

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

修改(update)

update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [where 条件] ;

删除(delete)

delete from 表名 [where 条件] ;

数据库操作-DQL

DQL英文全称是Data Query Language(数据查询语言),用来查询数据库表中的记录。

查询关键字:SELECT

查询操作是所有SQL语句当中最为常见,也是最为重要的操作。在一个正常的业务系统中,查询操作的使用频次是远高于增删改操作的。而在这个查询操作过程中,还会涉及到条件、排序、分页等操作。

语法

微信截图_20240827113726.png

基本查询

查询多个字段

select 字段1, 字段2, 字段3 from 表名;

查询所有字段(通配符)

select * from 表名;

设置别名

select 字段1 [ as 别名1 ] , 字段2 [ as 别名2 ] from 表名;

去除重复记录

select distinct 字段列表 from 表名;

条件查询

select 字段列表 from 表名 where 条件列表;

比较运算符

微信截图_20240827133932.png

等于运算符
  • 等于运算符判断等号两边的值,字符串或者表达式是否相等,如果相等则返回1,不相等则返回0。
  • 在使用等号运算符时,遵循如下规则:
    • 如果等号两边都为字符串时,则MySQL会按照字符串进行比较,其比较的是每个字符串中字符的ANSCII编码是否相等
    • 如果等号两边都是整数,则MySQL会按照整数比较两个值的大小
    • 如果等号两边一个是整数,一个是字符串,则MySQL会先将字符串转换为数字进行比较
    • 如果等号两边有一个为NULL,则比较结果为NULL
安全等于运算符(<=>)

使用安全等于运算符时,两边的操作数值都为NULL时,返回结果为1而不是NULL,其中一边为NULL时,返回结果是0而不是NULL,其他返回结果与等于运算符相同。

不等于运算符

不等于运算符,用于判断两边的数值,字符串或表达式的值是否不相等,如果相等返回1不相等则返回0。不等于运算符不能判断NULL值,如果两边的值有任意一个为NULL,或两个都为NULL,则结果为NULL。

逻辑运算符

微信截图_20240827134106.png

逻辑与运算符

逻辑与运算符是当给定的所有值均为非0值,并且都不为NULL时,返回1;当给定的一个值或多个值为0时则返回0;否则返回NULL。

逻辑非运算符

逻辑非运算符表示当给定的值为0时返回1,当给定的值为非0值时返回0,当给定的值为NULL时返回NULL。

逻辑或运算符

逻辑或运算符是当给定的值都不为NULL时,并且有任何一个值为非0值时,则返回1,否则返回0;当一个值为NULL,并且另外一个值为非0值时,返回1否则返回NULL;两个值都为NULL时返回NULL。

逻辑异或运算符

逻辑异或运算符,当给定的值中任何一个值为NULL时返回NULL;如果两个非NULL值,两个都是0或者都不等于0时返回0如果一个值为0,另外一个值不为0,则返回1。

运算符的优先级

运算符的优先级

聚合函数

之前我们做的查询都是横向查询,就是根据条件一行一行的进行判断,而使用聚合函数查询就是纵向查询,它是对一列的值进行计算,然后返回一个结果值。(将一列数据作为一个整体,进行纵向计算)

  • 语法:select 聚合函数(字段列表)from 表名;
  • 注意:聚合函数会忽略空值,对NULL值不作为统计。

常用的聚合函数: 微信截图_20240827134707.png

分组查询

分组:按照一列或者某几列,把相同的数据进行合并输出。

select 字段列表 from 表名 [where 条件] group by 分组字段名 [having分组后过滤条件];

注意事项:

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
  • 执行顺序:where > 聚合函数 > having

where与having区别(面试题)

  • 执行时机不同:where是分组之前进行过滤的,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
  • 判断条件不同:where不能对聚合函数进行判断,而having可以。

排序查询

排序在日常开发中是非常常见的一个操作,有升序排序,也有降序排序。

select 字段列表 from 表名 [where 条件列表] [group by 分组字段 ] order by 字段1 排序方式1 , 字段2 排序方式2 … ;

排序方式:

  • ASC:升序(默认值)
  • DESC:降序

分页查询

分页操作在业务系统开发时,也是非常常见的一个功能,日常我们在网站中看到的各种各样的分页条,后台也都需要借助于数据库的分页操作。

select 字段列表 from 表名 limit 起始索引, 查询记录数;

注意事项:

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

好处:约束返回结果的数量可以减少数据表的网络传输量,也可以提升查询效率。如果我们知道返回结果只有1条,就可以使用limit 1,告诉select语句只需要返回一条记录即可,这样的好处就是select不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。

多表设计

由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

  • 一对多(多对一):在数据库表中多的一方,添加字段,来关联属于一这方的主键。
  • 多对多:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。
  • 一对一:一对一关系表在实际开发中应用起来比较简单,通常用来做单表的拆分,也就是将一张大表拆分成两张小表,将大表中的一些基础字段放在一张表中,将其他的字段放在另外一张表当中,以此来提高数据的操作效率。

外键约束

  • 外键约束:让两张表的数据建立连接,保证数据的一致性和完整性。
  • 对应的关键字:foreign key
语法

-- 创建表时指定
create table 表名(字段名 数据类型,...[constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名));

-- 建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);

物理外键与逻辑外键
  • 物理外键:使用foreign key定义外键关联另外一张表。
  • 逻辑外键:在业务层逻辑中,解决外键关联。通过逻辑外键,就可以很方便的解决上述问题。

物理外键缺点:

  • 影响增、删、改的效率(需要检查外键关系)
  • 仅用于单节点数据库,不适用于分布式、集群场景。
  • 容易引发数据库的死锁问题,消耗性能。

在现在的企业开发中,很少会使用物理外键,都是使用逻辑外键。甚至在一些数据库开发规范中,会明确指出禁止使用物理外键foreign key。