SQL 基础
SQL 简介
SQL(Structured Query Language),结构化查询语言,用于访问和处理数据库的标准的计算机语言
SQL 语法特征:
-
大小写不敏感
-
可以单行或多行书写,最后以
;
号结束 -
支持单行、多行注释:
- 单行注释:
-- 注释内容
(-- 后面一定要有一个空格) - 单行注释:
# 注释内容
(# 后面可以不加空格,但推荐加上) - 多行注释:
/* 注释内容 */
- 单行注释:
根据 SQL 语句的功能,可将其分为四类:
-
数据定义:DDL(Data Definition Language)
- 库的创建删除、表的创建删除等
-
数据操纵:DML(Data Manipulation Language)
- 新增数据、删除数据、修改数据等
-
数据控制:DCL(Data Control Language)
- 新增用户、删除用户、密码修改、权限管理等
-
数据查询:DQL(Data Query Language)
- 基于需求查询和计算数据
DDL
数据库操作
查看所有数据库
show databases;
查看当前使用的数据库
select database();
创建数据库
create database 数据库名 charset utf8;
删除数据库
drop database 数据库名;
使用数据库
use 数据库名;
表操作
查看数据库中所有表(需要先选择数据库)
show tables;
查看表结构
desc 表名;
创建表
create table 表名(
列名 列类型 [约束条件],
列名 列类型 [约束条件],
...
);
[]
表示可选的内容
其中,列类型有:
int
:整数float
:浮点数varchar(长度)
:文本(长度填写整数类型,用于限制文本长度,可填的最大数字为 255)date
:日期类型timestamp
:时间戳类型
修改表–添加字段
alter table 表名 add 列名 类型;
修改表–修改字段–重命名版
alert table 表名 change 原名 新名 类型及约束;
修改表–修改字段–不重命名
alter table 表名 modify 列名 类型及约束;
删除表–删除字段
alter table 表名 drop 列名;
删除表
drop table 表名;
# 如果表存在,则删除;如不存在,则跳过
drop table if exists 表名;
有些数据库系统不支持
if exists
选项,支持if exists
选项的有:MySQL,PostgreSQL 和 SQL Server 2016
查看表的创建语句–详细过程
show create table 表名;
DML
数据插入
全列插入:值的顺序与表结构字段的顺序完全对应,此时可以省略列名的列表
insert into 表名 values (...);
部分列插入:值的顺序与给出的列名顺序对应
insert into 表名 (列1, 列2, ...) values (值1, 值2, ...);
全列多行插入
insert into 表名 values (...), (...), ...;
部分列多行插入
insert into 表名 (列1, 列2, ...) values (值1, 值2, ...), (值1, 值2, ...), ...;
注意:如果数据是字符型,必须使用单引号或双引号包围
例如:
# 创建名为 test 的数据库
create database test charset UTF8;
# 使用名为 test 的数据库
use test;
# 创建表
create table student(
id int,
name varchar(10),
age int
);
# 为 id 列插入多行数据
insert into student(id) values(1), (2), (3);
# 为 id 列和 name 列插入多行数据
insert into student(id, name) values(4, 'Ellon'), (5, 'John');
# 为全部列插入数据
insert into student values(6, 'Ale', 20);
数据删除
清空表(删除整个表中的数据)
delete from 表名;
按特定条件删除数据
delete from 表名 where 条件;
例如:
# 删除 id 为 3 的行
delete from student where id = 3;
where
where
后面跟条件语句,以进行条件处理
条件语句支持以下运算符:
- 比较运算符
- 等于:
=
- 大于:
>
- 大于等于:
>=
- 小于:
<
- 小于等于:
<=
- 不等于:
!=
或<>
- 等于:
- 逻辑运算符
- 与:
and
- 或:
or
- 非:
not
- 与:
- 使用 like 关键字的模糊查询
%
通配符:表示任意多个任意字符_
通配符:表示一个任意字符
- 范围查询
- 连续范围查询:
between ... and ...
- 非连续范围查询:
in(... , ...)
- 连续范围查询:
- 空判断
- 判断为空:
is null
- 判断不为空:
is not null
- 判断为空:
条件的优先级:
- 优先级由高到低的顺序为:小括号,
not
,比较运算符,逻辑运算符 and
比or
先运算(如果同时出现并希望先算or
,需要结合()
使用)
参考资料:
数据修改
update 表名 set 列名 = 值 [where 条件];
例如:
# 将 id 为 2 所对应的 name 修改为 Mike
update student set name = 'Mike' where id = 2;
update 表名 set 列名 = 值
会修改整列的数据
DQL
基础查询
查询所有列
select * from 表名;
查询指定列
select 列1,列2,... from 表名;
条件查询
select 列1,列2,... from 表名 where 条件;
例如:
# 查询 id 和 name 两列,年龄小于 35
select id, name from student where age >= 18 and age < 35;
分组聚合
select 字段, 聚合函数 from 表名 [where 条件] group by 列名;
聚合函数:
- 求和:
sum(列)
- 求平均值:
avg(列)
- 求最小值:
min(列)
- 求最大值:
max(列)
- 求数量:
count(列/*)
注意:
- 一条 SQL 查询语句可以写多个聚合函数,以同时展示多个统计信息
- 除了聚合函数外,
select 字段
中的 字段 只能包含GROUP BY 列名
中出现的 列名
例如:
create table person(
id int,
name varchar(10),
age int,
gender varchar(10)
);
insert into person values(1, 'Tom', 23, 'male'), (2, 'Jerry', 22, 'male'),
(3, 'Morty', 21, 'male'), (4, 'Rick', 26, 'male'), (5, 'Marry', 23, 'female'), (6, 'Angel', 22, 'female');
# 按性别分组,统计各组人数
select gender, count(*) from person group by gender;
# 按性别分组,统计平均年龄
select gender, avg(age) from person group by gender;
# 按性别分组,统计最大年龄和最小年龄
select gender, max(age), min(age) from person group by gender;
排序分页
结果排序
可以对查询的结果使用 order by
关键字,指定某个列进行排序
select 列|聚合函数|* from 表名
where ...
group by ...
order by ... [asc / desc];
其中:
- 升序(默认):
asc
- 降序:
desc
例如:
# 显示 age > 22 的所有数据(按 age 列降序排列)
select * from person where age > 22 order by age desc;
结果分页
可以使用 limit
关键字,对查询结果进行数量限制或者分页显示
select 列|聚合函数|* from 表名
where ...
group by ...
order by ... [asc / desc]
limit n[, m];
其中:
n
表示:显示n
条数据n, m
表示:跳过前n
条数据,显示后续的m
条数据
注意:
select
和from
是必写的,where
、group by
、order by
、limit
均可按需求省略- 执行顺序:from ->
where
->group by
和聚合函数 ->select
->order by
->limit
limit
后面不可以直接加公式
例如:
# 按 age 列升序排列,查询结果只保留 5 条数据
select * from person limit 5;
# 筛选出年龄最大的 5 人
select * from person order by age desc limit 5;
# 按 age 列升序排列,查询结果只保留从第 3 条开始的 2 条数据
select * from person order by age limit 2, 2;
参考资料:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)