学校选课不幸失策选到了数据库,于是开始从零恶补SQL语法
今天用到的练习文件下载:https://drive.google.com/file/d/1YzEIFVZvs1KC9tlsuUq_vHoE1n2pCL5u/view?usp=sharing
基础语法
注解
/*
这是
一段注解文本
*/
-- 这是一行注解
标准语法
SELECT * FROM "students";
选取 所有 从 students表格中
于是便会回传表格中的所有栏位
同样道理,我们只需要讲通配符*换掉便可以检索其他信息
SELECT 姓名,班级,成绩 FROM studentsCN;
使用LIMIT限制单次回传数量
将回传内容限制到LIMIT的指定值(这里为5)
SELECT 姓名,班级,成绩 FROM studentsCN LIMIT 5;
如果要翻页我们使用OFFSET语法,OFFSET表示你要跳过的数量,例如我们想看第11-15的资料
SELECT 姓名,班级,成绩 FROM studentsCN LIMIT 5 OFFSET 10;
格式化语法
习惯上,我们习惯将不同的筛选标准进行换行,以增加代码的可读性。例如上面的语法,我们可以格式化为
SELECT 姓名,班级,成绩
FROM studentsCN
LIMIT 5
OFFSET 10;
WHERE语法设定筛选条件
我们在语法中添加WHERE = 语法便会对特定元素进行筛选
SELECT 姓名,班级,成绩
FROM studentsCN
WHERE 班级 = '1 年 2 班';
同样地,我们将等号换为<>便可以筛选出来不属于特定元素的内容
SELECT 姓名,班级,成绩
FROM studentsCN
WHERE 班级 <> '1 年 2 班';
这样就会筛选出所有非1年2班的学生,即1年1班和3班的学生
但是我们会发现这样筛选之下,不同班级的没有排序在一起,所以我们使用ORDER BY语法根据特定元素进行排列整理,同时还可以添加其他元素,例如成绩(默认升序,如果想要降序在元素后面添加DESC即可)
SELECT 姓名,班级,成绩
FROM studentsCN
WHERE 班级 = '1 年 2 班'
ORDER BY 班级;
我们还可以使用WHERE检索分数区间
SELECT 姓名,班级,成绩
FROM studentsCN
WHERE 成绩 >= 80 AND 成绩 < 90;
同时我们还可以使用BETWEEN进行更简单的表达
SELECT 姓名,班级,成绩
FROM studentsCN
WHERE 成绩 BETWEEN 80 AND 90;
任意字符检索
如果我们忘记了某位同学的名字,只记得他/她的姓氏,那么我们就可以使用万用字符搭配WHERE语法进行检索,需要注意的是由于是关键词匹配,所以我们需要将等号改为LIKE
%
表示零个或多个任意字符
_
表示一个字符
SELECT 姓名,班级,成绩
FROM studentsCN
WHERE 姓名 LIKE '张%';
括号与优先逻辑
在WHERE部分中,我们提到了使用WHERE语法来对条件进行筛选,那么如果我们的条件叠加过多并且不符合逻辑顺序时,我们便需要使用括号来规定优先级来达到我们的需求
例如我们想要“找出1年1班或1年2班中成绩在80到90之间的同学”,直接写便是
成绩 BETWEEN 80 AND 90 AND 班级 = '1 年 1 班' OR 班级 = '1 年 2 班'
但是这样运行后会筛选出来1年1班成绩在80-90的同学和1年2班的所有同学
那我们如何解决呢,很简单,像数学一样使用小括号便可
SELECT 姓名,班级,成绩
FROM studentsCN
WHERE 成绩 BETWEEN 80 AND 90 AND (班级 = '1 年 1 班' OR 班级 = '1 年 2 班')
ORDER BY 班级;
这种便可以先执行OR再执行AND
同时我们可以用IN语法来简化OR的使用
SELECT 姓名,班级,成绩
FROM studentsCN
WHERE 成绩 BETWEEN 80 AND 90 AND (班级 IN ('1 年 1 班', '1 年 2 班'))
ORDER BY 班级;
这段代码的效果与上面是一样的
函数
除开基础的筛选功能,SQL如同EXCEL一样也支持函数的使用
常见函数
使用AVG()函数便可以求出对应值的平均值,同样道理还有SUM相加,MAX最大值,MIN最小值,COUNT计数
SELECT AVG(成绩), SUM(成绩), MAX(成绩), MIN(成绩), COUNT(成绩)
FROM studentsCN;
但是这样子表格显得太丑了,于是我们可以使用AS来重命名栏目头
SELECT AVG(成绩) AS 成绩平均, SUM(成绩) AS 成绩之和
FROM studentsCN;
四舍五入
上面的成绩平均小数点太多太繁琐了怎么办?我们可以使用ROUND语法进行四舍五入
如果我们想要对平均成绩保留一位小数
SELECT ROUND(AVG(成绩),1) AS 成绩平均, SUM(成绩) AS 成绩之和
FROM studentsCN;
分组
函数经常需要分组进行计算,这时候就用到了GROUP BY函数
SELECT 班级, ROUND(AVG(成绩),1) AS 成绩平均
FROM studentsCN
GROUP BY 班级
ORDER BY 成绩平均 DESC;
我们按照班级进行分组分别求出平均成绩,然后进行降序排列
在进行分组后如果我们想要继续进行筛选,那么我们需要使用HAVING而不是WHERE
所以我们可以尝试性地
SELECT 班级, ROUND(AVG(成绩),1) AS 成绩平均
FROM studentsCN
GROUP BY 班级
ORDER BY 成绩平均 DESC
HAVING 成绩平均 >= 80;
但是运行之后我们就会收获一个报错
这是因为SQL语法规定了一个特定的关键词顺序:
所以我们修改的方案就是将HAVING挪到ORDER BY之上:
SELECT 班级, ROUND(AVG(成绩),1) AS 成绩平均
FROM studentsCN
GROUP BY 班级
HAVING 成绩平均 >= 80
ORDER BY 成绩平均 DESC;
就可以顺利运行啦~
COUNT计数
SELECT COUNT(*)
FROM studentsCN;
我们可以用通配符来计算表格的总行数
SELECT COUNT(社团)
FROM studentsCN;
我们需要计量特定的元素时候只需要将通配符调整为对应的元素名即可
COUNT函数经常会配合DISTINCT来进行检索,在元素前面加上DISTINCT便会排除重复数据
SELECT COUNT(DISTINCT 社团)
FROM studentsCN;
这样便会显示一共有四个社团了~
而如果想要知道有哪些社团,我们只需要把COUNT函数去掉,DISTINCT便会返回它们的名字
SELECT DISTINCT(社团)
FROM studentsCN;
但是需要注意的是,DISTINCT不会排除NULL空值,所以我们想要排除空值的时候需要额外添加一行WHERE语法
SELECT DISTINCT(社团)
FROM studentsCN
WHERE 社团 IS NOT NULL
ORDER BY 社团;
建立与更新表格
建立与删除表格
我们使用CREATE TABLE指令可以新建一个表格。圆括号里面的内容为表格内容,分别为名称和数据类型,INT表示整数,VARCHAR表示一般的文字字串,同时使用后边的括号来规定字符串字数上限。
同时我们需要将表格中的一个栏目指定为主键(PRIMARY KEY),这个主键具有唯一性,类似于身份证号。
CREATE TABLE clubs (
社团编号 INT PRIMARY KEY,
社团名称 VARCHAR(15)
);
我们可以看到一个新的表格出现在了左边
而我们想要删除表格时候,只需要使用DROP TABLE命令即可
DROP TABLE clubs;
为表格输入资料与更新资料
我们使用INSERT INTO来为表格输入资料,后面圆括号中加入表头,并且VALUES后面的值与括号中的表头一一对应
最后我们打印出所有的表格检查是否输入成功
INSERT INTO clubs (社团编号, 社团名称)
VALUES (101, '吉他社'), (102, '篮球社'), (103, '美术社'), (104, NULL);
SELECT * FROM clubs;
然后我们可以使用UPDATE语法来更新表格,例如现在我们104社团知道了名称叫做舞蹈社
需要注意的是,我们需要使用WHERE来指定哪一个格子要更新,否则所有社团名称将会被重命名为舞蹈社
UPDATE clubs
SET 社团名称 = '舞蹈社'
WHERE 社团编号 = 104;
SELECT * FROM clubs;
同样地,我们可以使用DELETE来删除表格中的某一元素
DELETE
FROM clubs
WHERE 社团编号 = 104;
SELECT * FROM clubs;
[!WARNING]
一定要指定好WHERE对象,否则将会导致表格内所有内容被删除!!!
跨表格查询
为了清楚表示哪个表格的什么元素,在跨表格查询时我们需要在表格标题前加上表的名称用以定位,中间用.
加以连接
例如我们想要将studentsCN中的社团与clubs中的社团名称进行连接,那么我们用FROM规定基底表格为studentsCN,然后用LEFT JOIN将clubs表格加入其中
再定义studentsCN中的社团序列与clubs中的社团编号序列相等,完成连接
SELECT studentsCN.姓名, studentsCN.社团, clubs.社团名称
FROM studentsCN
LEFT JOIN clubs
ON studentsCN.社团 = clubs.社团编号
WHERE 班级 = '1 年 1 班';
如果我们不想看到返回空值的对象,只需要将LEFT JOIN改为INNER JOIN的内部连接即可
SELECT studentsCN.姓名, studentsCN.社团, clubs.社团名称
FROM studentsCN
INNER JOIN clubs
ON studentsCN.社团 = clubs.社团编号
WHERE 班级 = '1 年 1 班';
恶补速成大成功~
下一步就是Microshit Access速成啦www
不过当然不是今天——
打怪猎去啦(笑鼠)