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