MySQL高级SQL语句二

目录

1、通配符

1.1、查询名字是g开头的记录

1.2、查询名字里是z和n中间有一个字符的记录 

1.3、查询名字中间有g的记录

1.4、查询l后面3个字符的名字记录

2、子查询 

2.1、不同表/多表示例

2.2、多表查询

2.3、查询phone大于188的记录

2.4、将aadd里的记录全部删除,重新插入class表的记录

2.5、DELETE也适用于子查询

2.6、子查询exists 

2.7、子查询 别名as 

3、视图 

3.1、试图和表的区别和联系

3.2、创建视图

3.3、查看表状态 

3.4、查看视图  

3.5、查看视图和表结构 

3.6、多表创建视图 

3.7、同时可以通过修改视图修改原表

4、NULL值

 4.1、统计数量:检测null是否会加入统计中

4.2、查询null值 

4.3、查询不为空的值 

5、连接查询

5.1、内连接

5.2、左连接

5.3、右连接

总结


1、通配符

通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来

通配符都是跟like(模糊查询)一起使用,并协同where自居共同来完成查询任务

常用的通配符有两个:

%:百分号表示零个、一个或多个字符 
_ :下划线表示单个字符
 

1.1、查询名字是g开头的记录

select id,name from class where name like 'g%';

1.2、查询名字里是z和n中间有一个字符的记录 

1.3、查询名字中间有g的记录

1.4、查询l后面3个字符的名字记录

 select * from class where name like 'l___';

1.5、查询名字以t开头的记录 

select * from class where name like 't%';
 

2、子查询 

子查询也被称作内查询或嵌套查询,是指一个查询语句里面嵌套着另一个查询语句。
子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤
PS: 子语句可以与主语句所查询的表相同,也可以是不同表

 子语句中的sql语句是为了最后过滤出一个结果集,用于主语句的判断条件
** in:讲主表和子表关联/连接的语句

 2.1、不同表/多表示例

create table aabb(id int);
insert into xxoo values(1),(2),(3);
select * from aabb;

 2.2、多表查询

select id,name,phone from class where id in (select * from aabb);

子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。 

(1)语法:

IN 用于判断某个值是否在给定的结果集中,通常结合子查询来使用
<表达式> [NOT] IN <子查询>
 

当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回FALSE。若启用了NOT关键词,则返回值相反。需注意的是,子查询只能返回一列数据,如果需求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。多数情况下,子查询都是与SELECT语句一起使用的。

2.3、查询phone大于188的记录

select name,phone from class where id in(select id from class where phone>188)

子查询还可以用在 INSERT语句中。子查询的结果集可以通过INSERT 语句插入到共其他的表中 

2.4、将aadd里的记录全部删除,重新插入class表的记录

(两个表的结构要一样,不然插入数据时会报错)

delete from aadd;
insert into aadd select * from class where id in (select id d from class);

UPDATE语句也可以使用子查询。UPDATE内的子查询,在 set更新内容时,可以是单独的一列,也可以是多列。 

2.5、DELETE也适用于子查询

删除phone大于188的记录

delete from class where id in (select id where phone>188)

2.6、子查询exists 

EXISTS这个关键字在子查询时,主要用于判断子查询的结果集是否为空。如果不为空,则返回TRUE:反之,则返回FALSE

select count(*) from class where exists(select id from class where phone=188);
 

2.7、子查询 别名as 

 select a.id,a.name from (select id,name from aadd) a;
 

3、视图 

视图:优化操作+安全方案
数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射视图可以理解为镜花水月/倒影,动态保存结果集(数据)
基础表zzww(7行记录) —> 映射(投影)----试图

作用场景
针对不同的人(权限身份),提供不同结果集的"表”(以表格的形式展示)功能:
简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性本质而言视图是一种select(结果集的呈现)
PS:视图适合于多表连接浏览时使用!不适舍增、删、改
而存储过程适合于使用较频繁的sQL语句,这样可以提高执行效率!

3.1、试图和表的区别和联系

区别

视图是已经编译好的sql语句。而表不是
视图没有实际的物理记录。而表有。show table status\G
表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的)

联系

视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系
 

3.2、创建视图

create view v_phone as select * from class where phone<=188;
 

3.3、查看表状态 

show table status\G

 

查看视图结果全为空,原表无变化

3.4、查看视图  

select * from v_phone;

3.5、查看视图和表结构 

desc v_phone

3.6、多表创建视图 

创建一个视图,需要输出id、学生姓名、分数以及年龄 

create view v_class(id,name,phone,age) as select class.id,class.name,class.phone,class5.age from class,class5 where class.name=class5.name;
 

3.7、同时可以通过修改视图修改原表

update v_class set phone='199' where id='4';

 

 修改表不能修改以函数、复合函数方式计算出来的字段查询方便、安全性
查询方便:索引速度快、同时可以多表查询更为迅速(视图不保存真实数据,视图本质类似select)安全性:我们实现登陆的账户是root—》所拥有权限﹐视图无法显示完整的约束

4、NULL值

在sQL语句使用过程中,经常会碰到NOLL这几个字符。通常使用NULL来表示缺失的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用NoTNOLL关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOTNUOLL并且没有值,这时候新记录的该字段将被保存为 NOLL。需要注意的是,NULL值与数字0或者空白(spaces)的字段是不同的,值为NULL的字段是没有值的。在sQL语句中,使用ISsNOULL可以判断表内的某个字段是不是NOLL值,相反的用Is Nor NULL可以判断不是NULL值。
 

查询zzww表结构,name字段不允许空值

null值与空值的区别(空气与正空)
空值长度为0,不占空间,NULL值长度为null,占用空间
is null无法判断空值
空值使用“=”或者“<>”来处理(!=)
count()计算时,NULL会忽略,空值会加入计算

插入一条记录,分数字段输入null,显示出来就是null

验证

alter table class add column addr varchar(20);

update class set addr='nj' where phone>=170;

 4.1、统计数量:检测null是否会加入统计中

 select count(addr) from class;

将class表中其中一条数据修改为空值,并统计数量,检测空值是不会被添加到统计中 

update class set addr='' where id='2';

select count(addr) from class;
 

4.2、查询null值 

4.3、查询不为空的值 

 select * from class where addr is not null;

5、连接查询

MysgL的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接

5.1、内连接

MysQL中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM子句中使用关键字INNERJOIN来连接多张表,并使用ON子句设置连接条件,内连接是系统默认的表连接,所以在FROM子句后可以省略INNER关键字,只使用关键字JoIN。同时有多个表时,也可以连续使用INNER JOIN来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表

(1)语法

select class.id,class.name from class inner join class5 on class.name=class5.name;

 内连查询:通过inner join的方式将两张表指定的相同字段的记录行输出出来
内连查询: 面试,直接了当的说用inner join就可以

5.2、左连接

左连接也可以被称为左外连接,在FROM子句中使用 LEFT JOIN或者LEFT OUTER JOIN关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。

select * from class left join class5 on class.name=class5.ass5 onname;

左连接
将两张表的内容进行匹配,按照sql查询的顺序(左—》右)输出左表的全部内容和右边的共同的数据内容

左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为NULL。

5.3、右连接

右连接也被称为右外连接,在FROM子句中使用RIGHTJoIN或者RIGHT OUTER JOIN关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配

select * from class right join class5 on class.name=class5.name.name;

 

在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹配的行,这些记录在左表中以NULL补足

总结

通配符、子查询、视图及内连接都为数据库常用操作


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值