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 优化策略

参考技术B mysql中主查询和子查询关系如下:子查询是嵌入到主查询中子查询是辅助主查询的,要么充当条件,要么充当数据源子查询是可以独立存在的语句,是一条完整的select语句我朋友正在传智播客学习软件测试,我也在用他们的免费课程自学中追答

详情到黑马程序员视频库可以了解一下.

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 ,

  1. 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中主查询和子查询关系是啥?的主要内容,如果未能解决你的问题,请参考以下文章

主表和子表是一对多,查询主表数据以及子表的某一条数据

mysql数据类型和子查询

MySQL 查询和子查询

带有连接和子查询的 mysql 查询优化

MySQL多表查询和子查询

mysql中,如何向测试人员介绍连接查询和子查询的优劣势?