目录
SQL分类
SQL分为四类,分别用来定义数据库对象(DDL)、控制数据库权限(DCL)、对数据库表内数据增删改查(DML、DQL)。小题中的SQL涉及DDL和DML,在大题中的SQL为各种查询(DQL)。
DDL
概念
Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) 。
语法
操作数据库:
1.查询所有数据库
show databases ;
2.查询当前数据库
select database() ;
3.创建数据库
后面的字符集和排序规则可以不写,不写的话使用默认字符集和排序规则。
create database [ if not exists ] 数据库名 [ default charset 字符集 ] [ collate 排序
规则 ] ;
4.删除数据库
drop database [ if exists ] 数据库名 ;
5.切换数据库
use 数据库名 ;
操作数据库内的表:
1.查询当前数据库所有表
show tables;
2.查看指定表结构
desc 表名 ;
3.创建表
comment 后面是该字段的注释,语法上可以不写,但在实际开发中必须写。
CREATE TABLE 表名(
字段1 字段1类型 [ COMMENT 字段1注释 ],
字段2 字段2类型 [COMMENT 字段2注释 ],
字段3 字段3类型 [COMMENT 字段3注释 ],
......
字段n 字段n类型 [COMMENT 字段n注释 ]
) [ COMMENT 表注释 ] ;
DML
概念
DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进行增、删、改操作。换句话说就是增删改查里除了“查”之外的操作,因为查比较复杂所以被单独拉出来了。
语法
增(INSERT)
可一次增加多条数据,字段1对应值1,以此类推。
INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);
删(DELETE)
注意删数据是delete,删表是drop。
DELETE FROM 表名 [ WHERE 条件 ] ;
where后是删除条件,假设我们有一个学生表(student)和表内性别字段(gender),我们要删除性别为女的学生:
delete from student where gender = '女';
改(UPDATE)
和insert类似,就不讲了。
UPDATE 表名 SET 字段名1 = 值1 , 字段名2 = 值2 , .... [ WHERE 条件 ] ;
DQL(重点!!!)
概念
DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记 录。是大题考察的重点!
语法
基础查询(单表查询):
基础查询语法总结如下
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
下面我们来详细解释一下
首先最简单的查询是 (SELECT FROM):
SELECT 字段1, 字段2, 字段3 ... FROM 表名 ;
例如查询学生表(student)的姓名字段(name)和年龄字段(age):
SELECT name,age FROM student ;
下面我们在这个基础上增加条件查询(WHERE):
SELECT 字段1, 字段2, 字段3 ... FROM 表名 where 条件;
还是上面的例子,假设我们要在刚刚的基础上查询年龄大于20的学生:
SELECT name,age FROM student where age > 20;
就是这么简单。
附常见的运算符如下:
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<> 或 != 不等于
BETWEEN ... AND ... 在某个范围之内(含最小、最大值)
IN(...) 在in之后的列表中的值,多选一
LIKE 占位符 模糊匹配(_匹配单个字符, %匹配任意个字符)
IS NULL 是NULL
AND 或 && 并且 (多个条件同时成立)
OR 或 || 或者 (多个条件任意一个成立)
NOT 或 ! 非 , 不是
下面来讲讲聚合函数
那么如果要求找出年龄最大的学生呢,这个时候就需要聚合函数进行纵向计算了。
常见的聚合函数:
函数 功能
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和
聚合函数语法:
SELECT 聚合函数(字段列表) FROM 表名 ;
比如刚刚那个找出最大年龄学生的需求,实现如下:
SELECT max(age) FROM student;
聚合函数的使用就是这么简单。
分组查询(GROUP BY)
分组查询就是对刚刚WHERE过的结果再次分组输出,语法如下:
SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组
后过滤条件 ];
比如根据性别分组,统计男同学和女同学的数量:
select gender, count(*) from student group by gender ;
分组查询就是这么简单,还有一个having字段不常考,功能和where差不多,就不讲了。
排序(ORDER BY)
排序字段就是后面加个ORDER BY。
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;
排序方式分为升序和降序:
ASC : 升序(默认值)
DESC: 降序
分页查询(LIMIT)
分页查询在开发中有些复杂,但咱考的挺简单,只需要记住基本语法:
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;
比如说查学生表的第一页数据,每页显示10条:
select * from student limit 0,10;
基础查询(单表查询)就结束了,下面我们来讲讲多表关联查询(难点)。
多表查询(难点):
多表之间的关系分为1对1,1对多,多对多,这属于库表设计的内容,就不讲了,直接来讲讲多表查询的语法。
关联查询分为内连接(不常用就不讲了)和外连接,外连接分为左外连接和右外连接:
左外连接
SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ... ;
右外链接
SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ... ;
我们可以看出,左外链接和右外连接其实就是换了个顺序,记住一个就好了(我们日常开发中更倾向于左外链接)。
子查询
除了链接查询还有子查询,就是查询嵌套查询,咱们的大题基本上都是这样的,这个时候就要做拆解:
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
根据子查询的位置,分为:
- WHERE之后
- FROM之后
- SELECT之后
这里的具体概念不重要,其实就是套娃,我们下面直接看真题。
期末真题解析
15.SQL解释:
SELECT Product.Pname, Sale.Sdate, Supermarket.Sname
这部分指定了查询结果应包含的列。即产品名称(Product.Pname)、销售日期(Sale.Sdate)和超市名称(Supermarket.Sname)。
FROM Sale:指定了查询的主表,即Sale表。
JOIN Product ON Sale.Pno = Product.Pno
通过产品编号(Pno)将Sale表和Product表进行内连接(JOIN)。这意味着只有当两个表中都有匹配的产品编号时,相关的行才会出现在结果集中。
JOIN Supermarket ON Sale.Sno = Supermarket.Sno
通过超市编号(Sno)将Sale表和Supermarket表进行内连接。这同样意味着只有当两个表中都有匹配的超市编号时,相关的行才会出现在结果集中。
WHERE Sale.Squantity BETWEEN 50 AND 100
这是一个条件语句,用于筛选销售数量(Squantity)在50到100之间的记录。
16.SQL解释:
SELECT Product.Pname, Product.Pstock, SUM(Sale.Squantity) AS TotalQuantity
这部分指定了查询结果应包含的列。即产品名称(Product.Pname)、产品库存(Product.Pstock)和销售数量的总和(SUM(Sale.Squantity)),后者被命名为TotalQuantity。
FROM Product
指定了查询的主表,即Product表。
JOIN Sale ON Product.Pno = Sale.Pno
通过产品编号(Pno)将Product表和Sale表进行内连接。这意味着只有当两个表中都有匹配的产品编号时,相关的行才会出现在结果集中。
WHERE Product.Pprice BETWEEN 20 AND 50
这是一个条件语句,用于筛选产品价格在20到50之间的记录。
GROUP BY Product.Pname, Product.Pstock
这个语句用于将结果集按照产品名称和产品库存进行分组。通常,GROUP BY子句用于与聚合函数(如SUM、COUNT等)一起使用,以对每个分组进行聚合计算。
17.SQL解释:
SELECT Product.Pname, Product.Pprice, SUM(Sale.Squantity) AS TotalQuantity
这部分指定了查询结果应包含的列。即产品名称(Product.Pname)、产品价格(Product.Pprice)和销售数量的总和(SUM(Sale.Squantity)),后者被命名为TotalQuantity。
FROM Product
指定了查询的主表,即Product表。
JOIN Sale ON Product.Pno = Sale.Pno
通过产品编号(Pno)将Product表和Sale表进行内连接。这意味着只有当两个表中都有匹配的产品编号时,相关的行才会出现在结果集中。
WHERE Product.Pstock < 10
这是一个条件语句,用于筛选库存量小于10的产品。
GROUP BY Product.Pname, Product.Pprice
这个语句用于将结果集按照产品名称和产品价格进行分组。这允许查询为每个具有不同名称和价格的产品组合提供一个销售总量。
18.SQL解释:
SELECT Product.Pname, Sale.Squantity, Supermarket.Sname
这部分指定了查询结果应包含的列。即产品名称(Product.Pname)、销售数量(Sale.Squantity)和超市名称(Supermarket.Sname)。
FROM Sale
指定了查询的主表,即Sale表。
JOIN Product ON Sale.Pno = Product.Pno
通过产品编号(Pno)将Sale表和Product表进行内连接。这意味着只有当两个表中都有匹配的产品编号时,相关的行才会出现在结果集中。
JOIN Supermarket ON Sale.Sno = Supermarket.Sno
通过超市编号(Sno)将Sale表和Supermarket表进行内连接。这同样意味着只有当两个表中都有匹配的超市编号时,相关的行才会出现在结果集中。
WHERE Sale.Sdate < '2024-12-01'
这是一个条件语句,用于筛选销售日期在2024年12月1日之前的记录。
19.SQL解释:
SELECT Supermarket.Sname, Supermarket.Sphone, SUM(Sale.Squantity) AS TotalQuantity
这部分指定了查询结果应包含的列。即超市名称(Supermarket.Sname)、超市电话(Supermarket.Sphone)和销售数量的总和(SUM(Sale.Squantity)),后者被命名为TotalQuantity。
FROM Supermarket
指定了查询的主表,即Supermarket表。
JOIN Sale ON Supermarket.Sno = Sale.Sno
通过超市编号(Sno)将Supermarket表和Sale表进行内连接。这意味着只有当两个表中都有匹配的超市编号时,相关的行才会出现在结果集中。
WHERE Supermarket.Saddress LIKE '%北京市%'
这是一个条件语句,用于筛选地址中包含“北京市”的超市。LIKE操作符用于模式匹配,%表示任意字符出现任意次数。
GROUP BY Supermarket.Sname, Supermarket.Sphone
这个语句用于将结果集按照超市名称和电话进行分组。这允许查询为每个具有不同名称和电话的超市提供一个总销售数量。
20.SQL解释:
SELECT Supermarket.Sname, Supermarket.Saddress, SUM(Sale.Squantity) AS TotalQuantity
这部分指定了查询结果应包含的列。即超市名称(Supermarket.Sname)、超市地址(Supermarket.Saddress)和销售数量的总和(SUM(Sale.Squantity)),后者被命名为TotalQuantity。
FROM Supermarket
指定了查询的主表,即Supermarket表。
JOIN Sale ON Supermarket.Sno = Sale.Sno
通过超市编号(Sno)将Supermarket表和Sale表进行内连接。这意味着只有当两个表中都有匹配的超市编号时,相关的行才会出现在结果集中。
WHERE Supermarket.Sphone LIKE '010%'
这是一个条件语句,用于筛选电话号码以"010"开头的超市。LIKE操作符用于模式匹配,%表示任意字符出现任意次数。
GROUP BY Supermarket.Sname, Supermarket.Saddress
这个语句用于将结果集按照超市名称和地址进行分组。这允许查询为每个具有不同名称和地址的超市提供一个总销售数量。