(MySql数据库使用经验)MySql的高级查询之内连接,外连接,交叉连接以及on,exists,order by,union关键字

连接查询: 将两张表或者两张以上的表进行记录的连接(按照某个指定的条件进行数据拼接)。

连接查询的使用: 在用户查看数据的时候,需要显示的数据来自多张表.

连接查询语法: 需要使用join 关键字。

使用方式为: 左表 join 右表,左表: 在join关键字左边的表,右表: 在join关键字右边的表。

连接查询:

SQL中将连接查询分成四类: 分别为,1内连接,2外连接,4交叉连接

交叉连接:   关键字为cross join, 从一张表中循环取出每一条记录,并且把每一条记录都去另外一张表进行匹配。发生的结果我们一般称之为: 笛卡尔积。当我们实际开发中,比如日志查询页面,我们需要查询多张表中的信息,这个时候查询的数据用这个关键字,速度会相对来说慢一点,但是很少会有人选择来使用这个关键字,实用性不高。

语法: 左表 cross join 右表 或 from 左表,右表;

内连接: 关键字为join, 中括号中的inner可以省略不写,从左表中取出每一条记录,去右表中与所有的记录进行匹配,匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留,比如,要查每日的出勤,需要员工表,和出勤信息表,当使用内链接查询时,员工缺勤的信息是查不出来的。

语法:左表  join 右表 on [on相当于where,表示连接条件] 左表.字段 = 右表.字段;

字段别名以及表别名的使用: 在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分, 而表名太长, 通常可以使用别名.

内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果,

内连接还可以使用where代替on关键字,但效率差很多。

外连接: 以某张表为主,取出里面的所有记录, 然后每条与另外一张表进行连接: 不管能不能匹配上条件,最终都会保留: 能匹配,正确保留; 不能匹配,其他表的字段都置空NULL.

外连接分为两种: 是以某张表为主: 有主表

left join: 左连接(左外连接), 以左表为主表

right join: 右连接(右外连接), 以右表为主表

基本语法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;

联合查询:将多次查询(多条select语句), 在记录上进行拼接(字段不会增加),但是sql语句会变得冗长。

基本语法:多条select语句构成: 每一条select语句获取的字段数必须严格一致(但是字段类型无关)

Select 语句1

Union [sql拼接的关键字]

Select语句2... ...

Union

[All: 保留所有(不管重复还是不重复),

Distinct: 去重(整个重复):去重复的关键字只能用在第一个查询的字段上,否则查询无效果。]

联合查询的意义:

1. 查询同一张表,但是需求不同: 好比查询员工信息,按薪资降序,或者按日期升序。

2. 多表查询: 多张表的结构是完全一样的,保存的数据(结构)也是一样的,但是需要表与表之间有对应的关系,比如查我的个人信息,需要薪资表,与个人资产表,他们之间的关系在身份证号这一点来连接,数据查询出来的才是正确的。

order by

在联合查询中: order by不能直接使用,需要对某一列进行排序才行;我觉得可以先将两个表关联查询出来,然后再排好序,如果想分页查询,在使用limit M/N  来取对应分页的数据,即可

子查询: 查询是在某个查询结果之上进行的.(一条select语句内部包含了另外一条select语句当作查询的条件,比如你去相亲女方查你自己的个人信息,的时候想查你的薪资,就可以在查询个人信息时再以薪资当作查询的列,以身份证号当作查询的条件,查出你的个人信息。来看决定愿不愿意和你交往).

子查询分类

子查询有两种分类方式: 按位置分类;和按结果分类

  • 按位置分类: 子查询(select语句)在外部查询(select语句)中出现的位置

  1. From子查询: 子查询跟在from之后

  2. Where子查询: 子查询出现where条件中

  3. Exists子查询: 子查询出现在exists里面

  • 按结果分类: 根据子查询得到的数据进行分类(理论上讲任何一个查询得到的结果都可以理解为二维表)

  1. 标量子查询: 子查询得到的结果是一行一列

  2. 列子查询: 子查询得到的结果是一列多行

  3. 行子查询: 子查询得到的结果是多列一行(多行多列) (1,2,3出现的位置都是在where之后)

  4. 表子查询: 子查询得到的结果是多行多列(出现的位置是在from之后)

exists

exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表), exists是接在where之后: exists返回的结果只有0和1.

其实在我们执行sql时,如果全部执行,第二次执行就会报错,我们也可以用exists关键字在表的前面,查询数据库中是否存在该表,如果不存在,就创建一个新的表,如果存在该表,就将该表删除,重新创建及插入数据。我感觉与java中的if()else{}差不多的意思。

猜你喜欢

转载自blog.csdn.net/qq_40001362/article/details/82020793
今日推荐