Bootstrap

SQL基础语法介绍-基于MySQL

一、SQL分类

根据不同SQL指令对数据库操作的不同,可以将SQL指令分为以下四类:

  • DDL Data Defintion Language 数据定义语言

    • 用于对数据库对象(数据库,数据表,视图,索引)的增删改操作
  • DML Data Manipulation Language 数据操作语言

    • 用于对数据表中的数据的增删改操作
  • DQL Data Query Language 数据查询语言

    • 用于对数据库表中的数据的查询操作
  • DCL Data Control Language 数据控制语言

    • 用于事务管理等控制性操作

二、SQL语法

1.数据库字段类型

数据库表中数据列支持的数据存储类型

1.1.数值类型
类型内存空间范围说明
tinyint1byte有符号-128~127
无符号 0~255
特小型整数(年龄)
smallint2byte(16bit)有符号-32768~32767
无符号 0~65535
小型整数
mediumint3byte有符号-231~231-1
无符号 0~2^31-1
中型整数
int/integer4byte整数
bigint8byte大型整数
float4byte单精度
double8byte双精度
decimal第一个参数*2decimal(10,2)数值位10位,小数位有两位
1.2 字符类型

存储字符序列的类型

类型长度说明
char0~255字节定长字符串,最多存放255个字节;char(n),自动补齐位数
varchar0~65536字节可变长度字符串,一个汉字占用两个字节
tinyblob0~255字节存储二进制字符串
blob0~65535字节存储二进制字符串(图片,音频)
mediumblob0~1677215字节存储二进制字符串
longblob0~4294967295存储二进制字符串
tinytext0~255文本数据(字符串)
text0~65535文本数据(字符串)
mediumtext0~1677215文本数据(字符串)
longtext0~4294967295文本数据(字符串)
1.3 日期类型

数据库日期类型

类型格式说明
date2024-01-01日期,存放 年-月-日
time18:01:10时间,存放 时分秒
year2024年份
datetime2024-01-08 18:01:18年月日,时分秒
timestamp20240108 180118年月日时分秒(时间戳)

2.字段约束

2.1约束介绍

在创建表时,对表中指定数据列的数据的限制性约束,其目的:

  • 保证数据有效性
  • 保证数据完整性
  • 保证数据正确性

常见的SQL语法约束;

  • 非空约束(not null):限制此列值必须提供,不能为null
  • 唯一约束(unique):此列的值需要具有唯一性,不能重复
  • 主键约束(primary key):非空+唯一,能够唯一标识数据表中的一条数据
  • 外键约束(foreign key):建立不同表之间的关联关系
2.2 非空约束(not null)

限制数据表中此列的值必须提供

create table `students`(
  `stu_num` char(8) not null unique,
  `stu_name` varchar(20) not null  ##非空
 );
2.3 唯一约束(unique)

在表中的多条数据,此列的值不能重复

create table `students`(
  `stu_num` char(8) not null,
  `stu_tel` char(11) unique   ##唯一约束
 );
2.4 主键约束(primary key)

主键是数据表中记录的唯一标识(非空+唯一)

一张数据表中只能有**一个主键**,但是主键是可以一个字段,也可以是多个字段组合的联合主键

##方式一 主键声明
create table `students`(
  `stu_num` char(8) primary key,  ##主键约束
  `stu_tel` char(11) unique   
 );
##方法二 主键声明
create table `students`(
  `stu_num` char(8),  
  `stu_tel` char(11) unique,
   primary key(`stu_num`);  ##主键约束
 );
##方式三	在已有的数据表中增加主键约束
alter table students add primary key(stu_num);

删除主键约束

alter table students drop primary key;
2.5 自增长主键

自增长主键设置以后,新增数据时,主键数据自动增长填充,无需提供数据。

create table `students`(
  `stu_id` int primary key auto_increment,
  `stu_num` char(8),  
  `stu_tel` char(11) unique;
 );

注意:

  • 自增长主键的字段类型需要时int类型

  • 自增长主键从1开始,每增加一天数据,主键+1;如果中间有行数据被删除,自增长主键只会继续新增,不会重复新增,也就是生成过的主键值,即使删除了,也不会重复生成。

    (自增长主键只保证唯一性,不保证连续性)

2.6 联合主键

联合主键:将数据表中的多列组合在一起设置为的主键

create table `students`(
  `stu_num` char(8),  
  `stu_tel` char(11) unique,
   primary key(`stu_num`,`stu_tel`);  ##联合主键
 );

实际业务开发中,联合主键的使用并不多,如果数据表中没有明确的主键值,可以额外增加一个ID字段作为主键。

3.DDL 数据定义语言

3.1 对库的操作:

对数据库的增删改查操作

创建数据库

create database 库名;

create database db_test;

## 优化:创建数据库,增加判断数据库是否存在 is not exists
create database if not exists db_test;

## 优化:增加数据库字符集设置
create database if not exists ba_test character set utf8;

查询数据库

查询所有数据库

show databases;

# #查询全部数据库
show databases;

## 查询指定数据库的创建SQL指令
show create database db_test;

修改数据库

修改数据库字符集

alter database 库名 character set 字符编码集;

alter database db_test character set gbk;

##查询字符集修改是否成功
show create database db_test;

删除数据库

删除数据库,同时对数据库中的表,数据同步删除

drop database 库名;

drop database db_test;

## 优化:判断是否存在数据库,再进行删除
drop database if exists db_test;
3.2 对表的操作

创建数据库表

使用create table 表名(字段名 字段类型(长度),是否为空,是否唯一);

 create table `students`(
  `stu_num` char(8) not null unique,
  `stu_name` varchar(20) not null,
  `stu_denger` char(2) not null,
  `stu_age` int not null,
  `stu_tel` char(11) not null unique,
  `stu_qq` varchar(11) unique
 );

查询数据库表

查询数据库向下所有的表

show tables;

show tables;

查询表结构

desc 表名;

desc students;

删除数据表

drop table students;
## 增加判断,存在再删除
drop table if exists students;

修改数据表

修改表名 alter table 表名 rename to 新表名;

alter table students rename to stud;

修改数据库表字符集 表字符集默认与数据库字符集一致

alter table 表名 character set 字符集编码

alter table students character set gbk;

新增表字段

alter table 表名 add 新增字段名(字段长度);

alter table students add stu_remark varchar(200);

修改表的字段名和字段类型

alter table change ;

alter table students change stu_remark stu_desc text;

修改字段类型

alter table modify ;

删除表字段

alter table drop ;

alter table students drop stu_desc;

4.DML 数据操纵语言

4.1 增 insert

用于完成对数据表中数据的操作

insert into (columnName1,columnName2…) values(value1,value2…);

INSERT into students(stu_num,stu_name,stu_denger,stu_age,stu_tel,stu_qq) values(`1`,`小明`,``,`18`,`13600000002`,`578767873`);
4.2 删 delete

删除数据表中符合条件的数据

delete from where conditions;

DELETE from students where stu_num = 2;

注意:

  • delete 语句是删除数据库表中的数据,如果不加where条件,将会删除整表数据,但表依然存在,表结构依然存在。
  • drop table 是从数据库删除数据表,表结构删除,数据库中不在存此数据表。
  • drop database 是直接删除此数据库。
4.3 改 update

对数据库表中已存在的数据进行修改操作

update set columnName = value where conditions;

UPDATE students SET stu_name = "蔡文姬" WHERE stu_num = 1;

注意:update操作,一定要注意where条件的设定,如果不加where条件,将进行全表修改。

5.DQL数据查询语言

从数据库表中提取满足条件的记录

  • 单表查询
  • 多表联合查询
5.1 基础查询 select

SELECT stu_name from ; #查询展示指定列信息

SELECT * from ; ##全表查询

SELECT * from where conditions; ##条件查询

SELECT stu_name from students; #查询展示学生姓名列信息
SELECT * from students;##全表查询
SELECT * from students where stu_num = 1;##条件查询,查询学号为1的学生信息
5.2 where 子句

用where子句,加上查询条件,筛选所需要的数据;

5.2.1条件关系运算符
## 等于 =
select * from students where stu_num = 1;

## 不等于 !=	<>
select * from students where stu_num != 1;
select * from students where stu_num <> 1;

## 大于 >
select * from students where stu_age > 18;

## 小于	<
select * from students where stu_age < 18;

## 大于等于 >=
select * from students where stu_age >= 18;

## 小于等于	<=
select * from students where stu_age <= 18;

## 区间查询	between...and
select * from students where stu_age between 16 and 20;
5.2.2条件逻辑运算符

在where子句中,可以将多个条件通过逻辑运算(and or not)进行连接,通过多条件筛选需要的数据。

## and并且	 多条件联合查询,同时满足的结果
select * from students where stu_denger = `` and stu_age > 18;

## or 或者	多条件联合查询,至少满足其中一个条件的结果
select * from students where stu_denger = `` or stu_age > 18;

## not 取反
select * from students where stu_age not between 16 and 20;##年龄不在16~20之间的数据
5.2.3 LIKE 模糊查询

通过like关键字来实现模糊查询

select * from where columnName like ‘reg’;

  • 在like关键字后面的 reg表达式中
  • %,表示任意多个字符,
    • %a% 表示字段里面包含a的所有字段;
    • a% 表示第一个字母为a的字段;
    • %a 表示最后一个字母为a的字段;
  • _ ,表示任意一个字符,**_a%**表示第二个字母为a的所有字段;
##	查询学生手机号码中包含8的数据 %8%
select * from students where stu_tel like `%8%;

##	查询学生手机号码中136开头的数据 136%
select * from students where stu_tel like `136%`;

##	查询学生手机号码中尾号是9的数据 %9
select * from students where stu_tel like `%9`;

##	查询学生手机号码中第二位是3的数据 _3%
select * from students where stu_tel like `_3%`;

5.3 查询结果处理
5.3.1 计算列

对查询结果进行一定运算后展示

## 通过年龄,计算出生年份  (2024 - stu_age)
SELECT stu_name, (2024 - stu_age) as birthYear from students WHERE stu_num = 1;
5.3.2 字段别名

对查询字段进行别名展示,在查询字段用as 关键字取别名

SELECT stu_name as 学生姓名, (2024 - stu_age) as 学生出生年份 from students WHERE stu_num = 1;

在这里插入图片描述

5.3.3 去重

查询结果去重 distinct

## 查询表中年龄,并去重
SELECT DISTINCT stu_age from students ;
5.4 order by 排序

将查询的满足条件的记录,进行升序或降序的排列展示,

关键字 order by排序,

asc-升序(默认);

desc-降序

单字段排序

##年龄大于10岁的学生,按年龄由小到大的升序方式展示
SELECT * from students where stu_age >10 ORDER BY stu_age;

##年龄大于10岁的学生,按年龄由大到小的降序方式展示
SELECT * from students where stu_age >10 ORDER BY stu_age desc;

多字段排序

## 多字段排序,先按性别降序排序,再按年龄升序排序
SELECT * from students where stu_age >10 ORDER BY stu_denger DESC,stu_age ASC ;
5.5 聚合函数

SQL中提供了一些可以对查询记录进行计算的函数,统称聚合函数

  • count()
  • max()
  • min()
  • sum()
  • avg()
  • count() 统计函数,统计满足条件的指定字段值的个数
## 统计表中,数据总条数
SELECT COUNT(*) from students;

## 统计表中,学号的总个数
SELECT COUNT(stu_num) from students;

## 统计表中,男生的学号总个数
SELECT COUNT(stu_num) from students where stu_denger = '男';
  • max() 展示查询数据的指定列的最大值
## 学生表中,最大年龄值
SELECT MAX(stu_age) from students;
  • min() 展示查询数据的指定列的最小值
## 学生表中,最小年龄值
SELECT MIN(stu_age) from students;
  • sum() 求和,满足查询条件的值的指定列的和
## 全部学生年龄的总和
SELECT sum(stu_age) from students;
  • avg() 计算平均值,满足查询条件的值的指定列的平均值
## 全部学生年龄的平均值
SELECT avg(stu_age) from students;
5.6分组查询

将数据表中的数据按照分类进行分组查询

select 分组字段/聚合函数 from 表名 where 条件 group by 分组列名 having 条件

## 查询全部数据,以学生年龄分组
SELECT stu_name,stu_age FROM students GROUP BY stu_age;

## 使用聚合函数count(),查询男女性别的各自总人数
SELECT stu_denger,COUNT(stu_denger) from students GROUP BY stu_denger;

## 使用聚合函数avg(),查询男女生的平均年龄
SELECT stu_denger,AVG(stu_age) from students GROUP BY stu_denger;

## 使用聚合函数,加having条件,查询性别男的,按年龄分组后,年龄大于18岁以上的人数,再按年龄升序排序展示
SELECT stu_age,COUNT(stu_num) from students where stu_denger = '男' GROUP BY stu_age HAVING stu_age > 18 ORDER BY stu_age;

分组查询执行顺序:

  • 先执行where语句,按条件对数据表进行查询
  • 再执行group,对按条件查询出来的数据进行分组
  • 再执行having,对以上分组后的数据,进行条件查询
  • 最后执行order by ,对以上结果进行排序
5.7 分页查询 limit
select ...
from ...
where ...
limit param1,param2
  • param1 int :表示获取查询语句的结果中的第一条数据的索引(索引从0开始)
  • param2 int : 表示获取查询记录的条数(如果剩下的数据条数<param2,则返回剩下的所有条数)

对学生表进行数据查询,总共8条数据,每页展示三条,一共三页

总记录数: count 8

每页显示书:pagesize 3

总页数:pageCount = count%pagesize ? count%pagesize : count%pagesize + 1

##分页查询,第一页
SELECT * from students LIMIT 0,3;		(1-1)*3  (当前页码-1*每页查询条数

##分页查询,第二页
SELECT * from students LIMIT 3,3;		(2-1)*3

##分页查询,第三页
SELECT * from students LIMIT 6,3;		(3-1)*3

# 如果在一张数据表中:
# pageNum表示查询的页码
# pageSize表示每页查询的条数
# 通用非也语句如下:
select * from <tableName> where conditions limit (pageNum-1)*pageSize , pageSize;

三、数据表的关联关系

1.关联关系介绍

MySQL是关系型数据库,不仅可以存储数据,还可以维护数据与数据之间的关联关系,通过在数据表中添加字段来建立外键约束

数据与数据之间的关联关系分为四种:

  • 一对一
  • 一对多
  • 多对一
  • 多对多

2.外键约束

外键约束—将一个表添加外键约束,与另一张表的主键关联,这个外键约束列的数据,必须在关联的主键字段中存在

案例

新建班级表

CREATE TABLE `class` (
  `class_id` int NOT NULL,
  `class_name` varchar(255) NOT NULL,
  `class_remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

新建学生表(在学生表中添加外键,与班级表的class_id主键关联)

CONSTRAINT FK_STUDENT_CLASS FOREIGN KEY (cid) REFERENCES class (class_id)

CREATE TABLE `students` (
  `stu_num` char(8) primary key,
  `stu_name` varchar(20) NOT NULL,
  `stu_denger` char(2) NOT NULL,
  `stu_age` int NOT NULL,
  `stu_tel` char(11) NOT NULL,
  `stu_qq` varchar(11) DEFAULT NULL,
  `cid` int DEFAULT NULL,
    CONSTRAINT FK_STUDENT_CLASS FOREIGN KEY (cid) REFERENCES class (class_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

3.外键约束-级联

主外键关联关系,在设置外键时,需要添加

级联修改(ON UPDATE CASCADE )

级联删除(ON DELETE CASCADE)

保证数据完整性和一致性

## 删除原有外键
alter table students drop foreign key FK_STUDENTS_CLASS

##重新设置外键,添加级联修改和级联删除
alter table students add constraint FKSTUDENTS_CLASS foreign key(cid) references class (class_id) ON UPDATE CASCADE ON DELETE CASCADE;

按以上外键设置,增加级联修改和级联删除设置,class表中的class_id 如果修改/删除,students表中的外键cid会自动同步修改/删除。

;