本文使用 SQLBolt 学习SQL并在线练习
单表查询
SELECT column, another_column, …
FROM mytable
WHERE condition(s)
ORDER BY column ASC/DESC
LIMIT num_limit OFFSET num_offset;
上述SQL语句中,大写的为关键字(实际上有些数据库对关键字的大小写不敏感)
SELECT column, another_column, …表示查询出表中 列名为 column、another_column 的值。多个列用逗号隔开,也可以用SELECT *查出所有列;FROM mytable表示查询的数据表为 mytableWHERE condition(s)表示查询条件,多个条件可以用AND或OR连接,AND 表示条件且,OR表示条件或。condition 的写法有以下几种- 用比较符号:
=, !=, < <=, >, >=例如user_name="taget"搜索出 user_name 为 taget 的数据 BETWEEN … AND …例如user_age BETWEEN 18 AND 35搜索出 user_age 在 18 ~ 35 之间的数据NOT BETWEEN … AND …例如user_age NOT BETWEEN 18 AND 35搜索出 user_age 不在 18 ~ 35 之间的数据IN (…)例如city_name IN ("hangzhou", "shanghai")搜索出 city_name 为 hangzhou、shanghai 的数据NOT IN (…)例如city_name NOT IN ("hangzhou", "shanghai")搜索出 city_name 不为 hangzhou、shanghai 的数据
- 用比较符号:
ORDER BY column ASC/DESC表示搜索结果排序顺序,ASC为正序,DESC为倒序LIMIT num_limit OFFSET num_offset;表示限制搜索结果的条数,常用于分页,比如查 1~10 条可以写LIMIT 10,查 11~20 条可以写LIMIT 10 OFFSET 10
联表查询
SELECT column, another_column, …
FROM mytable
INNER/LEFT/RIGHT/FULL JOIN another_table ON mytable.id = another_table.matching_id
WHERE condition(s)
ORDER BY column, … ASC/DESC
LIMIT num_limit OFFSET num_offset;
联表查询主要有以下四种连接方式:
- INNER JOIN,查询结果取两个表的交集,返回两张表都满足条件的部分
- LEFT JOIN,左连接会返回左表中的所有记录,加上右表中匹配到的记录。
- RIGHT JOIN,以右边的表为参考表,如果右表的某行在左表中没有匹配行,左表就返回空值。
- FULL JOIN,只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行,结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
业务中见过最多的是 LEFT JOIN,例如:
上面两张表为 buildings 和 empolyees,查询语句为 SELECT DISTINCT building_name, role, name FROM buildings LEFT JOIN employees ON building_name = building;
查询结果如图,查出了每个建筑(building)对应的任职人员(empolyee)的职位和名字
表达式查询
SELECT title, year, length_minutes * 60 as length_second
FROM movies
WHERE year % 2 = 0;
SELECT title, year, length_minutes * 60 as length_second表示查询结果中,将 length_minutes 列乘以60的值,给到 length_second 列WHERE year % 2 = 0;表示查询结果中,筛选出年份为偶数的数据
详细源数据、查询语句和查询结果如下图:
聚合查询
SELECT AGG_FUNC(column_or_expression) AS aggregate_description, …
FROM mytable
GROUP BY column;
SELECT AGG_FUNC(column_or_expression) AS aggregate_description, …AGG_FUNC(column_or_expression) 表示聚合查询语句GROUP BY column;表示查询结果按 column 来分组
详细源数据、查询语句和查询结果如下图:
SELECT role, COUNT(*)
FROM employees
GROUP BY role;
以上查询语句的目的是查出 employees 表中,每种角色(role)的个数。COUNT(*) 表示查询数量,GROUP BY role;表示按 role 分组出结果