mysql 高阶语句2

select name ,score from info where id in (select id from info where score >80);

子查询返回的结果只能是1列

where条件in什么,子查询的列就是什么

create table ky32 (

id int(4)

);

多表联查,不要超过三张。

通过ky32表中的id,查询info表中id,name,score。

select id,name,score from info where id in (select id from ky32);

通过ky32表中的name,查询info表中id,name,score。

select id,name,score from info where name in (select name from ky32);

通过ky32表中的id但是分数要大于70,查询info表中id,name,score。

select id,name,score from info where id not in (select id from info where score >70);

要加where条件

通过ky32表中的id取反,查询info表中id,name,score。

select id,name,score from info where id not in (select id from ky32);

select * from test;

子查询语句还可以用在insert update delete

插入语句

插入数据,要求按性别,把info表女的插入到test表

insert into test select * from info where id in (select id from info where sex='女');

插入数据,要求按地址,包含南京插入到test

insert into test select * from info where id in (select id from info where address like 'nj%');

update语句

修改info表中等于ky32表中id=2

UPDATE info set score=50 where id in (select id from ky32 where id=2);

修改info表score=100 not in 子查询的条件id>1.

update info set score=100 where id not in (select id from test where id>1);

delete语句

删除表中分数大于80

delete from info where id in (select id where score >80);

exists:关键字在子查询是,主要用于子查询的结果是否为空,不为空,返回true。为空,false。

根据info表,查询出大于80分的同学,然后统计有多少个。

select count(*) from info a where exists(select id from info where score > 80 and info.id=a.id);

里外查询条件的结果要一致,要起别名。

查询出小于80分的同学,select count() from info a where exists(select id from info where score< 80 and info.id=a.id);

视图:mysql当中的视图 VIEW

视图在mysql当中是一个虚拟表。基于查询结果得出的一个虚拟表。

在工作当中,我们查询的表未必是真表。有可能就是基于真表查询结果的一个虚拟表

可以简化复杂的查询语句,隐藏表的细节。提供安全的数据访问。

创建视图可以是一张表的结果集,也可以是多个表共同查询的结果集

create view test2 as select * from info where score >=80;

select * from test2;

desc test2;

desc info;

视图表和真表之间的区别:

1,存储方式不一样,真表存储实际实际,真正写在磁盘当中的。视图不存储任何数据,仅仅是一个查询结果集的虚拟表

2,表可以增删改查,但是视图一般情况只能用于查,展示数据

3,占用空间,真表真实占用空间,视图不占用数据库空间。

在数据库中查询有哪些视图?

show full tables in kgc1 where table_type like 'view';

删除: drop view v_score;

根据多个表查询视图:

create table test01 (

id int,

name VARCHAR(15),

age int(3)

);

info 和 test01 根据info的id,name,score,加上test01的age.

create view v_info(id,name,score,age) as

select a.id,a.name,a.score,b.age from info a,test01 b

where a.name=b.name;

select * from v_info;

update info set score=90 where name='cc1';

源表的数据发生变化,视图表数据同步更新

update v_info set age=100 where name='cc3';

更新数据表源表是数据也会发生变化。一

情况下不对视图表进行改的操作。

真表占了80%,视图适用于安全性要求比较高的场景。对外访问,基本都是视图。

null和空值:

null:就是真空

空值 空气

select * from info where score is null;

select * from info where address is not null;

select count(address) from info;

null是不被统计的,空值可以被统计。

连接查询:(面试题)

内连接:

是把两张表或者多张表(三张),同时符合特定统计的数据记录的组合。

一个或者多个列的相同值才会有查询的结果。

on后面的条件做判断

select a.id,a.name from test01 a inner join info b on a.name=b.name;

左连接:

左外连接,在语句中:left join关键字来表示。在左连接中,左侧表示基础表,

接受左边所有行,然后和右表(参考表)记录进行匹配。

匹配左表当中所有行,以及右表中符合条件的行。

select * from test01 a left join info b on a.name=b.name;

右表当中没有匹配的以null来表示。

select a.name,a.id,b.name,b.id from test01 a left join info b on a.name=b.name;

右连接:

右外连接,right join 以右侧表为基础。接受右表的所有记录,匹配的记录,不匹配的记录null值

select * from test01 a right join info b on a.name=b.name;

select * from test01 a right join info b on a.id=b.id;

你可能感兴趣的:(mysql,数据库)