自学SQL入门(2)
查询结果Filtering过滤 和 sorting排序
DISTINCT语法用于从结果集中删除重复的行,只保留唯一的行。它可以用于SELECT语句中的任何列或表达式。
SELECT DISTINCT column1, column2, ...
FROM table_name
WHERE condition;
在上面的语法中,column1,column2等是要返回的列的名称,table_name是要查询的表的名称,condition是可选的WHERE子句,用于筛选结果集。
GROUP BY 语句是一种用于将查询结果按照指定列进行分组的 SQL 语句。它通常与聚合函数一起使用,以便统计每个分组中的数据。
例如,假设有一个包含学生姓名、课程和成绩的表格,我们想要统计每个学生的平均成绩,可以使用以下 SQL 语句:
SELECT name, AVG(score) FROM students
GROUP BY name;
这个语句将查询结果按照姓名进行分组,并使用 AVG 函数计算每个分组中成绩的平均值。
LIMIT 和 OFFSET 子句是 SQL 查询语句中用于限制返回结果集的两个关键字。
LIMIT 子句用于限制返回结果集的行数,可以指定要返回的行数的数量。
例如,如果要返回前 10 行数据,则可以使用以下语句:
SELECT * FROM table_name LIMIT 10;
OFFSET 子句用于指定从结果集中的哪一行开始返回数据。例如,如果要返回从第 11 行开始的 10 行数据,则可以使用以下语句
SELECT * FROM table_name LIMIT 10 OFFSET 10;
在某些数据库中,OFFSET 子句也可以使用关键字 OFFSET 替换为关键字 ROWS。例如,可以使用以下语句来实现相同的功能:
SELECT * FROM table_name FETCH NEXT 10 ROWS ONLY OFFSET 10;
LIMIT 和 OFFSET 子句通常与 ORDER BY 子句一起使用,以便按特定列对结果进行排序并限制结果集的大小。例如,以下查询将返回按列名排序的前 10 行数据:
SELECT * FROM table_name ORDER BY column_name LIMIT 10;
用JOINs进行多表联合查询
在SQL中,JOINs是一种用于将多个表连接起来的方法,以实现多表联合查询。以下是一些常见的JOINs类型:
INNER JOIN:返回两个表中匹配的行。
LEFT JOIN:返回左表中的所有行和右表中匹配的行。
RIGHT JOIN:返回右表中的所有行和左表中匹配的行。
FULL OUTER JOIN:返回左表和右表中的所有行。
假设我们有两个表:Customers和Orders。Customers表包含客户的信息,Orders表包含订单的信息。我们可以使用INNER JOIN将这两个表连接起来,以获取所有客户和他们的订单信息。
SELECT Customers.CustomerName, Orders.OrderID, Orders.OrderDate
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;
在上面的查询中,我们使用了INNER JOIN将Customers和Orders表连接起来。我们指定了连接条件,即两个表中的CustomerID列必须相等。然后,我们选择了要返回的列,即客户名称,订单ID和订单日期。
使用JOINs进行多表联合查询可以方便地从不同的表中检索相关数据,这对于大型数据库非常有用。
ORDER BY column ASC/DESC;
ORDER BY col_name 这句话的意思就是让结果按照 col_name 列的具体值做 ASC升序 或 DESC 降序
主键(primary key), 一般关系数据表中,都会有一个属性列设置为 主键(primary key)。主键是唯一标识一条数据的,不会重复复(想象你的身份证号码)。一个最常见的主键就是auto-incrementing integer(自增ID,每写入一行数据ID+1, 当然字符串,hash值等只要是每条数据是唯一的也可以设为主键.
特殊关键字 NULLs
IS NULL和 IS NOT NULL 来选在某个字段是否等于 NULL
在查询条件中处理 NULL
SELECT column, another_column, …
FROM mytable
WHERE column IS/IS NOT NULL
AND/OR another_condition
AND/OR …;
在查询中使用表达式
包含表达式的例子
SELECT particle_speed / 2.0 AS half_particle_speed (对结果做了一个除2)
FROM physics_data
WHERE ABS(particle_position) * 10.0 >500
(条件要求这个属性绝对值乘以10大于500);
每一种数据库(mysql,sqlserver等)都有自己的一套函数,包含常用的数字,字符串,时间等处理过程.具体需要参看相关文档。
AS关键字, 来给表达式取一个别名,普通的属性列甚至是表(table)都可以取一个别名.
AS使用别名
SELECT col_expression AS expr_description, …
FROM mytable;
在查询中进行统计
对全部结果数据做统计
SELECT AGG_FUNC(column_or_expression) AS aggregate_description, …
FROM mytable
WHERE constraint_expression;
常见统计函数
Function | Description |
---|---|
COUNT(*), COUNT(column) | 计数!COUNT(*) 统计数据行数,COUNT(column) 统计column非NULL的行数. |
MIN(column) | 找column最小的一行. |
MAX(column) | 找column最大的一行. |
AVG(column) | 对column所有行取平均值. |
SUM(column) | 对column所有行求和. |
分组统计
GROUP BY 数据分组语法可以按某个col_name对数据进行分组,如:GROUP BY Year指对数据按年份分组, 相同年份的分到一个组里。
SELECT age, AVG(score)
FROM students
GROUP BY age;
这将返回一个结果集,其中每一行表示一个年龄组及其对应的平均成绩。
GROUP BY语句可以使用多个列进行分组,例如:
SELECT age, gender, AVG(score)
FROM students
GROUP BY age, gender;
这将返回一个结果集,其中每一行表示一个年龄和性别组合及其对应的平均成绩。
注意,GROUP BY子句中的列必须在SELECT语句中出现,否则会导致语法错误。
HAVING 语法
HAVING是SQL语句中用于筛选分组数据的关键字,它通常与GROUP BY一起使用。
HAVING的语法如下:
SELECT column1, column2, ...
FROM table_name
WHERE condition
GROUP BY column1, column2, ...
HAVING condition
其中,HAVING关键字后面的条件是对分组后的数据进行筛选,只有满足条件的分组才会被返回。
假设有一个订单表orders,其中包含订单号、客户ID和订单金额等字段。现在需要查询每个客户的订单数量和订单总金额,只返回订单数量大于等于2且订单总金额大于等于100的客户信息。
可以使用如下SQL语句:
SELECT customer_id, COUNT(order_id) AS order_count, SUM(amount) AS total_amount FROM orders GROUP BY customer_id HAVING order_count >= 2 AND total_amount >= 100
注意,在使用HAVING关键字时,必须先使用GROUP BY对数据进行分组,否则会报错。
查询执行顺序
SELECT DISTINCT column, AGG_FUNC(column_or_expression), …
FROM mytable
JOIN another_table
ON mytable.column = another_table.column
WHERE constraint_expression
GROUP BY column
HAVING constraint_expression
ORDER BY column ASC/DESC
LIMIT count OFFSET COUNT;
1. FROM 和 JOINs
FROM 或 JOIN会第一个执行,确定一个整体的数据范围. 如果要JOIN不同表,可能会生成一个临时Table来用于 下面的过程。总之第一步可以简单理解为确定一个数据源表(含临时表)
2. WHERE
我们确定了数据来源 WHERE 语句就将在这个数据源中按要求进行数据筛选,并丢弃不符合要求的数据行,所有的筛选col属性 只能来自FROM圈定的表. AS别名还不能在这个阶段使用,因为可能别名是一个还没执行的表达式
3. GROUP BY
如果你用了 GROUP BY 分组,那GROUP BY 将对之前的数据进行分组,统计等,并将是结果集缩小为分组数.这意味着 其他的数据在分组后丢弃.
4. HAVING
如果你用了 GROUP BY 分组, HAVING 会在分组完成后对结果集再次筛选。AS别名也不能在这个阶段使用.
5. SELECT
确定结果之后,SELECT用来对结果col简单筛选或计算,决定输出什么数据.
6. DISTINCT
如果数据行有重复DISTINCT 将负责排重.
7. ORDER BY
在结果集确定的情况下,ORDER BY 对结果做排序。因为SELECT中的表达式已经执行完了。此时可以用AS别名.
8. LIMIT / OFFSET
最后 LIMIT 和 OFFSET 从排序的结果中截取部分数据.
结论
不是每一个SQL语句都要用到所有的句法,但灵活运用以上的句法组合和深刻理解SQL执行原理将能在SQL层面更好的解决数据问题,而不用把问题 都抛给程序逻辑.
SQL常用语法
SELECT语句:用于查询数据库中的数据,可以指定要查询的列、表、条件等。
INSERT INTO语句:用于向数据库中的表中插入数据,可以指定要插入的列、值等。
UPDATE语句:用于更新数据库中的数据,可以指定要更新的列、表、条件等。
DELETE语句:用于从数据库中删除数据,可以指定要删除的表、条件等。
WHERE语句:用于指定查询、更新、删除等语句中的条件,可以使用比较运算符、逻辑运算符等。
ORDER BY语句:用于指定查询语句的排序方式,可以按照指定列的升序或降序排序。
GROUP BY语句:用于将查询结果按照指定列进行分组,可以使用聚合函数进行统计。
JOIN语句:用于将两个或多个表中的数据进行关联,可以使用不同类型的JOIN操作。
UNION语句:用于将多个SELECT语句的结果合并成一个结果集,可以使用UNION ALL指定是否去重。
LIMIT语句:用于指定查询结果的返回数量,可以限制结果集的大小。