select语句
SELECT 语句用于从数据库中选取数据。
结果被存储在一个结果表中,称为结果集。
select语句语法格式
SELECT[ALL | DISTINCT] 输出表达式,...
[FROM 表名1[ , 表名2 ]..... ] /*FROM子句*/
[WHERE 条件] /*WHERE子句*/
[GROUP BY {列名|表达式|列编号}
[ASC|DESC], ...] /*GROUP子句*/
[HAVING 条件] /*HAVING子句*/
[ORDER BY {列名|表达式|列编号}
[ASC|DESC], ...] /*ORDER BY子句*/
[LIMIT {[偏移量,]行数|行数OFFSET偏移量}] /*LIMIT子句*/
1 FROM子句
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,之间用逗号分隔。
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。
1.1 FROM子句基本用法
SELECT 字段名1, 字段名2, … FROM 表名;
1.2 SELECT FROM语句示例
SELECT * FROM tbl_bookinfo;
/*查询tbl_bookinfo里所有列*/
SELECT name,score FROM students;
/*查询students表里的name列和score列*/
2 WHERE子句
WHERE 子句用于提取那些满足指定条件的记录。
2.1WHERE子句基本用法
SELECT 字段名 FROM 表名 WHERE 条件表达式
2.2WHERE子句示例
SELECT * FROM student WHERE address = '内蒙古自治区'
/*查询所有addre为内蒙古自治区的字段*/
SELECT 学号,课号,成绩1+成绩2 AS 总成绩
FROM student
WHERE 成绩1*0.7+成绩2*0.3 >= 90
/*也可以加上关系运算符*/
3 GROUP BY子句
GROUP BY子句主要用于以下两个方面
数据分组:通过指定要分组的列或表达式,可以将查询结果按照指定的分组标准进行分组。这对于数据分析和生成报告非常有用,可以根据不同的分组条件来汇总数据
聚合计算:在GROUP BY子句中,通常会结合使用聚合函数(如SUM、COUNT、AVG等)对每个分组的数据进行计算。这使得我们可以在每个分组上执行统计、汇总等操作
GROUP BY 子句需要和 SELECT 语句一起使用
如果有 WHERE 子句,那么 WHERE 子句需要放在 GROUP BY 子句之前
如果有 ORDER BY 子句,那么 ORDER BY 子句需要放在 GROUP 子句之后
3.1 GROUP BY基本用法
SELECT 字段名1,字段名2 FROM 表名 GROUP BY 字段名
3.2GROUP BY示例
某个员工信息表结构和数据如下
id name dept salary edlevel hiredate
1 张三 开发部 2000 3 2009-10-11
2 李四 开发部 2500 3 2009-10-01
3 王五 设计部 2600 5 2010-10-02
4 王六 设计部 2300 4 2010-10-03
5 马七 设计部 2100 4 2010-10-06
6 赵八 销售部 3000 5 2010-10-05
7 钱九 销售部 3100 7 2010-10-07
8 孙十 销售部 3500 7 2010-10-06
SELECT DEPT, MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT
查询结果如下:
DEPT MAXIMUM
开发部 2500
设计部 2600
销售部 3500
4 HAVING子句
HAVING子句的位置位于GROUP BY子句之后和ORDER BY子句之前。它可以使用聚合函数、列名或表达式作为条件,来过滤分组。
4.1HAVING子句基本用法
SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1
HAVING condition;
/*
参数说明:
column1:要检索的列。
aggregate_function(column2):一个聚合函数,例如SUM、COUNT、AVG等,应用于column2的值。
table_name:要从中检索数据的表。
GROUP BY column1:根据column1列的值对数据进行分组。
HAVING condition:一个条件,用于筛选分组的结果。只有满足条件的分组会包含在结果集中。
*/
5 ORDER BY子句
MySQL 表中使用 SELECT 语句来读取数据。
如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
MySQL ORDER BY(排序) 语句可以按照一个或多个列的值进行升序(ASC)或降序(DESC)排序。
5.1ORDER BY子句基本用法
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
/*
参数说明:
column1, column2, ... 是你要选择的列的名称,如果使用 * 表示选择所有列。
table_name 是你要从中查询数据的表的名称。
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...
是用于指定排序顺序的子句。ASC 表示升序(默认),DESC 表示降序。
*/
6 LIMIT子句
在SELECT语句中使用LIMIT子句来约束结果集中的行数。LIMIT子句接受一个或两个参数。两个参数的值必须为零或正整数。
6.1 LIMIT子句基本用法
SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column_name [ASC | DESC]]
[LIMIT number];
/*
参数说明:
column1, column2, ... 是你想要选择的列的名称,如果使用 * 表示选择所有列。
table_name 是你要从中查询数据的表的名称。
WHERE condition 是一个可选的子句,用于指定过滤条件,只返回符合条件的行。
ORDER BY column_name [ASC | DESC] 是一个可选的子句,用于指定结果集的排序顺序,默认是升序(ASC)。
LIMIT number 是一个可选的子句,用于限制返回的行数。
*/
多表连接
若一个查询同时涉及两个或两个以上的表, 则称之为连接查询(在FROM子句中体现)。 参与连接的表可有多个,但连接操作在两个表之间进行,即两两连接。
1 INNER JOIN内连接
获取两个表中字段匹配关系的记录。
1.2基本用法
SELECT column1, column2, ...
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;
/*
参数说明:
column1, column2, ... 是你要选择的列的名称,如果使用 * 表示选择所有列。
table1, table2 是要连接的两个表的名称。
table1.column_name = table2.column_name 是连接条件,指定了两个表中用于匹配的列。
*/
1.3使用表别名
SELECT a.order_id, b.customer_name
FROM orders AS a
INNER JOIN customers AS b ON a.customer_id = b.customer_id;
1.4多表 INNER JOIN
SELECT orders.order_id, customers.customer_name, products.product_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id
INNER JOIN order_items ON orders.order_id = order_items.order_id
INNER JOIN products ON order_items.product_id = products.product_id;
1.5使用 WHERE 子句进行过滤
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id
WHERE orders.order_date >= '2023-01-01';
2 LEFT JOIN左连接
LEFT JOIN 返回左表的所有行,并包括右表中匹配的行,如果右表中没有匹配的行,将返回 NULL 值
2.1 基本用法
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name;
2.2 使用表别名
SELECT c.customer_id, c.customer_name, o.order_id
FROM customers AS c
LEFT JOIN orders AS o ON c.customer_id = o.customer_id;
2.3 多表 LEFT JOIN
SELECT customers.customer_id, customers.customer_name, orders.order_id, products.product_name
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
LEFT JOIN order_items ON orders.order_id = order_items.order_id
LEFT JOIN products ON order_items.product_id = products.product_id;
2.3 使用 WHERE 子句进行过滤
SELECT customers.customer_id, customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
WHERE orders.order_date >= '2023-01-01' OR orders.order_id IS NULL;
3 RIGHT JOIN 右链接
RIGHT JOIN 返回右表的所有行,并包括左表中匹配的行,如果左表中没有匹配的行,将返回 NULL 值
3.1 基本用法
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;
/*
其余和左连接类似
*/
子查询
子查询或称为内部查询、嵌套查询,指的是在 SQLite 查询中的 WHERE 子句中嵌入查询语句。
一个 SELECT 语句的查询结果能够作为另一个语句的输入值。
子查询通常与 SELECT 语句一起使用。
1 基本用法
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])