子查询
子查询也被称为内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句
子查询语句是先于主查询语句执行的,其结果作为外城的条件返回给主查询进行下一步的查询过滤
子语句可以与主语句所查询的表相同,也可以是不用表
select name,score from ky29 where id in (select id from ky29 where score >80);
查询分数大于80的数据
mysql> select name,score from ky29 where id in (select id from ky29 where score >80); +----------+-------+ | name | score | +----------+-------+ | jiaoshou | 98.00 | | tianqi | 99.00 | | wangwu | 90.00 | +----------+-------+ 3 rows in set (0.02 sec)
select id,name,score from ky29 where id in (select * from ky30);
通过ky30里面的id来筛选出ky29的内容
mysql> select id,name,score from ky29 where id in (select * from ky30); +------+--------+-------+ | id | name | score | +------+--------+-------+ | 3 | lisi | 60.00 | | 1 | liuyi | 80.00 | | 2 | wangwu | 90.00 | +------+--------+-------+ 3 rows in set (0.00 sec)
当表达式与子查询返回的结果集中的某个值相等时,返回TRUE,否则返回FALSE。若启用了NoT关键字,则返回值相反。需要注意的是,子查询只能返回一列数据,如果需求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。[多数情况下,子查询都是与SELECT语句一起使用的
子查询还可以用在insert语句,子查询的结果集可以通过insert语句插入到其他表中
insert into ky30 select * from ky29 where id in (select id from ky29);
将ky29里面的id插入到ky30中
update ky29 set score=50 where id not in (select id from ky30 where id=2);
delete from ky29 where id in (select id where score >80);
子查询:
in 将主表和子表关联(连接的语法)
not in 子查询返回结果集中的某一个值相同时,返回true 否二返回false,如果要启动not 则返回相反条件 写一个子查询的SQL
应用场景:insert update exists 判断此查询结果集是否为空
视图
优化操作+安全方案
查询方便:索引速度快、同时可以多表查询
数据库中的虚拟表,这张虚拟表不包含真实数据,只是做了正式数据的映射
针对不同的人(权限),提供不同结果集的表(以表格的形式展示)
视图是基本表之上建立的表,他的结构(即所定义的列)和内容(即所有数据行)都来自基本表,他依据基本表存在而存在,一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的信管系
单表创建视图
create v_score as select * from ky29 where score=80
null
select length(null) 返回的是null 表示空置
select length('') 返回的是0,表示一个空的字符串
select length('123')返回的是3,是字符串'123'的长度
连接查询
MysQL的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接
内连接查询:输出匹配共同数据/共同字段的数据内容 (inner join)
左连接查询:将两张表的内容进行匹配,按照SQL查询的顺序(左到右),输出左表的全部内容和右表的共同数据的内容(left join)
右连接查询:将两张表的内容进行匹配,按照SQL查询的顺序(右到左),输出右表的全部内容和左表的共同数据的内容(right join)
select a.id a.name from ky29 a inner join ky30 b on a.name=b.name
查找ky29和ky30里面相同的id和name内容 这里a和b指的是ky29和ky30的别名
select * from ky29 a left join ky30 b on a.name=b.name
显示ky29里面的所有内容与ky29和ky30里面的相同内容(左连接)
select * from ky29 a right join ky30 b on a.name=b.name
显示ky30的全部内容和两个表的相同内容
存储过程
1、存储过程是一组为了完成特定功能的SQL语句集合。两个点 第一 触发器
2、存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用sQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。操作数据库的传统SQL
语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高