一、单表查询
1.1基础查询
基础查询就是查询方式中最简单的查询方式,根据SELECT语句的语法就可以完成操作。
SELECT语句的基本语法如下:
SELECT<选择列表>
FROM[<模式名><基表名><视图名><相关名>]
列子:从TBL_Bookinfo表查询所有图书的记录内容
select*from TBL_Bookinf;
说明:
(1)select*from表示查什么,TBL_Bookinfo为从哪里查
(2)星号(*)是选取所有列的快捷方式,此时列的显示顺序和数据库表设计时的顺序保持一致。
1.2条件查询
条件查询就是查询满足条件的数据。这种查询方式是通过在查询语句中使用WHERE子句实现的,其基本语法如下。
SELECT<选择列表>
FROM[<模式名><基表名><视图名><相关名>]
WHERE<条件表达式>
WHERE子句常用的查询条件包括列名、运算符、值。
列子:在TBL_Bookinfo 表中查询95年及95年以后出版的书
select*from TBL_Bookinfo where PublishDate>='1995-1-1';
条件类型 | 运算符 | 描述 |
比较 | = | 等于 |
<> | 不等于 | |
> | 大于 | |
< | 小于 | |
>= | 大于等于 | |
<= | 小于等于 | |
确定范围 | BETWEEN AND | 在某个范围内 |
NOT BETWEEN AND | 不在某个范围内 | |
确定集合 | IN | 在某个集合内 |
NOT IN | 不在某个集合内 | |
字符匹配 | LIKE | 与某字符匹配 |
NOT LIKE | 与某字符不匹配 | |
空值 | IS NULL | 是空值 |
IS NOT NULL | 不是空值 | |
逻辑运算符 | AND | 两个条件都成立 |
OR | 只要一个条件成立 | |
NOT | 条件不成立 |
1.3列表查询
对于数值型的列,SQl标准提供了几种基本的算术运算符来查询数据。常用的有+(加)、-(减)、*(乘)、/(除)。
列子:单位计划给每名员工涨500元工资,请查询工资涨后的员工信息,查询语句如下:
SELECT employee_name,email,phone_num,hire_date,salart+500
FROM employee;
1.5分组查询
分组查询是在基础查询语句上添加GROUP BY(分组子句)进行分组统计查询
分组查询语法格式如下:
GROUP BY 字段名 [HAVING 条件表达式]
说明:
1.字段名:是按照该字段的值进行分组(分组是所依据的列名称)
2.HAVING条件表达式:用来限制分组后的显示,符合条件表达式的结果将被显示,不符合的结果将不显示
列子:显示各出版社在1990年以后出版的图书册数
select Publisher,count(*) from tbl_bookinfo
where PublisDate>='1990-1-1' group by publisher;
二、多表查询
2.1连接查询
链接查询分为内连接查询、外连接查询两种
内连接查询就是返回结果集仅包含满足全部连接条件记录的多连接查询。其一般语法格式为
SLECT 列名称 FROM 表名 INNER JOIN 连接表名 ON [连接条件]
在连接查询中用来连接两个表的条件称为连接条件或连接谓词,连接条件一般格式为
表1.列名1=表2.列名2
列子:查询出页数大于200页的图书索取号,书名,出版社,类别名
select a.bookid,a.bookname,a.publisher,b.classname
from tbl_bookinfo as a inner join tbl_bookclass as b
on a.classid=b.classid
where a.pagecount>200
外连接查询就是除返回满足连接条件的数据以外,还返回左,右或两个表中不满足条件的数据的一种多表连接查询。因此,外连接查询又分为左外连接查询,右外连接查询和全连接查询3种。其一般语法格式为
SELECT 列名称 FROM 表名[LEFT|RIGHT|FULL] OUTER JOIN 连接表名 ON[连接条件]
说明:
(1)LEFT OUTER JOIN:左外连接,是指除了符合条件的行,还要从ON语句的左侧表里选出不匹配的行;
(2)RIGHT OUTER JOIN:右外连接, 是指除了符合条件的行,还要从ON语句的右侧表里选出不匹配的行;
(3)FULL OUTER JOIN:全外连接,是指除了符合条件的行,还要从ON语句的两侧表里选出不匹配的行;
一个外连接的例子可以是:
假设我们有两个表,一个是顾客表(customer),另一个是订单表(order)。顾客表包含顾客的姓名、地址和电话等信息,订单表包含订单编号、订单日期和顾客ID等信息。我们可以使用外连接来找出所有的顾客以及他们的订单信息(如果有的话)。
具体而言,我们可以使用左外连接(left outer join)来找出所有的顾客及其订单信息。左外连接会保留左边表的所有记录,如果右表中没有与之匹配的记录,则右表中的所有列都会赋予 NULL 值。
SQL 查询语句如下:
SELECT *
FROM customer
LEFT OUTER JOIN order
ON customer.customer_id = order.customer_id;
这个查询语句会返回一个包含所有顾客及其订单信息的数据集,其中如果一个顾客没有任何订单,那么其订单信息中的所有列都会是 NULL。
2.2子查询
子查询是一个 SELECT 语句嵌套在另一个 SELECT、UPDATE、INSERT 或 DELETE 语句中的查询,用于检索数据并将结果返回给主查询。子查询通常用于限制结果集或生成与主查询无关的数据。子查询可以在 WHERE、HAVING、FROM 和 SELECT 子句中使用。
子查询基本语法格式如下:
SELECT column1, column2, ...
FROM table1
WHERE column1 OPERATOR (SELECT column3 FROM table2 WHERE condition);其中,OPERATOR是用于比较的运算符(例如=、<、>等)。在子查询中,指定一个表格,列名和条件以过滤数据。子查询将返回一个值或一组值,这些值将用于主查询中的条件过滤。
例如,以下查询使用子查询在“orders”表中查找 2019 年订单数量大于 100 的客户列表:
SELECT customer_name
FROM customers
WHERE customer_id IN
(SELECT customer_id
FROM orders
WHERE YEAR(order_date) = 2019
GROUP BY customer_id
HAVING COUNT(*) > 100);
在上面的查询中,子查询返回了 2019 年订单数量大于 100 的客户 ID,然后将这些客户 ID 传递给主查询以查找客户名称。
2.3联合查询
联合查询(Union Query)是一种SQL查询技术,它能够将两个或多个SELECT语句的查询结果组合成一个结果集,再将其呈现给用户。联合查询类似于集合操作中的联合运算,因此它也被称为“集合查询”。
在联合查询中,需要注意以下几点:
1. 联合查询的语法:使用UNION关键字将两个SELECT语句连接起来,形成一个查询语句。例如:
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;2. 联合查询的查询结果需要满足以下条件:
- 结果集中的列数和数据类型必须相同;
- 结果集中的数据行需要去重;
- 联合查询的语句中,只有第一个SELECT语句中的ORDER BY子句有效,其它SELECT语句中的ORDER BY子句无效。3. 可以使用UNION ALL关键字来保留所有重复的数据行。这意味着,使用UNION ALL会返回两个结果集的完整集合,包括重复的数据行。
4. 联合查询可以用于多表查询、子查询等场景,可以为用户提供更完整、准确的查询结果。
假设我们有两个表:students(学生)和 scores(成绩)。
students 表如下:
| id | name | age |
| ---- | -------- | ---- |
| 1 | Alice | 18 |
| 2 | Bob | 20 |
| 3 | Charlie | 19 |
| 4 | David | 21 |scores 表如下:
| id | student_id | subject | score |
| ---- | ----------| ------- | ----- |
| 1 | 1 | Math | 80 |
| 2 | 1 | English | 90 |
| 3 | 2 | Math | 75 |
| 4 | 2 | English | 85 |
| 5 | 3 | Math | 90 |
| 6 | 3 | English | 80 |
我们想要进行联合查询,得到每个学生的姓名、年龄和数学成绩。我们可以使用以下 SQL 语句:
SELECT students.name, students.age, scores.score
FROM students
JOIN scores
ON students.id = scores.student_id
WHERE scores.subject = 'Math'
这个查询使用了 JOIN 操作符,连接了 students 和 scores 表。我们用 ON 指定了连接条件,即 students.id 等于 scores.student_id。然后我们使用 WHERE 子句筛选出 subject 是 'Math' 的记录。最终得到以下结果:
| name | age | score |
| -------- | ---- | ----- |
| Alice | 18 | 80 |
| Bob | 20 | 75 |
| Charlie | 19 | 90 |