目录
前言:
SQL概述&&通用语法:
DDL:
操作数据库:
数据类型:
操作表:
DML:
语法规则:
案例演示:
DQL:
语法规则:
案例演示:
# 基础查询:
# 条件查询:
#聚合函数:
# 分组查询:
#排序查询:
#分页查询:
执行顺序:
DCL:
语法规则:
前言:
SQL语言有40多年的历史,从它被应用至今几乎无处不在。我们消费的每一笔支付记录,收集的每一条用户信息,发出去的每一条消息,都会使用数库或与其相关的产品来据存储,而操纵数据库的语言正是 SQL !!!
SQL相当于一种工具,它可以帮助我们完成工作,创造价值。本文就来详细讲解SQL的相关概念与操作,为后面的数据库深入学习打下基础。
数据库与SQL相关说明:
名称 | 全称 | 简称 |
数据库
|
存储数据的仓库,数据是有组织的进行存储
|
DataBase
( DB ) |
数据库管 理系统
|
操纵和管理数据库的大型软件
|
DataBase Management
System (DBMS)
|
SQL
|
操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准
|
Structured Query
Language (SQL)
|
SQL概述&&通用语法:
SQL,全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 。
学习SQL的作用:
SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。
- SQL 可创建新数据库
- SQL 面向数据库执行查询
- SQL 可从数据库取回数据
- SQL 可在数据库中插入新的记录
- SQL 可从数据库删除记录
- SQL 可更新数据库中的数据
SQL分类:
语句,根据其功能,主要分为四类:
DDL
、
DML
、
DQL
、
DCL
SQL通用语法:
- SQL语句可以单行或多行书写,以分号结尾。
-
SQL
语句可以使用空格
/
缩进来增强语句的可读性 -
MySQL
数据库的
SQL
语句不区分大小写,关键字建议使用大写。*
注释:1)单行注释:
—
注释内容
或
#
注释内容2)多行注释:
/*
注释内容
*/
好了,通过上面的一些说明,想必你对SQL有了一定了解了,那我们直接开始SQL的学习吧~~~
DDL:
Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段)
操作数据库:
这里先列出总的语法,后面依次解释说明:
# 库操作
-- 1.1 查询所有数据库
show databases ;
-- 1.2 查询当前数据库
select database() ;
-- 1.3 创建数据库
create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序
规则 ] ;
-- 1.4 删除数据库
drop database [ if exists ] 数据库名 ;
-- 1.5 切换数据库
use 数据库名 ;
# 表操作:
-- 2.1 查询当前数据库所有表
show tables;
-- 2.2 查看指定表结构
desc 表名 ;
-- 2.3 查询指定表的建表语句
show create table 表名 ;
-- 2.4 创建表结构
create table 表名(
字段1 字段1类型 [comment 字段1注释 ],
字段2 字段2类型 [comment 字段2注释 ],
字段3 字段3类型 [com服务器托管ment 字段3注释 ],
......
字段n 字段n类型 [comment 字段n注释 ]
) [ comment 表注释 ] ;
- 查询所有数据库:
show databases ;
——->可以看到这里有四个系统自带的数据库
- 创建数据库:
create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序
规则 ] ;
/*create database if not exists 数据库名 --->如果数据库已经存在(同名)则不创建,否则创建*/
/*中括号中的内容是可选的,可以写也可以不写*/
在mysql中输入下面指令,名为itcast的数据库创建成功
- 查询当前数据库:
select database() ;
- 切换数据库 :
数据,执行如下
SQL
:
use itcast;
-
删除数据库 :
drop database [ if exists ] 数据库名 ;
/*如果删除一个不存在的数据库,将会报错。
此时,可以加上参数 if exists ,如果数据库存在,再
执行删除,否则不执行删除。*/
数据类型:
在建表语句中,我们指定字段的数据类型时,常常用到int ,varchar,那么在MySQL中除了 以上的数据类型,还有哪些常见的数据类型呢? 接下来,我们就来详细介绍一下MySQL的数据类型。
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。
常用类型:
- int:整型
- double:浮点型,例如 double(5,2)表示最多 5 位,其中必须有 2 位小服务器托管数,即最大值为 999.99;
- decimal:泛型型,在表单线方面使用该类型,因为不会出现精度缺失问题;
- char:固定长度字符串类型;(当输入的字符不够长度时会补空格)
- varchar:固定长度字符串类型;
- text:字符串类型;
- blob:字节类型;
- date:日期类型,格式为:yyyy-MM-dd;
- time:时间类型,格式为:hh:mm:ss
- timestamp:时间戳类型;
更多数据类型可以查看这篇文章:最全 SQL 字段类型(4种)、属性(6种)总结_sql字段类型-CSDN博客
操作表:
- 创建表:
注意:[ ] 中的内容是可选的,最后一个字段没有逗号.
那么建表语句为:
create table tb_user(
id int comment '编号',
name varchar(50) comment '姓名',
age int comment '年龄',
gender varchar(1) comment '性别'
) comment '用户表';
- 查询当前数据库所有表:
show tables;
-
.
查看指定表结构:
desc 表名 ;
演示:
- 查询指定表的建表语句:
show create table 表名 ;
上述,我们已经讲解了通过DDL语句,如何操作数据库、操作表、操作表中的字段,而通过DDL语句执 行在命令进行操作,主要存在以下两点问题:
1).会影响开发效率 ;
2). 使用起来,并不直观,并不方便 ;
所以,后续语法与操作展示我将在SQL图示化工具——Vavicat中展示,感兴趣的小伙伴可已自行下载:Navicat 中国 | 支持 MySQL、Redis、MariaDB、MongoDB、SQL Server、SQLite、Oracle 和 PostgreSQL 的数据库管理
DML:
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进 行增、删、改操作。
语法规则:
-- 1. 添加数据
# 1.1 给指定字段添加数据
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
# 1.2 给全部字段添加数据
INSERT INTO 表名 VALUES (值1, 值2, ...);
# 1.3 批量添加数据
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...), (值1, 值2, ...), (值
1, 值2, ...) ;
-- 2. 修改数据
UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ;
/* 没有条件where表示将表中的所有数据都进行修改*/
-- 3. 删除数据
DELETE FROM 表名 [ WHERE 条件 ] ;
/* 没有条件where相当于删除所有数据 */
按照上述操作,我们创建表并给表插入信息:
案例演示:
-- 查看所有数据库
show databases;
-- 创建emp数据库
create database if not exists emp;
-- 使用当前数据库
use emp;
-- 创建员工表
create table emp(
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(10) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
workaddress varchar(50) comment '工作地址',
entrydate date comment '入职时间'
)comment '员工表';
-- 展示所创建的表信息
desc employee;
-- 加入表中成员
INSERT INTO `employee` (`id`, `workno`, `name`, `gender`, `age`, `idcard`, `workaddress`, `entrydate`) VALUES (1, '0001', ' 柳岩', '女', 19, ' 123445', '北京', '2024-04-01');
INSERT INTO `employee` (`id`, `workno`, `name`, `gender`, `age`, `idcard`, `workaddress`, `entrydate`) VALUES (2, '0002', '坤坤', '男', 20, '34568', '北京', '2024-04-02');
INSERT INTO `employee` (`id`, `workno`, `name`, `gender`, `age`, `idcard`, `workaddress`, `entrydate`) VALUES (3, '0004', '张三', '男', 22, '45678', '上海', '2024-04-03');
INSERT INTO `employee` (`id`, `workno`, `name`, `gender`, `age`, `idcard`, `workaddress`, `entrydate`) VALUES (4, '0005', '李四', '男', 18, '23535', '深圳', '2024-04-05');
INSERT INTO `employee` (`id`, `workno`, `name`, `gender`, `age`, `idcard`, `workaddress`, `entrydate`) VALUES (5, '0006', '小明', '男', 35, '23535', '福建', '2024-04-06');
INSERT INTO `employee` (`id`, `workno`, `name`, `gender`, `age`, `idcard`, `workaddress`, `entrydate`) VALUES (6, '0007', '丽华', '女', 34, '135252', '天津', '2024-04-07');
INSERT INTO `employee` (`id`, `workno`, `name`, `gender`, `age`, `idcard`, `workaddress`, `entrydate`) VALUES (8, '0008', '小猫', '女', 18, '1235215', '福建', '2024-04-05');
INSERT INTO `employee` (`id`, `workno`, `name`, `gender`, `age`, `idcard`, `workaddress`, `entrydate`) VALUES (9, '0009', '凉凉', '男', 20, '12345135', '西安', '2024-04-04');
INSERT INTO `employee` (`id`, `workno`, `name`, `gender`, `age`, `idcard`, `workaddress`, `entrydate`) VALUES (10, '0010', '菜菜', '女', 19, '135235', '安徽', '2024-04-02');
-- 这里先用来查看所有表中信息,后续会讲到
select * from employee;
/* 这里是不运行的部分,仅作展示
-- 修改表中信息:
update emp set name = '小王' where id = 1;
update emp set entrydate = '2008-01-01'; -- 没有条件where就是全部修改
-- 删除表中数据
delete from emp where gender = '女'; */
运行结果:
注意:
- DELETE 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
- DELETE 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即可)。
- 所有字符串数据必须使用单引用!
DQL:
DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记 录。查询关键字: SELECT
在一个正常的业务系统中,查询操作的频次是要远高于增删改的,当我们去访问企业官网、电商网站, 在这些网站中我们所看到的数据,实际都是需要从数据库中查询并展示的。而且在查询的过程中,可能 还会涉及到条件、排序、分页等操作。比如京东购物网站:
语法规则:
# 基础查询
-- 1.1 查询多个字段
SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;
SELECT * FROM 表名 ;-- 带*号是查询所有字段
-- 1.2 字段设置别名:
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名; -- as可以省略
-- 1.3 去除重复记录
SELECT DISTINCT 字段列表 FROM 表名; -- 保留不同的字段
# 条件查询
SELECT 字段列表 FROM 表名 WHERE 条件列表 ;
#聚合函数
SELECT 聚合函数(字段列表) FROM 表名 ;
#分组查询
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组
后过滤条件 ];
# 排序查询
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
ASC : 升序(默认值) -- 排序方式
DESC: 降序 -- 排序方式
# 分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
案例演示:
# 基础查询:
A.查询指定字段 name, workno, age并返回:
select name,workno,age from emp;
B:查询返回所有字段:
select id ,workno,name,gender,age,idcard,workaddress,entrydate from emp; -- 1
select * from emp; -- 2
C:查询所有员工的工作地址,起别名:
select workaddress (as) '工作地址' from emp; -- as 可以省略
D:查询公司员工的上班地址有哪些(不要重复):
select distinct workaddress '工作地址' from emp;
D:这里演示最后一个查询结果,其他类似(以DML中创建的员工表为例):
# 条件查询:
常用的比较运算符如下:
常用的逻辑运算符如下:
案例:
A. 查询年龄等于 88 的员工:
select * from emp where age = 88;
B.查询年龄小于等于 20 的员工信息:
select * from emp where age
C.查询年龄在15岁(包含) 到 20岁(包含)之间的员工信息:
select * from emp where age >= 15 && age = 15 and age
D.查询身份证号最后一位是X的员工信息:
-- % 匹配任意个字符
select * from emp where idcard like '%X';
-- _ 匹配一个字符,若身份证号18位,则X前有17个空格
select * from emp where idcard like '_________________X';
D:这里演示最后一个查询结果,其他类似(以DML中创建的员工表为例):
#聚合函数:
将一列数据作为一个整体,进行纵向计算 ,下面展示常见聚合函数:
注意 : NULL值是不参与所有聚合函数运算的!!!
案例:
A. 统计该企业员工数量:
select count(*) from emp; -- 统计的是总记录数,含创建的null字段
select count(idcard) from emp; -- 统计的是idcard字段不为null的记录数
B.统计该企业员工的平均年龄:
select avg(age) from emp;
C. 统计该企业员工的最大年龄:
select max(age) from emp;
D.统计福建地区员工的年龄之和:
select sum(age) from emp where workaddress = '福建';
D:这里演示最后一个查询结果,其他类似(以DML中创建的员工表为例):
# 分组查询:
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组
后过滤条件 ];
where 和 having的区别:
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组 之后对结果进行过滤。
- 判断条件不同:where不能对聚合函数进行判断,而having可以。
案例:
A. 根据性别分组 , 统计男性员工 和 女性员工的数量:
select gender, count(*) from emp group by gender ;
B. 根据性别分组 , 统计男性员工 和 女性员工的平均年龄:
select gender, avg(age) from emp group by gender
C. 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于2的工作地址:
select workaddress, count(*) address_count from emp where age = 2;
C:这里演示最后一个查询结果,其他类似(以DML中创建的员工表为例):
#排序查询:
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
注意:
- 如果是升序, 可以不指定排序方式ASC ;
- 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;
案例:
A. 根据年龄对公司的员工进行升序排序:
select * from emp order by age asc;
select * from emp order by age; -- 默认升序排序
B.根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序:
select * from emp order by age asc , entrydate desc;
B:这里演示最后一个查询结果,其他类似(以DML中创建的员工表为例):
#分页查询:
分页操作在业务系统开发时,也是非常常见的一个功能,我们在网站中看到的各种各样的分页条,后台 都需要借助于数据库的分页操作。
1).语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
注意事项:
- 起始索引从0开始,起始索引 = (查询页码 – 1)* 每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10(一页10条信息)。
案例:
A.查询第1页员工数据, 每页展示10条记录:
select * from emp limit 0,10;
select * from emp limit 10; -- 第一页,0可以省略
B.查询第2页员工数据, 每页展示10条记录 ——–> (页码-1)*页展示记录数:
select * from emp limit 10,10;
A:这里演示第一个查询结果,其他类似(以DML中创建的员工表为例):
执行顺序:
在讲解DQL语句的具体语法之前,我们已经讲解了DQL语句的完整语法,及编写顺序,接下来,我们要来说明的是DQL语句在执行时的执行顺序,也就是先执行那一部分,后执行那一部分,下面一张图说明执行顺序:
DCL:
DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访 问权限。
语法规则:
# 管理用户
-- 1.1 查询用户
select * from mysql.user;
-- 1.2 创建用户
-- 1.3 修改用户密码
-- 1.4 删除用户
DROP USER '用户名'@'主机名' ;
# 权限控制
-- 2.1 查询权限
SHOW GRANTS FOR '用户名'@'主机名' ;
-- 2.2 授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
-- 2.3 撤销权限
REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';
注意:
- 在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户。
- 主机名可以使用 % 通配。
- 这类SQL开发人员操作的比较少,主要是DBA( Database Administrator 数据库 管理员)使用。
对于权限控制,官方提供了许多方法 ,可以参考:MySQL :: MySQL 8.0 Reference Manual :: 8.2.2 Privileges Provided by MySQL
这里不做过多展示了,有兴趣的小伙伴可以自行想学习相应规则
结语:写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net