一、查询相关概念
1.笛卡尔积:没有连接条件表关系返回的结果
表一字段a,行数b;表二字段c,行数d
表一和表二的笛卡尔积:字段=a+c 行数=b*d
2.连接类型
内连接(INNER JOIN):表关系笛卡尔积数据,仅保留表关系中所有匹配记录
自然连接:根据表关系中相同名称的字段自动进行记录匹配,再去重
内连接查询中存在的一种特殊的等值连接,表与其自身进行连接
等值连接:表关系笛卡尔积中,选择所匹配字段值相等的数据记录
不等值连接:!=
3.连接方式
外连接(OUTER JOIN):表关系笛卡尔积数据,不仅保留表中所有匹配数据,还会保留部分不匹配的数据记录
外链接查询返回操作表中至少一个表的所有数据
左外连接:表关系笛卡尔积数据除了选择匹配数则记录,还包含关联左表中不匹配记录,以左边表为主保留
FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
右外连接:…右边表
FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
全外连接:…左右两边表全
4.子查询(嵌套查询):查询之中嵌套了其他若干查询
子查询:在查询语句嵌套着查询语句 、基于某语句的查询结果再次进行的查询
IN:主查询的条件是子查询的查询结果
ANY:主查询的条件为满足子查询查询返回查询结果中任意一条数据
= ANY > ANY < ANY三种
ALL:主查询的条件为满足子查询查询返回查询结果中所有数据
EXISTS:布尔型,ture&false
二、单表数据查询
1.基本介绍
(1)SELECT原理
Query Cache查询缓存组件,再查询结果确定是有用
查询执行路径中的组件:查询缓存、解析器、预处理器、优化器、查询执行引擎、存储引擎;
(2)SELECT语句的执行流程
FROM Clause --> WHERE Clause --> GROUP BY --> HAVING Clause --> ORDER BY --> SELECT --> LIMIT
(3)单表查询语法
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[SQL_CACHE | SQL_NO_CACHE]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[FOR UPDATE | LOCK IN SHARE MODE]
说明:
1) DISTINCT:数据去重;
2) SQL_CACHE: 显式指定存储查询结果于缓存之中;
SQL_NO_CACHE: 显式查询结果不予缓存;
说明:
query_cache_type的值为'ON'时,查询缓存功能打开;
SELECT的结果符合缓存条件即会缓存,否则,不予缓存;显式指定SQL_NO_CACHE,不予缓存;
query_cache_type的值为'DEMAND'时,查询缓存功能按需进行;
显式指定SQL_CACHE的SELECT语句才会缓存;其它均不予缓存;
3) 字段显示可以使用别名:col1 AS alias1, col2 AS alias2, ...
4) WHERE子句:指明过滤条件以实现“选择”的功能;过滤条件为布尔型表达式;
支持语法格式:
算术操作符:+, -, *, /, %
比较操作符:=, !=, <>, <=>, >, >=, <, <=
逻辑操作符:NOT、AND、OR、XOR
BETWEEN min_num AND max_num
IN (element1, element2, ...)
IS NULL:为空值
IS NOT NULL:非空
LIKE: %表示任意长度的任意字符、_表示任意单个字符;
RLIKE:
REGEXP:匹配字符串可用正则表达式书写模式;
5) GROUP:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算:
6) HAVING: 对分组聚合运算后的结果指定过滤条件;
7) ORDER BY: 根据指定的字段对查询结果进行排序;
升序:ASC、降序:DESC
8) LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制;
9) 对查询结果中的数据请求施加“锁”:
FOR UPDATE: 写锁,排他锁;
LOCK IN SHARE MODE: 读锁,共享锁
2.避免重复查询
SELECT DISTINCT field1,field n FROM table_name
注意:四则运算:用AS定义别名,或省略AS关键字
3.显示格式查询
SELECT CONCAT(field格式) 【AS 别名】FROM table_name
4.条件数据查询
SELECT field1,field n FROM table_name WHERE CONDITION
_通配符:匹配单一字符
%通配符:任意长度字符
5.排序查询
SELECT field1,field n FROM table_name WHERE CONDITION ORDER BY filedldm1 [ASC|DESC] [,filedldm1 [ASC|DESC],]
6.限制数据记录查询数量
SELECT field1,field n FROM table_name WHERE CONDITION LIMIT OFFSET_START,ROW_COUNT
7.统计函数和分组数据记录查询
COUNT()函数、AVG()函数、SUM()函数、MAX()函数、MIN()函数
8.分组数据查询
SELECT function() FROM table_name WHERE CONDITION GROUP BY field
9.实现统计功能的分组数据查询
SELECT GROUP_CONCAT(field) FROM table_name WHERE CONDITION GROUP BY field
10.多字段分组查询
SELECT GROUP_CONCAT(field), function(field) FROM table_name WHERE CONDITION GROUP BY field1,field2……fieldn
11.HAVING子句限定分组查询
SELECT function(field) FROM table_name WHERE CONDITION GROUP BY field1,field2……fieldn HAVING CONTITION
注意:
WHERE:实现条件限制数据记录
HAVING:实现条件限制分组数据记录
三、多表数据查询
1.多表查询实现方式
(1) FROM子句利用(,)区分多个表,在WHERE子句中通过逻辑表达式来实现匹配条件
(2) FROM子句用 ”JOIN ON”,ON后接条件
2.子查询
(1)用在WHERE子句中的子查询
1) 用于比较表达式中的子查询;子查询仅能返回单个值;
SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);
2) 用于IN中的子查询:子查询应该单键查询并返回一个或多个值从构成列表;
SELECT Name,Age FROM students WHERE Age IN (SELECT Age FROM teachers);
3) 用于EXISTS;
(2)用于FROM子句中的子查询
使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
示例:
SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;
(3)联合查询:UNION
SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;