c语言sscanf函数的用法是什么
258
2022-11-01
MySQL高级SQL语句(二)
一、子查询
子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。
子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。
语法:SELECT "栏位1" FROM "表格1" WHERE "栏位2" [比较运算符] #外查询(SELECT "栏位1" FROM "表格1" WHERE "条件"); 例子:select name,score from ys where id in (select id from ys where score >80);
1.1、不同表/多表
子查询不仅可以在select语句中使用,在inert、update、delete中也同样适用在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。语法IN 用来判断某个值是否在给定的结果集中,通常结合子查询来使用语法:<表达式> [NOT] IN <子查询> create table yy (id int);insert into yy values(1),(2),(3);select id,name,score from ys where id in (select * from yy);
1.2、查询分数大于80的记录
多数情况下,子查询都是与 SELECT 语句一起使用的select name,score from ys where id in (select id from ys where score >80);
1.3、将yr里的数据清空,重新插入ys表中数据
insert into yr select * from ys where id in (select id from ys);子查询还可以用在 INSERT 语句中。子查询的结果集可以通过 INSERT 语句插入到其他的表中
1.4、将wufan分数改为50
update yr set score=50 where id in (select * from yy where id=1);select * from yr;
1.5、删除分数大于80的
select * from yr;delete from yr where id in (select id where score>80);select * from yr;
1.6、删除分数不是大于等于80的记录
select * from yr;delete from yr where id not in (select id where score>=80);select id,name,score from yr;#只查看id,name,
1.7、exists的在子查询中作用
select count(*) from ys where exists (select id from ys where score=80);select * from ys;查询如果存在分数等于80的记录则计算ys的字段数
查询如果存在分数小于50的记录则计算ys的字段数,ys表没有小于50的,所以返回0select * from ys;select count(*) from ys where exists (select id from ys where score<50);
1.8、子查询,别名
select 表.字段,字段 from 表;select a.id from (select id,name from ys) a;
二、MySQL视图
2.1、视图
视图:优化操作+安全方案
数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射
视图可以理解为水中倒影,动态保存结果集(数据)
2.1.1、作用场景:
针对不同的人(权限身份),提供不同结果集的“表”(以表格的形式展示)
2.1.2、作用范围:
select * from ys; #展示的部分是ys表
select * from view_name; #展示的一张或多张表
2.1.3、功能:
简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性
本质而言视图是一种select(结果集的呈现)
PS:视图适合于多表连接浏览时使用!不适合增、删、改
而存储过程适合于使用较频繁的SQL语句,这样可以提高执行效率!
2.2、视图和表的区别和联系
2.2.1、区别
视图是已经编译好的sql语句。而表不是 视图没有实际的物理记录。而表有。 show table status\G 表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。 表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。 视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的)
2.2.2、联系
视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
三、视图示例
3.1、满足80分的学生展示在视图中
create view v_score as select * from ys where score>=80;show table status\G #查看表状态select * from v_score; #查看视图desc v_score; #查看视图与源表结构desc ys;
3.2、多表创建视图
创建test1表create table test1 (id int,name varchar(10),age char(10));insert into test1 values(1,'zhangsan',20);insert into test1 values(2,'lisi',30);insert into test1 values(3,'wangwu',29);insert into test1 values(4,'ys',32);insert into test1 values(5,'wufan',22);#建立视图create view z_ys (id,name,score,age) as select ys.id,ys.name,ys.score,test1.age from ys,test11 where ys.name=test1.name;#查看视图select * from z_ys;
3.3、修改原表数据
update ys set score='90' where name='ys'; #修改原表数据select * from z_ys; #查看视图.还可通过修改视图改原表数据update z_ys set score='110' where name='ys'; #修改原表数据select * from z_ys; #查看视图selecr * from ys; #查看原表
四、NULL值
在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失 的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL。需要注意 的是,NULL 值与数字 0 或者空白(spaces)的字段是不同的,值为 NULL 的字段是没有 值的。在 SQL 语句中,使用 IS NULL 可以判断表内的某个字段是不是 NULL 值,相反的用 IS NOT NULL 可以判断不是 NULL 值。
4.1、验证NULL
#null在插入一条记录后会改变alter table ys add column addr varchar(50);desc ys;update ys set addr='sh' where score >=70;select * from ys;#统计数量:检测null是否会加入统计中select count(addr) from ys;#将info表中其中一条数据修改为空值''update ys set addr='' where name='wufan';select count(addr) from ys;
4.2、查询NULL值
#查询null值select * from ys where addr is null;#查询不为空的值select * from ys where addr is not null;
五、MySQL中的连接方式
5.1、内连接
mysql中的内连接就是两张或多种表中同时符合某中条件的数据记录的组合。通常在from句中使用关键字INNER JOIN来连接多张表,并使用ON子句设置连接条件,内连接是系统默认的表连接,所以在FROM子句后可以省略INNER关键字,只使用 关键字JOIN。同时有多个表时,也可以连续使用INNER JOIN来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表
语法SELECT column name (s) FROM tablel INNER JOIN table2 ON tablel.column nametable2.column_name;模板表create table infos (name varchar (40),score decimal (4,2) , address varchar (40));insert into infosvalues ('wangwu',80, 'beijing'), (' zhangsan', 99, ' shanghai'), ('lisi',100, 'nanjing*); select ys.id,ys.name from ys inner join infos on ys.name=infos.name;#简洁的说就是查找两个表中的相同数据,并且显示出来
5.2、左连接
左连接也可以被称为左外连接,在FROM子句中使用LEFT JOIN或者LEFT OUTER JOIN关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
select * from ys left join infos on ys.name=infos.name;
5.3、右连接
右连接也被称为右外连接,在FROM子句中使用RIGHT JOIN或者RIGHT OUTER JOIN关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配
select * from ys right join infos on ys.name=infos.name;
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~