表子查询:返回的结果集是一个行的集合,N行N列(N>=1)。表子查询经常用于父查询的FROM子句中。 行子查询:返回的结果集是一个列的集合,一行N列(N>=1)。...行子查询可以用于福查询的FROM子句和WHERE子句中。 列子查询:返回的结果集是一个行的集合,N行一列(N>=1)。 标量子查询:返回的结果集是一个标量集合,一行一列,也就是一个标量值。...ANY:与比较操作符联合使用,ANY关键字必须接在一个比较操作符的后面,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE 。 SOME:ANY 的别名,较少使用。 ...ALL:与比较操作符联合使用,ALL关键字必须接在一个比较操作符的后面,表示与子查询返回的所有值比较都为 TRUE ,则返回 TRUE 。 ...使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,如果内层查询语句查询到满足条件的记录,只要子查询中至少返回一个值,则EXISTS语句的值就为True。
从第1行开始,查询2行(数据库第一行为第0行) ? 查询前4行: ? Part.2 高级操作 高级操作 1、排序 order by 降序排序: ? 升序排序: ? 2、group by 语法 ?...但这样相同类型只会显示一行,应该联合其他聚合函数进行查询。 例如此处将相同城市的电话号码加起来: ? 3、union select 联合查询 ? and 1=2 可以把前面表格的内容屏蔽掉 ?...Part.3 Information_schema 数据库 元数据库 在Mysql数据库5.0版本中存在着一个元数据库information_schema,其中存放着用户在Mysql中创建的所有其他数据库的信息...原数据库中几张重要的表: schemata:用于存放所有数据库的名称 tables:用于存放所有数据库中数据表的名字 columns:用于存放所有数据库的所有数据表中的所有字段的名字 1、查询所有数据库名称...在or条件下前后如果都为真则返回所有结果,否则只返回条件为真的一方的值。 Part.5 结语 这就是今天的全部内容了,大家都明白了吗? Peace !
MySQL(五) 發佈於 2019-03-27 本篇,我们说说 MySQL 中的联合查询、连接查询以及子查询。...基本语法: {表1} [inner] join {表2} on {匹配条件}; 注意: 如果内连接没有条件,则与交叉连接返回结果一样。...c.id; 注意: 如果从表数据都不匹配,则返回结果该条记录从表字段值都为 null。...分类 按功能来分: 标量子查询: 子查询返回结果是一个数据 列子查询: 返回结果是一列 行子查询: 返回结果时一行 表子查询: 返回结果是多行多列 Exists 子查询: 返回结果是 1 或 0 按位置来分...select * from my_class as c where c.id in (select class_id from my_stud); 行子查询 行子查询 where 子句 = 左值要是一个构造的行元素
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数: 其中记录 null 表示所有表格名称的id之和(aid表示表明相同的所有记录的tableid 相加 而null行表示所有aid之和)。...=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。...---- Mysql 连接的使用 你可以在 select, UPDATE 和 DELETE 语句中使用 Mysql 的 join 来联合多表查询。...为了处理这种情况,Mysql提供了三大运算符: is null: 当列的值是 null,此运算符返回 true。 is not null: 当列的值不为 null, 运算符返回 true。...: 比较操作符(不同于=运算符),当比较的的两个值为 null 时返回 true。 以下实例中你可以看到 = 和 !
交叉连接查询返回被连接的两个表所有数据行的笛卡尔积 • 笛卡尔积 可以理解为一张表的每一行去和另外一张表的任意一行进行匹配 • 假如 A 表有 m 行数据...返回的数据类型 单行单列:返回的是一个具体列的内容,可以理解为一个单值数据; 单行多列:返回一行数据中多个列的内容; 多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围; 多行多列:查询返回的结果是一张临时表...ALL ALL: 与子查询返回的所有值比较为true 则返回true ALL可以与=、>、>=、结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据...ANY/SOME •ANY:与子查询返回的任何值比较为true 则返回true •ANY可以与=、>、>=、结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的任何一个数据...EXISTS 该子查询如果“有数据结果”(至少返回一行数据), 则该EXISTS() 的结果为“true”,外层查询执行 该子查询如果“没有数据结果”(没有任何数据返回),则该EXISTS()的结果为
-- 注意给从表添加数据时,外键列的值不能随便写,必须依赖主表的主键列删除主表的数据被从表依赖时,不能删除,否则可以删除从表的数据可以随便删除多表联合查询编辑 交叉连接查询 •交叉连接查询返回被连接的两个表所有数据行的笛卡尔积...•笛卡尔积可以理解为一张表的每一行去和另外一张表的任意一行进行匹配 •假如A表有m行数据,B表有n行数据,则返回m*n行数据 •笛卡尔积会产生很多冗余的数据,后期的其他查询可以在该集合的基础上进行条件筛选...返回的数据类型单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;单行多列:返回一行数据中多个列的内容;多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;多行多列:查询返回的结果是一张临时表...ALLALL: 与子查询返回的所有值比较为true 则返回trueALL可以与=、>、>=、结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。...有数据结果”(至少返回一行数据), 则该EXISTS() 的结果为“true”,外层查询执行该子查询如果“没有数据结果”(没有任何数据返回),则该EXISTS()的结果为“false”,外层查询不执行EXISTS
也就是两个表中的所有的行的所有可能的组合。这相当于内连接没有连接条件或者连接条件永远为真。 如果一个有 m 行的表和另一个有 n 行的表,它们交叉连接将返回 m * n 行数据。...内连接将第一个表的每一行与第二个表的每一行进行比较,如果满足给定的连接条件,则将两个表的行组合在一起作为结果集中的一行。...左连接以左表的数据行为基础,根据连接匹配右表的每一行,如果匹配成功则将左表和右表的行组合成新的数据行返回;如果匹配不成功则将左表的行和 NULL 值组合成新的数据行返回。...如果一个子查询返回了至少一个数据行,则 EXISTS 的计算结果为 TRUE,否则计算结果为 FALSE。...subquery 返回了至少一个数据行,则 EXISTS 的计算结果为 TRUE,否则计算结果为 FALSE;④ EXISTS 运算时,一旦子查询找到一个匹配的行,EXISTS 运算就会返回。
left join 通俗的解释:以左表为主表,返回左表的所有行,如果右表中没有匹配,则依然会有左表的记录,右表字段用null填充。看起来非常好理解,但实际操作的过程中可能会有一些很容易被忽略的点。...a表有6条记录,b表有3条记录,且关键的键是唯一的,因此最终结果以a表为准有6条记录,b表有3条关联不上,相应的记录中,b表所有的字段都为空。 ?.../ 输出lt和null补上的行 } } } 如果代码看不懂,直接看结论就好: 如果想对右表进行限制,则一定要在on条件中进行,若在where中进行则可能导致数据缺失,导致左表在右表中无匹配行的行在最终结果中不出现...如果没有where条件,无论on条件对左表进行怎样的限制,左表的每一行都至少会有一行的合成结果,对左表行而言,若右表若没有对应的行,则右表遍历结束后b=FALSE,会用一行NULL来生成数据,而这个数据是多余的...以上两种情况,在b表中都没有符合条件的结果,因此在以左表为准的基础上,右边的所有字段都为空。 3.有where的情况 ?
如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止 对VT3应用WHERE筛选器。...如果是子查询,id的序号会递增,id越大则优先级越高,越先会被执行。 id如果相同,则可以认为是一组,从上往下顺序执行,所有组中,id越高,优先级越高,越容易执行。...如果MySQL只使用索引中的firstname部分,则key_len将是50。 在不损失精确性的情况下 ,key_len数据列里的值越小越好(意思是更快)。...extra列返回的描述的意义: 值 意义 Distinct 一旦MySQL找到了与行相联合匹配的行,就不再搜索了。...如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)。 system 表只有一行 system 表。
因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待。...“对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。...如果连接操作只使用键的最左前缀,或者如果键不是 UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。...如果连接操作所用的键只匹配少量的记录,则ref是一 种好的连接类型。” 6、rows MYSQL认为必须检查的用来返回请求数据的行数 ,这里最理想的数字就是1。...如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题。
row(当前表名) partitions The matching partitions (显示查询将访问的分区,如果你的查询是基于分区表) type The join type(当前表内访问方式) possible_keys...server层过滤后,剩下满足查询的记录数量的比例) extra Additional information (额外的信息说明) 重要字段(我个人认为的)再释义: id:这列就是查询的编号,如果查询语句中没有子查询或者联合查询这个标识就一直是...以下排序从最优到最差: system:表内只有一行数据 const:最多只会有一条记录匹配,常用于主键或者唯一索引为条件查询 eq_ref:当连接使用的索引为主键和唯一时会出现 ref:使用普通索引=或...index:索引全表扫描,把索引从头到尾扫一遍 all:全表扫描,性能最差。 key:上面写着 rows:这是mysql估算的需要扫描的行数(不是精确值)。...key ,将结果作为value 进行缓存,一旦这个表有更新,之前所有的缓存都会被清除掉。
ID列 ID列中的如果数据为一组数字,表示执行SELECT语句的顺序;如果为NULL,则说明这一行数据是由另外两个SQL语句进行 UNION操作后产生的结果集 ID值相同时,说明SQL执行顺序是按照显示的从上至下执行的...ID值不同时,ID值越大代表优先级越高,则越先被执行 演示 可以看到上面的执行计划返回了3行结果,id列的值可以看作是SQL中所具有的SELECT操作的序号 由于上述SQL中只有一个SELECT,...TABLE列 包含以下几种结果: 输出去数据行所在表的名称,如果表取了别名,则显示的是别名 : 由ID为M,N查询union产生的结果集 /表中只有一条记录与之匹配 ref 非唯一索引查找,返回匹配某个单独值的所有行 ref_or_null 类似于ref类型的查询,但是附加了对NULL...KEY_LEN列 显示MySQL索引所使用的字节数,在联合索引中如果有3列,假如3列字段总长度为100个字节,Key_len显示的可能会小于100字节,比如30字节,这就说明在查询过程中没有使用到联合索引的所有列
4.2.3 条件查询:WHERE 会指定具体的条件,按照条件针对数据进行筛选 SELECT 列名 FROM 表名 WHERE 条件 原理如下:遍历这个表每一行记录,把每一行的数据分别带入到条件中,如果条件成立...最大值,不是数字没有意义 MIN([DISTINCT] expr) 返回查询到的数据的 最小值,不是数字没有意义 案例:(下面是使用的 count) 注:如果当前列 存在 NULL数据,则查询特定列时就不会计算...如果右表中没有匹配的记录,则结果集中的右表列将包含 NULL。...例如,主键索引可以确保表中的每一行都具有唯一的标识符,从而避免重复数据的插入 7.3 如何使用 主要的索引类型 主键索引(PRIMARY KEY): 主键索引是一种特殊的唯一索引,用于唯一标识表中的每一行...t, f) 如果 value 为 true,则返回 t,否则返回 f IFNULL(value1, value2) 如果 value1 不为空,返回 value1,否则返回 value2 CASE WHEN
运算符 描述 例子 = 检查两个操作数的值是否相等,如果是,则条件为真(true) (a = b)is false != 检查两个操作数的值是否相等,如果值不相等则条件为真(true) (a !...= b)is true 检查两个操作数的值是否相等,如果值不相等则条件为真(true) (a b)is true > 检查左操作数的值是否大于右操作数的值,如果是,则条件为真(true) (...a > b)is false 的值是否小于右操作数的值,如果是,则条件为真(true) (a true >= 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真...(true) (a < b)is false 的值是否小于或等于右操作数的值,如果是,则条件为真(true) (a true !...MySQL中使用 LIMIT 实现分页 格式:LIMIT [位置偏移量] 行数 第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移 量”,将会从表中的第一条记录开始
标量子查询(Scalar Subquery):返回单个值(一行一列)的子查询。 行子查询(Row Subquery):返回单行结果(一行多列)的子查询。...ALL 必须跟在比较运算符之后,如果表达式与子查询返回列中的所有值的比较结果为 TRUE,则返回 TRUE。...ANY 关键字必须跟在比较运算符之后,如果表达式与子查询返回列中的任何值的比较结果为 TRUE,则返回 TRUE。...5.EXISTS 和 NOT EXISTS 如果子查询返回任何行,则 EXISTS 子查询为 TRUE,NOT EXISTS 子查询为 FALSE。...MySQL 会忽略此类子查询中的 SELECT 列表,因此没有区别。 对于前面的示例,如果 t2 包含任何行,甚至只包含 NULL 值的行,则 EXISTS 条件为 TRUE。
,执行顺序由上至下 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 3.id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行 table:显示这一行的数据是关于哪张表的...因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待。...“对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。...如果连接操作只使用键的最左前缀,或者如果键不是 UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。...如果连接操作所用的键只匹配少量的记录,则ref是一 种好的连接类型。” 6、rows MYSQL认为必须检查的用来返回请求数据的行数 ,这里最理想的数字就是1。
多表查询分类 1.连接查询 交叉连接: cross join 这里交叉连接,就是表1的每一行都会去匹配表2的所有行,如果不加限制条件去匹配,求出来的结果就是笛卡尔积 内连接:inner join(inner...,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。...构成临时表的时候,左表的一行数据以及其对应的右表的一行数据共同共同构成临时表的一行数据,on的条件永远筛选的是临时表的一行数据中的右表部分的数据,左表部分的数据一定是展示的 如果是为了筛选右表的数据...---- 右外连接 恰与左连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。...,是一行数据的重复,如果一行数据有多个字段,那么就得是所有字段都重复 查询的结果集显示的字段名是第一个结果集的字段名 union all可以查询出所有,不进行去重操作 SELECT id FROM emp
)do / 对满足i的值进行while循环 / insert into t1(a,b) values(i, i); /* 写入表t1中a、b两个字段,值都为.../ 如果表t2存在则删除表t2 / create table t2 like t1; / 创建表t2,表结构与t1一致 / insert into t2 select from t1; /...与索引比较的列 rows 预计需要扫描的行数,对 InnoDB 来说,这个值是估值,并不一定准确 filtered 按条件筛选的行的百分比 Extra 附加信息 表 1-explain...UNCACHEABLE SUBQUERY 一个子查询的结果不能被缓存,必须重新评估外层查询的每一行 UNCACHEABLE UNION 关联查询第二个或后面的语句属于不可缓存的子查询 表 2...-select_type 各项值解释 2.2 type type 的值 解释 system 查询对象表只有一行数据,且只能用于 MyISAM 和 Memory 引擎的表,这是最好的情况 const
下面介绍type字段不同值表示的含义:一.system表示表中仅有一行数据,这是const连接类型的一个特例,很少出现。...比如连表查询中,对于前一个表中的每一行,后表只有一行被扫描。除了system和const类型之外,这是最好的连接类型。...比如连表时对于前表的每一行,后表可能有多于一行的数据被扫描,例如以下查询:-- 为L1表的title字段添加普通索引ALTER TABLE L1 ADD INDEX idx_title (title);...FROM L2;七.ALL表示没有使用到任何索引,连表查询时对于前表的每一行,后表都要被全表扫描。...所以rows行数过大的问题并不值得过多考虑,主要分析的还是索引是否使用正确了。(9)filtered字段说明它指返回结果的行占需要读到的行(rows列的值)的百分比。
领取专属 10元无门槛券
手把手带您无忧上云