MySQL进阶SQL语句2之表连接

这篇具有很好参考价值的文章主要介绍了MySQL进阶SQL语句2之表连接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.连接查询

1.1inner(内连接)

1.2left join(左连接) 

1.3right join(右连接)

1.4直接查询两个表相同的字段值的数据

2. VIEW(视图)

2.1create view(创建视图) 

2.2修改源表数据,视图数据也随之改变

2.3视图数据是否能修改

3. UNION(联集)

4.交集值

5.无交集值

6.CASE

7.空值(NULL) 和 无值( ' ' )

8.正则表达式


准备两张表 

MySQL进阶SQL语句2之表连接

1.连接查询

  • inner join(内连接):只返回两个表中联结字段相等的行
  • left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录 
  • right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录

MySQL进阶SQL语句2之表连接

1.1inner(内连接)

内连接:将两个表中字段相同的数据列出来
select * from info A inner join location B on A.name=B.name;
#使用 using 时,两个表中字段必须相同
select * from info A inner join location B using(name);

MySQL进阶SQL语句2之表连接

1.2left join(左连接) 

左连接:将左表所有数据列出,右表name相同值的数据列出来,没有以NULL代替
select * from info A left join location B on A.name=B.name;

MySQL进阶SQL语句2之表连接

1.3right join(右连接)

右连接:将右表字段值列出来,左表相同的值也显示出来,没有以NULL代替
select * from info A right join location B on A.name=B.name;

MySQL进阶SQL语句2之表连接

1.4直接查询两个表相同的字段值的数据

#一次查询两个表,效率比内连接低
select * from info A ,location B where A.name=B.name;
#对不同城市的年龄总和进行降序排序
select city,sum(A.age) from info A ,location B where A.name=B.name group by city order by sum(A.age) desc;

MySQL进阶SQL语句2之表连接

2. VIEW(视图)

  • 视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。
  • 临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
  • 视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写SQL语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。

2.1create view(创建视图) 

语法:CREATE VIEW "视图表名" AS "SELECT 语句";

#查询结果输出到新建的view视图中去
create view V_AB as select A.name,city,age from info A,location B where A.name=B.name;
#查看结果
select * from V_AB;

#删除view视图
drop view ‘视图表名’;
drop view V_AB;

MySQL进阶SQL语句2之表连接

2.2修改源表数据,视图数据也随之改变

修改view视图的数据,直接修改源表数据

update info set age=99 where name='tom';

select * from V_AB order by age desc;

MySQL进阶SQL语句2之表连接

2.3视图数据是否能修改

  • 当视图中字段保留源表中字段(没有经过函数处理),视图数据可以修改,源表数据也随之改变
  • 当视图中字段经过处理后,视图数据无法修改(例:字段经过聚合函数修改)
当字段保留源表字段
#修改视图中数据
update V_AB set age=70 where name='tom';

当改变视图字段名称,视图包含两个表数据。
create view V_ABC as select B.name,sex,city,age number from info A,location B where A.name=B.name;
update V_ABC set number=70 where name='tom';

MySQL进阶SQL语句2之表连接 MySQL进阶SQL语句2之表连接

view中字段值经过函数处理
create view V_ABCD as select city,sum(A.age) from info A,location B where A.name=B.name group by city;
update V_ABCD set sum(A.age)=70 where city='nanjing';

MySQL进阶SQL语句2之表连接

3. UNION(联集)

联集,将两个SQL语句的结果合并起来,两个SQL语句所产生的字段需要是同样的数据记录种类

UNION :生成结果的数据记录值将没有重复,且按照字段的顺序进行排序
语法:[SELECT 语句 1] UNION [SELECT 语句 2];

UNION ALL :将生成结果的数据记录值都列出来,无论有无重复
语法:[SELECT 语句 1] UNION ALL [SELECT 语句 2];


insert into location values ('tom','male');
select * from location;
select * from info;
select name from info union select name from location;
select name from info union all select name from location;

MySQL进阶SQL语句2之表连接 MySQL进阶SQL语句2之表连接

4.交集值

取两个SQL语句结果的交集
#取两个SQL语句结果的交集,有重复
select A.name from info A inner join  location B on A.name=B.name;
select A.name from info A inner join  location B using(name);
#取两个SQL语句结果的交集,且没有重复
select name from info where name in (select name from location);
select distinct A.name from info A inner join location B on A.name=B.name;
select A.name from info A inner join location B on A.name=B.name group by A.name;

MySQL进阶SQL语句2之表连接

5.无交集值

显示第一个SQL语句的结果,且与第二个SQL语句没有交集的结果,且没有重复
select distinct name from info where name not in (select name from location);
select distinct A.name from info A left join location B using(name) where B.name is null;

MySQL进阶SQL语句2之表连接

显示两个表中没有交集的值
#创建派生表,其中A表为派生表
select A.name from (select distinct name from info union all select name from location) A group by A.name having count(*)=1;
#创建视图
create view V_union as select name from info union all select name from location;
select name from V_union group by name having count(*)=1;

MySQL进阶SQL语句2之表连接

MySQL进阶SQL语句2之表连接

6.CASE

是 SQL 用来做为 IF-THEN-ELSE 之类逻辑的关键字
语法:
SELECT CASE ("字段名")
  WHEN "条件1" THEN "结果1"
  WHEN "条件2" THEN "结果2"
  ...
  [ELSE "结果N"]
  END
FROM "表名";
# "条件" 可以是一个数值或是公式。 ELSE 子句则并不是必须的。

select name,case name 
when 'jack' then age*2 
when 'mary' then age-15 
else age 
end 'new age' from info;
# 'new age' 是新定义的字段名 

MySQL进阶SQL语句2之表连接

7.空值(NULL) 和 无值( ' ' )

  1. 无值的长度为 0,不占用空间的;而 NULL 值的长度是 NULL,是占用空间的。
  2. IS NULL 或者 IS NOT NULL,是用来判断字段是不是为 NULL 或者不是 NULL,不能查出是不是无值的。
  3. 无值的判断使用=''或者<>''来处理。<> 代表不等于。 
  4. 在通过 count()指定字段统计有多少行数时,如果遇到 NULL 值会自动忽略掉,遇到无值会加入到记录中进行计算。 
create table t1 (name varchar(20));
#插入无值
insert into t1 values ('');
#插入空值
insert into t1 values ();

select * from t1;
#查看字符串长度
select length(null),length('zhangsan'),length('');

MySQL进阶SQL语句2之表连接

#过滤字段值为null值的数据
select * from t1 where name is null;
#过滤字段值不为null值,但不能过滤空值
select * from t1 where name is not null;
#将空值过滤
select * from t1 where name != '';
select * from t1 where name <> '';

MySQL进阶SQL语句2之表连接

MySQL进阶SQL语句2之表连接

8.正则表达式

匹配模式 描述 实例
^ 匹配文本的开始字符 ‘^bd’ 匹配以 bd 开头的字符串
$ 匹配文本的结束字符 ‘qn$’ 匹配以 qn 结尾的字符串
. 匹配任何单个字符 s.t’ 匹配任何 s 和 t 之间有一个字符的字符串
* 匹配零个或多个在它前面的字符 ‘fo*t’ 匹配 t 前面有任意个 o
+ 匹配前面的字符 1 次或多次 ‘hom+’ 匹配以 ho 开头,后面至少一个m 的字符串
字符串 匹配包含指定的字符串 ‘clo’ 匹配含有 clo 的字符串
p1|p2 匹配 p1 或 p2  ‘bg|fg’ 匹配 bg 或者 fg
[……] 匹配字符集合中的任意一个字符 ‘[abc]’ 匹配 a 或者 b 或者 c
[^……] 匹配不在括号中的任何字符  ‘[^ab]’ 匹配不包含 a 或者 b 的字符串
{n} 匹配前面的字符串 n 次 ‘g{2}’ 匹配含有 2 个 g 的字符串
{n,m} 匹配前面的字符串至少 n 次,至多m 次 ‘f{1,3}’ 匹配 f 最少 1 次,最多 3 次
 
语法:SELECT "字段" FROM "表名" WHERE "字段" REGEXP {模式};
#查找name字段中包含 'on'
select * from info where name regexp 'on';
#查找name字段中以 y 结尾的
select * from info where name regexp 'y$';
#查找name字段中以 y 结尾的或以 j 开头的
select * from info where name regexp 'y$|^j';

MySQL进阶SQL语句2之表连接文章来源地址https://www.toymoban.com/news/detail-499624.html

到了这里,关于MySQL进阶SQL语句2之表连接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 高级(进阶) SQL 语句

     创建两表以供使用   ---- SELECT ----显示表格中一个或数个字段的所有数据记录 ---- DISTINCT ----不显示重复的数据记录 ---- WHERE ----有条件查询 ---- AND OR ----且 或 ---- IN ----显示已知的值的数据记录 ---- BETWEEN ----显示两个值范围内的数据记录(包含边界值) ---- 通配符 ----通常通配

    2024年02月10日
    浏览(34)
  • MySQL 高级(进阶) SQL 语句二

    MYSQL数据库中的三种连接: inner join(内连接):只返回两个表中联结字段相等的行(有交集的值) left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录 注:oracle数据库支持 outer

    2024年02月07日
    浏览(33)
  • 【MySQL】基本查询之表的增删改查

    CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 创建user表并设置四个字段 注意:insert into可以省略成 insert 由于 主键 或者 唯一键 对应的值已经存在而导致插入失败,可以选择性的进行同步更新操作 注意:更新的数据也不能和其他数据冲突 创建数据表并添加数据

    2024年02月17日
    浏览(37)
  • 【SQL】MySQL的查询语句

    MySQL是一种广泛使用的关系型数据库管理系统,它被广泛地应用于各种应用程序和网站。学会使用MySQL的查询语句可以帮助我们更好地管理和分析数据,从而更好地利用数据库中的信息。在本篇博客中,我们将深入学习MySQL的查询语句,包括 SELECT 语句、 WHERE 子句、 JOIN 语句等

    2024年02月06日
    浏览(38)
  • [MySQL]不允许你不会SQL语句之查询语句

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ ------------------❤️分割线❤️------------------------- —————————

    2024年02月08日
    浏览(72)
  • 【数据库】MySQL 高级(进阶) SQL 语句

    location表格创建 store_info表格创建 显示表格中一个或数个字段的所有数据记录 不显示重复的数据记录 按照条件进行查询 在已知的字段数据取值范围内取值 另外还有not in命令,用法一致,表示显示不在指定范围内的字段的值。 在两个字段数据值之间取值,包含两边字段的数据

    2024年02月09日
    浏览(120)
  • Linux5.7 MySQL 高级(进阶) SQL 语句

    第四章 LINUX MySQL 高级(进阶) SQL 语句 一、高级SQL 语句 1.SELECT 显示表格中一个或数个字段的所有数据记录 2.DISTINCT 不显示重复的数据记录 3.WHERE 有条件查询 4.AND OR 且 或 5.IN 显示已知的值的数据记录 6.BETWEEN 显示两个值范围内的数据记录 7.通配符 通常通配符都是跟 LIKE 一起使用

    2024年02月09日
    浏览(40)
  • MySQL—一条查询SQL语句的完整执行流程

    表结构和数据如下: 我们分析的sql语句如下: 大体来说,MySQL可以分为Server层和存储引擎层两部分: Server层 包括:连接器、查询缓存、分析器、优化器、执行器等 涵盖MySQL的大多数核心服务功能 所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在

    2024年04月28日
    浏览(47)
  • mysql高级语句之视图、连接查询与存储过程

    目录 视图 视图和表的区别 视图和表的联系 视图命令 视图特点 NULL 值 null、空值和零的区别 连接查询 内连接 左连接 右连接 存储过程 概述 简介 存储过程的优点 语法 调用存储过程 存储过程的参数 查看存储过程 查看指定存储过程信息 修改存储过程 删除存储过程 数据库中

    2024年02月10日
    浏览(39)
  • MySQL中,SQL 查询总是先执行SELECT语句吗?

    在使用 MySQL 进行查询时,我们通常会使用 SELECT 语句,但是 SELECT 语句是否总是最先被执行呢?这是一个非常有趣的问题,本文将对此进行探讨。 在 MySQL 中,SQL 查询通常包括以下几个步骤: 语法解析 :MySQL 会对 SQL 查询语句进行语法解析,检查语句是否符合 SQL 语法规范。

    2023年04月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包