mysql之单表查询和多表查询

注释:单表查询就是记录的详细操作(增删查,改的需求以及方法比较多)

一,复制表(索引和自增的属性不能复制,需要自己添加)

拷贝结构以及数据

create table 新表名 select * from 旧表名;
例:create table copy_customer select * from custeomer;

仅拷贝结构

create table 新表名 select * from 旧表名 where 假信息;
例:create table copy_costomer select * from where 1>2;

二,单表查询

顾名思义,就是在一张表中查询你想要的数据,先介绍增删改方法.([]里面的内容可写可不写)

2.1增

insert [into] 表名[字段名] value|values(字段值....);

字段名:若写,则按照写的字段匹配你后边输入的值

            若不写,则严格按照创建表时的格式传值

value 插入一条记录,   values 插入多条记录

2.2改

update 表名 set 字段名 = 新的值[,字段n = 新值n]  [where 条件]

可以同时修改多个字段,用逗号隔开,最后一个字段不能加逗号

where后面添加条件,不满足条件则全部修改,满足条件则只修改满足的部分

2.3删

delete from 表名 [where 条件];

满足where条件则只删除满足条件的部分,都不满足条件则全部删除

如果想全部删除还有一种方法

truncate table 表名

与delete 删除对比,delete是逐行删除,删除的效率低,并且删除之后的行号还会保留

2.4,查

2.4.1完整的查询语句

select  [distinct] {* | 字段名 | 聚合函数 | 表达式} from 表名
        [where 条件(可以单独出现,也可搭配group by不可搭配聚合函数)
        group by 字段名
        having 条件(与group by一起出现,并且可以与聚合函数搭配)
        order by 字段名
        limit 显示的条数]

为了避免出现 乱码,把所有的编码格式都写成gbk

表达式:支持四则运算    聚合函数:把多个数据过滤成一个    比如:最大值

2.4.2 所有关键字的优先级

2.4.3扫盲知识点

(1)字符串的拼接

select concat(类似以python中的字符串拼接) from 表名;
例:select concat('name:',name,'enginsh:',enginsh) from stu;

(2)给拼接的字符串添加名字

select concat(类似以python中的字符串拼接) [as] 名字 from 表名;
例:select concat('name:',name,'enginsh:',enginsh) [as] 课程 from stu;

(3),聚合函数

将一堆数据经过计算,得到一个数据

sum(求和)   avg(求平均数)   max(最大值)   min(最小值)    count(计个数)

总结例:

select (case when english+math<150 then concat(name,'shit')
when english+math>150 then cancat(name,'nace')
end) 评语 from stu;

2.4.4 where 关键字

从硬盘上读取数据的一个过滤过程

select * from 表名 where 条件;
select * from stu where english>62;

比较运算符: <  >  =  >=    <=   !=        between...and...   

 in(set集合)   like(模糊查询){%任意多个字符 _任意一个}    not null

逻辑运算符    and   or   not

模糊查询举例:

select * from stu where name lile '李%';
select * from stu where name like '%李%';

2..4.5group by 关键字

一般在你的需求中带有,每个某某的字眼都需要分组

给数据分组,单纯的分组得到的结果只是每组的第一个值

select * from 表名 group by 字段名;
select * from emp group by dept;

(1) sql_mode中,没有设置ONLY_FULL_GROUP_BY 显示每个组的第一条记录没有意义

(2)在sql_mode中设置了ONLY_FULL_GROUP_BY直接报错,

分组后记录的所有细节都被隐藏,只有出现在group by 后面的数据才会被显示(其余都会报错)

2..4.6  having关键字

用于分组后的数据进行筛选(不会单独出现,与group by一起搭配出现)

与where的区别,1,where 是先执行的,用于读取硬盘数据

                             2,where中不能使用聚合函数,而在having中可以使用

2.4.7order by排序

用于对记录进行排序(默认自带 asc  意思是升序)

select * from 表名 order by 字段名;(默认升序排列)
select * from emp order by salsry;
select * from 表名 order by 字段名 dasc;(降序排列)
select * from emp order by salsry dasc;

2.4.8 limit 关键字

用于限制数据显示的条数,(常用于数据分页显示)

select * from 表名 limit 数字;(查看表中的前n条数据)
select * from empt limit 3;(查看emp表中的前3条数据)
select * from 表名 limit m,n;(查看表中第m+1条开始看n条数据)
select * from emp limit 2,3;(查看emp表中第三条开始看三条数据)

三,多表查询

在多个表中查询需要的数据

多表查询方式

3.1笛卡尔积查询

就是两张表中的数据做乘法,做乘法就是一张表中的一个数据匹配另一张表中的全部数据,接着第二条这样匹配,一直到这张表中的数据全部匹配完,然后用where 筛选出正确的数据

select * from 表名,表名 where 表名.字段名 = 表名.字段名;
select * from emp,dept where emp.dept_id = dept.id;

3.2内连接查询(inner join)

只显示匹配到的内容

on 关键字 用于多表查询,进行条件限制

select * from 表名 inner join 表名 on 表名.字段名 = 表名.字段名;
select * from emp inner join dept on emp.dept_id = dept.id;

3.2 左外连接(left join)

左边的表全部显示,右边的表只显示匹配到的

select * from 表名 left join 表名 on 表名.字段名 = 表名.字段名;
select * from emp left join dept on emp.dept_id = dept.id;

3.3右外连接(right join)

右边的表全部显示,左变得表只显示匹配到的

select * from 表名 right join 表名 on 表名.字段名 = 表名.字段名;
select * from emp right join dept on emp.dept_id = dept.id;

3.4 全外连接(主要通过union实现)

在一个表中显示多个表中全部数据(一般是左链接的结果与右链接的结果合并)

注意:1,被合并的多个表的结构必须相同

         2,默认去重,(union all默认不去重)

select *from emp right join dept  on emp.dept_id = dept.id
       union
select *from emp left join dept  on emp.dept_id = dept.id;
select *from emp right join dept  on emp.dept_id = dept.id
       union all
select *from emp left join dept  on emp.dept_id = dept.id;

四,多对多,三表联查

思路:

1,到关系表中,去查询那些老师教过哪些学生(学生的id) 总成一个临时表

2,加上一步的临时表与学生表进行链接

3,加上额外的筛选条件

select stu.name student,tec.name steacher from tec 
inner join s_t on tec.id = s_t.t_id 
inner join stu on stu_id = s_t.s_id
where tec.name = 'jack';

五,子查询

就是讲上一次的结果作为本次的原始数据(或是查询数据)

在mysql语句上,内层查询语句的查询结果作为外层查询语句提供条件

子查询可以包含 in, not in, any ,all ,exists , 和not exists等关键字,还可以包含   =   !=     <        >

猜你喜欢

转载自blog.csdn.net/qq_42737056/article/details/82707094