这是第二次打卡作业了,这一次的主要内容是基础的SQL语句,但是有个概念我们要搞清楚,就是什么是SQL、什么是MySQL。以下的语句都是基于MySQL。
什么是SQL
SQL是Structured Query Language的缩写,中文叫做结构化查询语言,是专门用来操作数据库的。
什么是MySQL
MySQL是一款数据库软件,当然,站在语言的角度也是一门语言,是遵循SQL的一些准则便携的语言实例。SQL是标准,而MySQL是具体的实现。
SELECT FROM查询语句
基础用法
SElECT查询语句可以说会是数据库中使用最多的语句了。他可以查询数据表中的内容。如果你想要从数据库中查询某个信息,你最少需要提供两个信息。
- 想要查询的字段名(域名)
- 想要查询的表名
SELECT name
FROM student
上面的这条语句就是从student表中检索一个字段名为name的列。这是最简单的用法,SELECT语句还有很多子语句,我们会在下面介绍。当然,你也可以查询多个列,就像下面这个样子,字段名的中间使用逗号隔开就好。当然,你也可以使用*号,来返回所有的列。
SELECT id,
name,
sex
FROM student
去重语句
我们使用上面的查询语句会有一个很重要的问题,就是他会将所有的查询结果返回给我们,但是也许我们只是想要不同的那一部分。这时,我们可以使用DISTINCT关键字,将它放在相应的字段名前即可
SELECT DISTINCT id,
FROM products
这样的话就会将不同的id帮你检索出来,还有一个很重要的问题,便是如果DISTINCT后面跟了多个字段名,那么这两个字段都会起作用,也就是说除非两行的这两个字段是一模一样的,否则就会被检索出来。
限制结果
有些时候我们期望检索从某个位置开始,返回这之后匹配到的指定数量的数据,这时便是限制结果起作用的时候了。
SELECT name
FROM products
LIMIT 5;
上面的语句便是告诉数据库只返回检索到的5个数据,limit子语句还有一个关键字,允许告诉数据库从距离起始位置多少个数量的地方开始检索数据
SELECT name
FROM products
LIMIT 5 OFFSET 5
上面的语句就是告诉数据库从便宜起始位置5个数量的地方开始检索,并且检索的数据量不超过5个。也可以使用简写的方式,LIMIT 5,5;
WHERE筛选语句
上面我们已经看了基本的SELECT语句了,但是上面的无法满足我们更多的需求,我们使用数据库查询数据更多的时候是需要提供一些条件的,这时我们便需要用到WHERE子语句。例如我们从学生表中查询学号为10的学生名
SELECT name
FROM student
WHERE id = 10;
最下面的WHERE语句后面跟的是条件,当然我们也可以复合,使用AND、OR操作符(可以想象成编程语言的&&、||操作符)
AND
SELECT name
FROM student
WHERE age < 18 AND sex = female;
上面的查询语句表示要查询年龄小于18岁,并且性别为男性的学生。
OR
SELECT name
FROM student
WHERE age < 18 OR age >20;
上面的查询语句表示要查询年龄小于18岁,或者年龄大于20岁的学生。
BETWEEN AND
使用BETWEEN AND操作符可以将某个条件限定在一定范围之内,我们可以将上面的查询在18到20岁年龄区间的改为使用BETWEEN AND查询
SELECT name
FROM student
WHERE age BETWEEN 18 AND 20;
还有一些简答的单个操作符就不再一一介绍了,具体可以去查相关文档
ORDER BY排序语句
当我们有了我们想要数据,我们还是不满足,返回来一大堆数据,毫无顺序可言,这怎么看,这是ORDER BY排序语句就登场了。ORDER BY可以按照升降序排列。默认是升序,想要使用降序时可以使用DESC关键字
SELECT name
FROM products
ORDER BY name;
这样的话就会按照name字段的字典顺序排列,如果想要变为降序,只需在ORDER BY的语句后面添加DESC。
SELECT name
FROM products
ORDER BY name DESC;
还有可以按照多个列排序
SELECT id, price, name
FROM products
ORDER BY price, name;
上面的例子就是按照多个列排序,这里问题是只有第一个排序条件相同时第二个才会起作用。
GROUP BY子句与HAVING子句
GROUP BY子句
我们直接看一个例子
SELECT id, COUNT(*) AS count
FROM products
GROUP BY id;
--结果
id count
BRS01 3
DLL01 4
FNG01 2
上面的例子返回的结果有两个列,其中第一列为id,第二列为第一列id的数量,其实是GROUP BY帮我们根据id分了组,然后再每个组各自计算的数量。有个一个需要注意的地方,GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前
HAVING子句
依然是来看例子
SELECT id, COUNT(*) AS count
FROM orders
GROUP BY id
HAVING COUNT(*) >= 2;
上面的语句基本与上一个例子相同,只是最后一行多了HAVING子句,表示查询分组之后的数据中数量大于2的分组
函数
函数有日期处理函数、熟知处理函数、字符处理函数、聚合函数,我们就来看看应该是使用最多的的聚合函数的用法吧
聚合函数

--平均值函数
SELECT AVG(price) AS avg_price
FROM products;
--总数函数
SELECT COUNT(*) AS cust
FROM products;
--最大值函数
SELECT MAX(price) AS max_price
FROM products;
--最小值函数
SELECT MIN(price) AS min_price
FROM products;
-- 求和函数
SELECT SUM(quantity) AS items_ordered
FROM orderItems
WHERE order_num = 20005;
作业
作业一
第一步:创建数据表&插入数据
CREATE DATABASE test;
USE test;
CREATE TABLE if NOT EXISTS email(
ID INT NOT NULL PRIMARY KEY,
Email VARCHAR(255)
);
INSERT INTO email VALUES('1','a@b.com');
INSERT INTO email VALUES('2','c@d.com');
INSERT INTO email VALUES('3','a@b.com');
第二步:查询数据
SELECT Email
FROM email
GROUP BY Email
HAVING COUNT(*) >=2;
结果图:

作业二
第一步:创建数据表&插入数据
CREATE TABLE if not exists World(
name VARCHAR(50) NOT NULL,
continent VARCHAR(50) NOT NULL,
area INT NOT NULL,
population INT NOT NULL,
gdp INT NOT NULL
);
INSERT INTO World
VALUES('Afghanistan','Asia',652230,25500100,20343000);
INSERT INTO World
VALUES('Albania','Europe',28748,2831741,12960000);
INSERT INTO World
VALUES('Algeria','Africa',2381741,37100000,188681000);
INSERT INTO World
VALUES('Andorra','Europe',468,78115,3712000);
INSERT INTO World
VALUES('Angola','Africa',1246700,20609294,100990000);
第二步:查询数据
SELECT name,population,area
FROM World
WHERE area >= 3000000
OR (population >= 25000000 AND gdp >= 20000000);
结果图:
