mysql中主查询和子查询关系是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中主查询和子查询关系是啥?相关的知识,希望对你有一定的参考价值。
主查询是在他给你的表里面查询,子查询的意思是你先对他给你的表做一些筛选、增改等其他操作,
创造一个新的表,
再在你这个子表里面查询 参考技术A
子查询优化策略
对于不同类型的子查询,优化器会选择不同的策略。
1. 对于 IN、=ANY 子查询,优化器有如下策略选择:
semijoin
Materialization
exists
2. 对于 NOT IN、<>ALL 子查询,优化器有如下策略选择:
Materialization
exists
3. 对于 derived 派生表,优化器有如下策略选择:
derived_merge,将派生表合并到外部查询中(5.7 引入 );
将派生表物化为内部临时表,再用于外部查询。
注意:update 和 delete 语句中子查询不能使用 semijoin、materialization 优化策略
详情到黑马程序员视频库可以了解一下.
mysql数据类型和子查询
电脑的一个字节等于8位,也就是1Byte=8bit。
字节(Byte /bait/ n. [C])是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。
bit中文名称是位,音译“比特”,是用以描述电脑数据量的最小单位。
计算机容量单位的换算关系是:
1Byte=8bit,1KB=1024B,1MB=1024KB,1GB=1024MB,1TB=1024GB,1PB=1024TB,1EB=1024PB,1ZB=1024EB,1YB=1024ZB
二进制转十进制
把各个为拆开。乘以2的次幂。末尾位乘2的0次幂。依次类推。
比如:10010111
十进制=1*2^7+0*2^6+0*2^5+1*2^4+0*2^3+1*2^2+1*2+1*2^0 ;
PS:末尾位是2的零次幂,所以是1。
字符与字节
字符是指计算机中使用的文字和符号,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节。
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节。
数据表:也就是建立列的过程,数据是以文件的形式放在硬盘(也有的放在内存中)
列:不同的列类型占得空间不一样;选列的原则:够用,又不浪费
列类型详解
数值型
整型
类型 |
大小 |
范围(有符号) |
范围(无符号) |
用途 |
TINYINT |
1 字节 |
(-128,127) |
(0,255) |
小整数值 |
SMALLINT |
2 字节 |
(-32 768,32 767) |
(0,65 535) |
大整数值 |
MEDIUMINT |
3 字节 |
(-8 388 608,8 388 607) |
(0,16 777 215) |
大整数值 |
INT或INTEGER |
4 字节 |
(-2 147 483 648,2 147 483 647) |
(0,4 294 967 295) |
大整数值 |
BIGINT |
8 字节 |
(-9 233 372 036 854 775 808,9 223 372 036 854 775 807) |
(0,18 446 744 073 709 551 615) |
极大整数值 |
整型的符号
在mysql中数字数据类型是有符号和无符号两种,当然整型也是,
在定义一个字段的时候可以这么使用
age tinyint unsigned,
unsigned代表是无符号,即都是大与等于0 的数
如果这样使用是默认有符号的
age tinyint ,
类型 |
大小 |
范围(有符号) |
范围(无符号) |
用途 |
TINYINT |
1 字节 |
(-128,127) |
(0,255) |
小整数值 |
SMALLINT |
2 字节 |
(-32 768,32 767) |
(0,65 535) |
大整数值 |
MEDIUMINT |
3 字节 |
(-8 388 608,8 388 607) |
(0,16 777 215) |
大整数值 |
INT或INTEGER |
4 字节 |
(-2 147 483 648,2 147 483 647) |
(0,4 294 967 295) |
大整数值 |
BIGINT |
8 字节 |
(-9 233 372 036 854 775 808,9 223 372 036 854 775 807) |
(0,18 446 744 073 709 551 615) |
极大整数值
|
整型的符号
在mysql中数字数据类型是有符号和无符号两种,当然整型也是,
在定义一个字段的时候可以这么使用
age tinyint unsigned,
unsigned代表是无符号,即都是大与等于0 的数
如果这样使用是默认有符号的
age tinyint ,
- 2.整型的数据宽度(即数据类型后的数字)和零填充
a. 数据宽度和数据类型的取值范围是无关的
b. 数据宽度只是指明MYSQL最大可能显示的数字个数,数值的位数小于M时会有空格填充;大于M时,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能显示出来
c. 数据宽度的效果需要配合zerofill使用
小数型
类型 |
大小 |
范围(有符号) |
范围(无符号) |
用途 |
FLOAT |
4 字节 |
(-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) |
0,(1.175 494 351 E-38,3.402 823 466 E+38) |
单精度 |
DOUBLE |
8 字节 |
(1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
双精度 |
DECIMAL |
对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 |
依赖于M和D的值 |
依赖于M和D的值 |
定点小数值 |
浮点型的特点是小数点浮动,有精度丢失;定点型特点就是小数点固定,不会丢失精度。
单精度型能精确到七位,而双精度能精确到15位。用户在选用这些数据类型时,要注意变量所取值的范围。
记住以下几点: 1、浮点数存在误差问题; 2、对货币等对精度敏感的数据,应该用定点数表示或存储;
将id1,id2,id3的精度和标度都去掉
f和d的数据正确插入,而de被截断。
浮点数如果不写精度和标度,则会按照实际显示,如果有精度和标度,则会将数据四舍五入后插入,系统不报错,定点数如果不设置精度和标度,刚按照默认的(10,0)进行操作,如果数据超过了精度和标度值,则会警告!
同时,对数据求SUM()时会出现不同的结果,float和double求SUM都会出现很多小数点,而decimal求SUM得到的是精准数值:
理论上SUM(f)=3.698,SUM(d)=2.474,SUM(de)=3.46,但f,d都出现后面很长的一串浮点小数点。
字符型
类型 |
大小 |
用途 |
CHAR |
0-255字符 |
定长字符串 |
VARCHAR |
0-65535 字符 |
变长字符串 |
TINYBLOB |
0-255字符 |
不超过 255 个字符的二进制字符串 |
TINYTEXT |
0-255字符 |
短文本字符串 |
BLOB |
0-65 535字符 |
二进制形式的长文本数据 |
TEXT |
0-65 535字符 |
长文本数据 |
MEDIUMBLOB |
0-16 777 215字符 |
二进制形式的中等长度文本数据 |
MEDIUMTEXT |
0-16 777 215字符 |
中等长度文本数据 |
LONGBLOB |
0-4 294 967 295字符 |
二进制形式的极大文本数据 |
LONGTEXT |
0-4 294 967 295字符 |
极大文本数据 |
定长char与变长varchar的区别:
char定义的是固定长度,长度范围为0-255,存储时,如果字符数没有达到定义的位数,会在后面用空格补全存入数据库中,数据库取char的数据时,会把后面的空格全部丢弃掉。
varchar是变长长度,长度范围为0-65535,存储时,如果字符没有达到定义的位数,也不会在后面补空格,当然还有一或两个字节来描述该字节长度,而数据库在取varchar数据时,尾部空格会保留。
char (16)长度固定, 如\'www.uphtm.com\' 存储需要空间 14个字符 实际占位16个字符 ,超过16个字符,会被截断
varchar(16) 可变长 如\'www.uphtm.com\' 需要存储空间 15字符, 实际占位15个字符,超过16个字符,会被截断
==========================================================================================================================================
子查询
子查询的定义:
子查询是一个查询语句嵌套着另外的查询语句,用来进行一定层次的查询,其中子查询相当于第一步查询过滤,外查询就是最后得到结果的查询。经常会用到关键字:ANY、SOME、ALL、IN、EXISTS,注:在子查询语句的后面,必须起别名: //select name,price from (select * from car where powers = 130) as aa;(必须起别名)
1、where型子查询:把内层查询的结果作为外层查询的条件
A、关键字ANY、SOME子查询:ANY/SOME都是表示满足其中一个条件即可。
-- 在student表中选择sID大于表course中gID的数据记录
-- sID只需要大于gID中任何一个就满足条件
SELECT * FROM student WHERE sID > ANY(SELECT gID FROM course);
A、ALL关键字查询
与ANY/SOME相反,是要满足所有的条件才行。
SELECT col1 FROM t1 WHERE clo1> ALL(SELECT col2 FROM t2) as aa;
A、IN关键字查询
IN关键字查询:若外查询想要查询的结果在子查询中,则返回true,继续查询到结果,否则返回false,查询为NULL。
注意:与ANY类似,但是很不相同,IN后面可是子查询,也可以是给定的集合。ANY后面必须为子查询,且前面必须有运算符(<、>、=)
/*先放一放*/
1、from型子查询
即把from后的表名换成查询语句,即把内查询的结果作为一张临时表
1、Exists型子查询:把外层的查询结果,拿到内层中,看是否成立
关键字EXISTS查询:
表示在EXISTS后面的查询结果是否有结果,而不在乎子查询返回什么样的结果。
若子查询的结果至少有一行,则为True,若子查询结果为NULL,则返回False,进行下一次外层查询。
现有两张表
现在我要查询第一张表中有子项目的数据
select cat_id,cat_name,parent_id from biao1 where (select * from biao2 where biao1.cat_id = biao2.cat_id);
外层查询一次一次的执行,
第一次取出一个cat_id = 1,带进子查询中的where biao1.cat_id = biao2.cat_id 因为cat_id = 1在biao2中不存在,所以 外层查询进行第二行的查询
第二次取出cat_id = 2,带进子查询中的where biao1.cat_id = biao2.cat_id 因为cat_id =2在biao2中不存在,所以 外层查询进行第三行的查询
第三次取出cat_id = 3,带进子查询中的where biao1.cat_id = biao2.cat_id 因为cat_id =3在biao2中存在,所以 外层查询可以执行select cat_id,cat_name,parent_id
查询结果跟子查询的结果没有关系,只要外层查询的结果在子查询中能够满足,就可以查询出外层查询的结果
以上是关于mysql中主查询和子查询关系是啥?的主要内容,如果未能解决你的问题,请参考以下文章