MySQL高阶语句(二)

目录

一、通配符

1.1 查询名字是d开头的记录

1.2 查询名字里是d和y中间有一个字符的记录 

1.3 查询名字中有g的记录

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

1.5 查询名字以 g开头的记录

二、子查询

2.1 相同表查询

2.2 不同表/多表查询

2.3 IN/NOT IN

2.4 insert  

2.5  update

2.6 delete 

2.7 exists

2.8 as别名 

三、MySQL视图

3.1 视图功能

3.2 视图和表的区别和联系

3.2.1 区别

3.2.2 联系

3.3 示例

四、NULL值 

五、连接查询

5.1 内连接

5.2 左连接

5.3 右连接

六、本章总结 


一、通配符

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

通常通配符都是跟 LIKE 一起使用的,并协同 WHERE 子句共同来完成查询任务。常用的通配符有两个,分别是:

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

测试表数据

1.1 查询名字是d开头的记录

select id,name from y1 where name like 'd%';

1.2 查询名字里是d和y中间有一个字符的记录 

select id,name from y1 where name like 'd_y';

1.3 查询名字中有g的记录

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

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

select id,name from y1 where name like 'liu___';

1.5 查询名字以 g开头的记录

通配符“%”和“”不仅可以单独使用,也可以组合使用

select id,name from y1 where name like 'g%_';

二、子查询

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

2.1 相同表查询

select 字段1,字段2 from 表名1 where 字段 in (select 字段 from 表名 where 条件);

示例:

select name,score from info where id in (select id from info where score >80);
以上
主语句:select name,score from info where id
子语句(集合): select id from info where score >80

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

2.2 不同表/多表查询

create table y2(id int);

insert into y2 values(1),(2),(3);

select * from y2;

select id,name,score from y1 where id in (select * from y2);

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

2.3 IN/NOT IN

IN 用来判断某个值是否在给定的结果集中,通常结合子查询来使用

语法:
<表达式> [NOT] IN <子查询>

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

示例:查询分数大于80的记录

2.4 insert  

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

创建一个新表

create table y4 (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hhobbid int(5));


将查询结果集插入到新创的表中

insert into y4 select * from y3 where id in (select id from y3);


2.5  update

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

2.6 delete 

删除分数小于90的学生

在 IN 前面还可以添加 NOT,其作用与 IN 相反,表示否定(即不在子查询的结果集里面)
删除分数不是小于90的记录

2.7 exists

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

ps:在使用exists时,当子查询有结果时,不关心子查询的内容,执行主查询操作;当子查询没有结果时,则不执行主查询操作。 

2.8 as别名 


第一次报错原因:select * from 表名 此为标准格式,而以上的查询语句,"表名"的位置其实是一个完整结果集,mysql并不能直接识别,而此时给与结果集设置一个别名,以”select a.id from a“的方式查询将此结果集视为一张"表",就可以正常查询数据了

三、MySQL视图

3.1 视图功能

数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射

功能:
简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性
本质而言,视图是一种select(结果集的呈现)
注:视图适合于多表浏览时使用,不适合增、删、改

3.2 视图和表的区别和联系

3.2.1 区别

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

3.2.2 联系

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

3.3 示例

#创建视图
create view 视图表名 as select * from 表名 where 条件;
#查看视图
select * from 视图表名
#查看表状态
show table status\G
#查看视图结构
desc 视图表名

查看视图与源表结构

 修改视图表数据
当数据发生变化时,若数据与之前创建视图表时的关联条件不一致时,视图表的数据将会发生改变

更改源表数据

四、NULL值 

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

null值与空值的区别(空气与真空)

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

注:NULL是占用内存空间的,而空值则不占用内存空间


查询null值

查询不为空的值

五、连接查询

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

5.1 内连接

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

格式:

select 表名1.字段1,表名1.字段2 from 表名1 inner join 表名2 on 表名1.字段 = 表名2.字段;


内连查询:通过inner join的方式将俩张表指定的相同字段的记录行输出出来

5.2 左连接

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

5.3 右连接

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

六、本章总结 

  1. 介绍了一些高阶语句在数据表或者数据库里面的用法
  2. 在MySQL中,视图表与索引一样,都是MySQL数据库的一种优化,其可以加快查询速度,但需要注意的时,视图表一般只作查询使用,不对其进行增、删、改;视图表并不占用实际内存
  3. 在表中的NULL值与空值,NULL值是占用内存空间,但是不计入数据统计,而空值是不占内存空间,但是算数据,计入数据统计的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值