您的位置:首页 > 数据库 > MySQL

MySQL系列:单表&多表数据查询

2016-03-21 21:32 417 查看
一、查询相关概念 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、XORBETWEEN
min_num AND max_numIN
(element1, element2, ...)IS NULL:为空值IS NOT NULL:非空LIKE: %表示任意长度的任意字符、_表示任意单个字符;RLIKE:REGEXP:匹配字符串可用正则表达式书写模式;5) GROUP:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算:6) HAVING: 对分组聚合运算后的结果指定过滤条件;7) ORDER BY: 根据指定的字段对查询结果进行排序;升序:ASC、降序:DESC8) 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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息