欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > SQL语句(以MySQL为例)——单表、多表查询

SQL语句(以MySQL为例)——单表、多表查询

2024/11/29 17:30:41 来源:https://blog.csdn.net/weixin_44040169/article/details/140657666  浏览:    关键词:SQL语句(以MySQL为例)——单表、多表查询

笛卡尔积(或交叉连接):
笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是第一个对象来自于 X,第二个对象来自于 Y 的所有可能。组合的个数即为两个集合中元素个数的乘积数。
使用 CROSS JOIN表示交叉连接。它的作用就是可以把任意表进行连接,即使这两张表不相关。

1.多表联查

多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。

前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。

SELECT	table1.column, table2.column
FROM	table1, table2
WHERE	table1.column1 = table2.column2;  #连接条件

1.等值连接和非等值连接

SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id,departments.location_id
FROM   employees, departments
WHERE  employees.department_id = departments.department_id;

表的别名:使用别名可以简化查询。列名前使用表名前缀可以提高查询效率。
使用别名后:

SELECT e.employee_id, e.last_name, e.department_id,d.department_id, d.location_id
FROM   employees e , departments d
WHERE  e.department_id = d.department_id;

等值:是where条件那一行在两表中的值是相等的。
非等值:是where条件那一行的值不与另一表中的行相等,而是其他关系。

非等值例子:EMPLOYEES表中员工工资应在JOB_GRADES表的最高工资和最低工资之间。

SELECT e.last_name, e.salary, j.grade_level
FROM   employees e, job_grades j
WHERE  e.salary BETWEEN j.lowest_sal AND j.highest_sal;

2.自连接

当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询。

SELECT CONCAT(worker.last_name ,' works for ' , manager.last_name)
FROM   employees worker, employees manager
WHERE  worker.manager_id = manager.employee_id ;

3.内连接&外连接

  • 内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

  • 外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。

    • 如果是左外连接,则连接条件中左边的表也称为主表,右边的表称为从表。

    • 如果是右外连接,则连接条件中右边的表也称为主表,左边的表称为从表。

9种Join方式

在这里插入图片描述

(1)inner

SELECT  o.order_id, o.customer_id, o.order_date, o.amount, c.customer_name
FROM orders o
INNER JOIN customers c
ON o.customer_id = c.customer_id;

不包含不匹配的,指的是,不是列属性。
在这里插入图片描述

(2)LEFT JOIN

左外连接,则连接条件中左边的表也称为主表,右边的表称为从表。

SELECT  o.order_id, o.customer_id, c.customer_id, o.order_date, o.amount, c.customer_name
FROM orders o
LEFT JOIN customers c
ON o.customer_id = c.customer_id;

在这里插入图片描述

(4)RIGHT JION

右外连接,则连接条件中右边的表也称为主表,左边的表称为从表。

(5)LEFT JOIN WHERE IS NULL

左为主表,把两个表相同的部分行扣去

SELECT  o.order_id, o.customer_id, c.customer_id, o.order_date, o.amount, c.customer_name
FROM orders o
LEFT JOIN customers c
ON o.customer_id = c.customer_id;
WHERE c.customer_id IS NULL

(6)RIGHT JOIN WHERE IS NULL

右为主表,把两个表相同的部分行扣去

UNION

合并查询结果
利用UNION关键字,将多条SELECT语句的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。

  • UNION 操作符返回两个查询的结果集的并集,去除重复记录。
  • UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

这个博客介绍得很详细,例子也很清楚 MYSQL多表查询

2.单表查询

select 字段列表
from 表名列表 
where 条件列表
group by分组字段
having分组后条件
order by排序字段
limit分页限定

条件查询

在这里插入图片描述


查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息select * from stu where age = 18 or age = 20 or age = 22;
select * from stu where age in (18,20 ,22);null值的比较不能使用 = 或者 != 。需要使用 is 或者 is notselect * from stu where english is null;
select * from stu where english is not null;

模糊查询

模糊查询使用like关键字,可以使用通配符进行占位:

(1)_ : 代表单个任意字符

(2)% : 代表任意个数字符


select * from stu where name like '_花%';

排序查询

select 字段列表 from 表名 order by 排序字段名1 [排序方式1],排序字段名2 [排序方式2] …;
ASC : 升序排列 (默认值)
DESC : 降序排列
注:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序

查询学生信息,按照年龄升序排列
select * from stu order by age ;查询学生信息,按照数学成绩降序排列select * from stu order by math desc ;查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列select * from stu order by math desc , english asc ;

聚合查询

函数名 功能
count(列名) 统计数量(一般选用不为null的列)
max(列名) 最大值
min(列名) 最小值
sum(列名) 求和
avg(列名) 平均值

select 聚合函数名(列名) from;
注意:null 值不参与所有聚合函数运算统计班级一共有多少个学生
select count(*) from stu;查询数学成绩的最高分
select max(math) from stu;查询数学成绩的最低分
select min(math) from stu;查询数学成绩的总分
select sum(math) from stu;查询数学成绩的平均分
select avg(math) from stu;查询英语成绩的最低分
select min(english) from stu;

分页查询

select 字段列表 from 表名 limit  起始索引 , 查询条目数;

起始索引计算公式:
起始索引 = (当前页码 - 1) * 每页显示的条数

0开始查询,查询3条数据
select * from stu limit 0 , 3;每页显示3条数据,查询第1页数据
select * from stu limit 0 , 3;每页显示3条数据,查询第2页数据
select * from stu limit 3 , 3;每页显示3条数据,查询第3页数据
select * from stu limit 6 , 3;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com