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

avatar
作者
猴君
阅读量:0

笛卡尔积(或交叉连接):
笛卡尔乘积是一个数学运算。假设我有两个集合 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 not   select * 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;   

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!