## 子查询:
把查询结果作为值来使用
var1=select max(days) from teacher class;
select name gender from teacher class where days=var1;
### 子查询的位置:
**where型**
**from型**
**exists型**
### 子查询返回值:
**一个值(标量)**
获得一个值后,使用关系运算符连接 < , = ,> ,<= , >=,!=
**一列(列子查询) in,not in,any(任何一个),all(所有)**
=any(集合)=in (等于集合中的任何一个)
!=all(集合)=not in 不等于集合中的所有元素
同一个字段的值的集合
用 in 判断是否在这个范围内
//先查询出姓名,然后用姓名查询他的个人信息
select * from teacher where t_name in (select t_name from class where cname='php0228');
**一行多列(行子查询)** 构建出一行, 运算符 =,子查询只能返回一行
![](https://box.kancloud.cn/b10e1213f28c89ba6a4a46170184057b_1039x79.png)
**表(多行多列)** 通常在from里面
select * from(table) where .....
from 里面必须是一个表,不能是一个结果,所以必须给表起**别名**
select * from (select t_name,c_name from teacher_class where days>15) as temp where t_anme like '李%';
## exists子查询 是否存在
如果子查询可以返回数据则为真,否则为假
![](https://box.kancloud.cn/eca5be2ef06e2e58370e985432ef9141_876x98.png)
![](https://box.kancloud.cn/953e9656ceef817724e2f7d7d56a777d_867x83.png)
## 连接查询
将所有数据,按照某种条件,连接起来,再进行筛选处理
连接分类:——根据连接条件不同
### **内连接**:inner
要求:连接的多个数据都必须存在,才能进行内连接
inner join 默认可以省略inner
`tableleft inner join tableright on 连接条件`
分类:
内连接在连接时候,是可以省略连接条件的。所有的左表数据都要与右表的记录做一次连接。m*n个记录,
成为**交叉连接**,或笛卡尔积。(做色子投递游戏)
此时可以使用 cross join 代替 inner join的无条件格式
有条件的内连接,可以过滤非法连接。
条件分类:
**过滤条件**:** where** 是在m*n条记录里面过滤
**连接条件**:** on ** 和where结果一样,但逻辑不一样,on的意思是连接的时候过滤掉无效连接。
on 查询的数据量比较少。
** using**
using 要求负责连接的2个实体之间的字段名称一致
select * from tb1 join tb2 using id;
2个表的信息放到一个结果里面
![](https://box.kancloud.cn/98f492e5ba45224e2c7a5828a02598c0_1088x183.png)
### **外连接**:outer
负责连接的一个或多个数据不存在,(有这个老师,但是没有带过课,即个别数据不存在)
外连接,不能使用where
连接的时候最好都加上表名指定字段,**表别名**——保证简洁和清晰
**列别名**:select t.id as tid,tc.id as tcid from ............
select * from student as s join select * from teacher as t where s.name and t.days>15;
![](https://box.kancloud.cn/d4b821331526f976835b71383aceeffb_1076x138.png)
***左外连接:*** left join
生成的结果中左边是最重要的
***右外连接:*** right join
不能使用没有条件的外连接。
### **自然连接**:
通过mysql自己的判断完成的连接,不需要条件
select * from one nature join two;
自动以某一个相同字段作为连接条件
自然内连接:
nature join
自然外连接:
nature left join
natrue right join
## select * into outfile 导出结果,纯数据备份,不包括任何格式
select 用法,查询结果保存到文件里面
select * into outfile "d:/one" from employee;
生成的文件格式:
默认采用行区分记录,用制表符区分字段
为了满足特殊需求,这个是可以改的。
字段选项:fields terminated by '\t' enclosed by '' escaped by '\\'
行选项:lines terminated by '\n' starting by ''
enclosed 字段的值包裹符号
starting 以什么开始
select * into outfile "d:/one" fields terminated by ',' lines terminated by '\n' starting by ''
from employee;
## 增加数据
insert into 表名(字段列表) values (值列表)
插入部分字段数据,没有插入的字段使用默认值,default 或者null
多个记录可以用括号分开。
insert into tb1(id,username) values (1,ssssss),(2,aaa),(3,sfdfdf);
**在主键冲突时采用更新操作**
~~~
insert into tb1(id,username) values (1,杨露禅) on duplicate key update
username="杨露禅";
~~~
插入部分字段可以使用**set**
`insert into teacher set name="张三丰",sex="男";`
插入的语句可以使用select 查询到的数据
**insert into ....select.........**
`insert into teacher (tname,cname) select (tname,cname) from teacher;`
插入默认值 **default**
insert into teacher values (10,'yyy',default);
insert into teacher values (10,'yyy',default(字段名));
**插入数据replace**
把insert 换成replace
主键不冲突就插入,主键冲突就替换
replace into ..................
![](https://box.kancloud.cn/b59d4b5911cea3277e9f9b0124cfcb05_364x156.png)
## 数据导入
load data infile 'e:/one' into table teacher;
## 删除数据
允许使用条件,及limit 6 一次性只能删除6条
常见:order by limit配合使用
delete from teacher order by name limit 7
### 删除多个表记录
delete from tb1 ,tb2 using tb1 join tb2 on .....=.......
**truncate** 删除表,再新建一个同样的表名,即初始化
### 更新数据
![](https://box.kancloud.cn/49b86a06ec69d498b071954fcbbfa5cc_334x92.png)
多表更新
![](https://box.kancloud.cn/59c33de840c4f5bbb2e9bda065080e8d_1073x144.png)