SQL练习之单表查询、联表查询、表达式查询、聚合查询

111 阅读3分钟

本文使用 SQLBolt 学习SQL并在线练习

单表查询

SELECT column, another_column, … 
FROM mytable 
WHERE condition(s) 
ORDER BY column ASC/DESC
LIMIT num_limit OFFSET num_offset;

上述SQL语句中,大写的为关键字(实际上有些数据库对关键字的大小写不敏感)

  1. SELECT column, another_column, … 表示查询出表中 列名为 column、another_column 的值。多个列用逗号隔开,也可以用 SELECT * 查出所有列;
  2. FROM mytable 表示查询的数据表为 mytable
  3. WHERE 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 的数据
  4. ORDER BY column ASC/DESC 表示搜索结果排序顺序,ASC为正序,DESC为倒序
  5. 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;

联表查询主要有以下四种连接方式:

  1. INNER JOIN,查询结果取两个表的交集,返回两张表都满足条件的部分
  2. LEFT JOIN,左连接会返回左表中的所有记录,加上右表中匹配到的记录。
  3. RIGHT JOIN,以右边的表为参考表,如果右表的某行在左表中没有匹配行,左表就返回空值。
  4. FULL JOIN,只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行,结合了 LEFT JOIN 和 RIGHT JOIN 的结果。

业务中见过最多的是 LEFT JOIN,例如:

image.png

上面两张表为 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;
  1. SELECT title, year, length_minutes * 60 as length_second 表示查询结果中,将 length_minutes 列乘以60的值,给到 length_second 列
  2. WHERE year % 2 = 0; 表示查询结果中,筛选出年份为偶数的数据

详细源数据、查询语句和查询结果如下图:

image.png

聚合查询

SELECT AGG_FUNC(column_or_expression) AS aggregate_description, … 
FROM mytable 
GROUP BY column;
  1. SELECT AGG_FUNC(column_or_expression) AS aggregate_description, … AGG_FUNC(column_or_expression) 表示聚合查询语句
  2. GROUP BY column; 表示查询结果按 column 来分组

详细源数据、查询语句和查询结果如下图:

image.png

image.png

SELECT role, COUNT(*)
FROM employees
GROUP BY role;

以上查询语句的目的是查出 employees 表中,每种角色(role)的个数。COUNT(*) 表示查询数量,GROUP BY role;表示按 role 分组出结果

参考教程