高级数据操作--连接查询

一.连接查询——交叉连接

概念

表与表之间是有联系的!

所谓的连接查询,就是指将两张表或者多张表按照某个指定的条件,进行横向上的连接并显示!

所以,从结果上看,字段数增加了!

分类

根据连接查询的性质不同,又可以分成交叉连接、内连接、外连接和自然连接!

交叉连接关键字:cross join

 交叉连接含义:

交叉连接是最容易理解的,就是指从一张表中的每一条记录分别去连接另外一张表的所有的记录,并且保存所有的记录,其中也包括两张表的所有的字段!

所以说,交叉连接的本质就是两张数据表做笛卡尔积!

笛卡尔积:

所以,如果表1有m条记录,表2有n条记录,笛卡尔积的结果就是m*n条记录!

 语法:

1   -- 交叉连接语法
2   select *|字段列表 from 表名1 cross join 表名2;
3
4   select * from php_student cross join php_class;
5 /*
6   注意:
7   交叉连接的结果一般没有意义,因为产生了大量无效的数据,但是交叉连接的语法意义比较重要,它把两种表进行连接的所有可能性都罗列出来了,而且其他 的连接查询都是基于交叉连接的!
8 */
insert into php_student values
    (null,‘孙悟空‘,‘male‘,17,600,‘花果山‘,98),
    (null,‘蜘蛛精‘,‘female‘,18,500,‘花果山‘,90),
    (null,‘猪悟能‘,‘male‘,17,700,‘高老庄‘,88),
    (null,‘沙悟净‘,‘male‘,17,750,‘流沙河‘,78),
    (null,‘唐僧‘,‘male‘,17,30,‘东土大唐‘,100),
    (null,‘高翠兰‘,‘female‘,16,18,‘高老庄‘,70),
    (null,‘皇后‘,‘female‘,16,18,‘东土大唐‘,73),
    (null,‘小龙女‘,‘female‘,17,30,‘流沙河‘,80),
    (null,‘小猴子‘,‘male‘,16,100,‘花果山‘,95),
    (null,‘皇帝‘,‘male‘,16,60,‘东土大唐‘,93),
    (null,‘高翠华‘,‘female‘,16,16,‘高老庄‘,80);

 create table php_class(
    class_id tinyint unsigned  primary key auto_increment,
    class_teacher varchar(30)
    );

insert into php_class values
    (15,‘卡卡西‘),
    (16,‘纲手‘),
    (17,‘鼬‘),
    (18,‘自来也‘);
-- 交叉查询
select * from php_student cross join php_class;

注意:

交叉连接的结果一般没有意义,因为产生了大量无效的数据!

但是,交叉连接的语法意义比较重要,它把两张表进行连接的所有的可能性都罗列出来了!而且其他的连接查询都是基于交叉连接的!

案例

/*
  因为小孩取个贱名不生病好养活,所以根据出生月份和日期起名字。 根据阳历(公历) 生日中
月份: 1 长 2 栓 3 大 4 来 5 狗 6 守 7 傻 8 福 9屎 10 二 11 胖 12 臭
具体日期: 1 娟 2 妮 3 腿 4 娣 5 球 6 坑 7 年 8 岁 9 娃 10 毛 11 剩 12 姑 13 英 14 妹 15 肥 16 霞 17 狗 18 虎 19 花20 凤 21 定 22 蛋 23 妞 24 牛 25 木 26 翠 27 爱 28 财 29 石 30 美丽 31 发
*/

create table birth_month(
    month_id tinyint unsigned primary key auto_increment,
    month_value varchar(10)
)engine InnoDB default charset utf8;

insert into birth_month(month_value) values(‘长‘),(‘栓‘),(‘大‘),(‘来‘),(‘狗‘),(‘守‘),(‘傻‘),(‘福‘),(‘屎‘),(‘二‘),(‘胖‘),(‘臭‘);

create table birth_day(
    day_id tinyint unsigned primary key auto_increment,
    day_value varchar(10)
)engine InnoDB default charset utf8;

insert into birth_day(day_value) values(‘娟‘),(‘妮‘),(‘腿‘),(‘娣‘),(‘球‘),(‘坑‘),(‘年‘),(‘岁‘),(‘娃‘),(‘毛‘),(‘剩‘),(‘姑‘),(‘英‘),(‘妹‘),(‘肥‘),(‘霞‘),(‘狗‘),(‘虎‘),(‘花‘),(‘凤‘),(‘定‘),(‘蛋‘),(‘妞‘),(‘牛‘),(‘木‘),(‘翠‘),(‘爱‘),(‘财‘),(‘石‘),(‘美丽‘),(‘发‘);
1 -- 查询上面所有名字的情况
2 select * from birth_month cross join birth_day;

二.连接查询——内连接

关键字:inner join

内连接要区分左表和右表,出现在join关键字左边的表就叫做左表,反之是右表!

含义

数据在左表中存在,同时在右表中有对应的匹配的结果才会被保存,如果没有匹配上,我们就认为数据没有意义,就不会被保存!

什么叫匹配?

就是存在某种关系能够识别彼此,通常就是两张表中的两个字段的值要相等!

语法

 1  -- 内连接语法
 2   select * | 字段列表 from 左表[inner] join 右表 on 左表.字段名 = 右表.字段名;
 3  -- 这里的inner可以省略
 4
 5   select * from php_student as s inner  join php_class as c on s.class_id = c.class_id;
 6 /*
 7   注意:
 8   1.当左表和右表用来判断是否相等的字段名一样的时候,必须要以表名.字段名的形式!
 9   2.如果表名比较长,一般使用别名
10   3.如果省略了关键字on 和后面的条件,相当于交叉连接了
11     select * from php_student as s inner  join php_class as c;
12 */

 

三.连接查询——外连接

又分成了左外连接和右外连接!

1.左外连接

left outer join

含义

跟内连接一样,也是按照on后面的条件去匹配,如果匹配成功,那么就保存两个表的所有的记录,如果匹配失败,只保留左表中的记录,右表中的记录全部为NULL,此时左表也叫做主表!

1 -- 左外连接
2 select * from php_student as s left outer  join  php_class as c  on s.class_id = c.class_id;

2.右外连接

right outer join

含义

跟内连接一样,也是按照on后面的条件去匹配,如果匹配成功,那么就保存两个表的所有的记录,如果匹配失败,只保留右表中的记录,左表中的记录全部为NULL,此时右表也叫做主表!

1   -- 右外连接
2   select * from php_student as s right outer  join  php_class as c  on s.class_id = c.class_id;

注意:

左外连接和右外连接中的outer关键字都可以省略!

所以,左外连接就叫做左连接,右外连接也叫做右连接

四.连接查询——自然连接

关键字:natural join

概念

自然连接中的“自然”,是指两个或多个数据表之间进行连接的时候,系统会自动的去匹配连接条件,而不需要人为的指定,也就是没有on关键字了!

 1 /*
 2 自动匹配的规则如下:
 3 只要两张表中具有相同的字段名,系统就会认为这是一个连接条件,就会自动的去匹配这两个字段的值是否相等,如果相等就认为条件匹配上了,如果不相等就认为没有匹配上!
 4
 5 如果两个表中的多个字段名都相同,所有相同字段的值都相同才算是匹配成功!
 6 所以,自然连接的意思就是匹配的条件由系统已经确定好了,而根据匹配之后的结果如何保存又可以分成自然内连接和自然外连接:
 7 */
 8
 9
10
11 -- 自然内连接语法
12
13   左表 natural join 右表;
14
15
16 --自然内连接的本质还是内连接,只是匹配的条件只是由系统主动指定罢了
17
18 -- 内连接
19 select * from php_student inner as s join php_class as c on s.class_id = c.class_id;
20 -- 自然内连接
21 select * from php_student natural join php_class;
22
23 -- 以上两个查询语句的结果是一样的,原因就是系统指定的条件和用户人为指定的条件刚好一样的,只是自然内连接会自动删除重复的那一列
24
25
26 -- 自然外连接语法
27 --    又分成自然左外连接,自然右外连接
28 -- 语法形式:
29     左表 natural left|right join 右表
30
31 --    其实,自然外连接的本质还是外连接,只是匹配的条件由系统指定罢了,也会自动删除重复的字段
32
33
34 -- 左外连接
35     select * from php_student as s left   oin  php_class as c  on s.class_id = c.class_id;
36 -- 自然左外连接
37     select * from php_student natural left join php_class;
38
39
40
41 -- 右外连接
42     select * from php_student as s right  join  php_class as c  on s.class_id = c.class_id;
43 -- 自然右外连接
44     select * from php_student natural right join php_class;
时间: 2024-10-20 10:25:12

高级数据操作--连接查询的相关文章

高级数据操作--子查询

一.子查询——标量子查询 子查询的概念 思考: 如何得到php_student表中成绩最高的学生的记录? 1 select * from php_student order by score desc limit 1; 但是,存在一个逻辑问题,如果最高分有很多人,怎么办! 1 insert into php_student values 2 (null,'观世音','female',17,5000,'南海',100), 3 (null,'如来','male',17,6000,'西天',100);

高级数据操作--联合查询

一.联合查询 1 -- 关键字: union 2 3 -- 语法 4 select 语句1 5 union[union 选项] 6 select 语句2 7 union[union 选项] 8 ...... 9 union[union 选项] 10 select 语句n; 所谓的联合查询,就是将多个查询语句的结果进行纵向上的拼接,也就是将select语句2的查询结果放在select语句1的后面!很显然,总的记录数增加了,但是字段的数量并没有增加! 既然是多个查询记录的拼接,所以联合查询有一个最基

oracle-2-sql数据操作和查询

主要内容: >oracle 数据类型 >sql建表和约束 >sql对数九的增删改 >sql查询 >oracle伪例 1.oracle的数据类型 oracle数据库的核心是表,表中常见的数据类型有: char(length):存储固定长度的字符串,length默认1,最长2000 varchar2(length):存储可变长度的字符串,length默认长度是1,最大4000 number(p,s)存储浮点数或者是整数,p表示的是最大位数(包含小数点),p默认是38,s表示小数位

数据(连接查询、纵向联合、索引/键、CHECK约束)

-----连接查询----- ---纵向联合--- 索引/键 添加-列-确定 CHECK约束:规定他范围,不能超过范围 stable表-设计-cid右键-CHECK约束-添加-表达式后面的省略号 - 设置为年龄大于0,小于150,超过设置范围语句与约束冲突终止

mysql学习之路_高级数据操作

关系 将实体与实体的关系,反应到最终数据表的设计上来,将关系分为三种,一对多,多对多,多对多. 所有关系都是表与表之间的关系. 一对一: 一张表的一条记录一定只对应另外一张表的一条记录,反之亦然. 例 Id 姓名 性别 年龄 电话号码 1 张三 男 23 13320848263 一对多 一张表中有一条记录,对应另一张表多条记录但是反过来,另一张表的一条记录只能对应这张表的一条记录. 例母亲与孩子的关系 多对多 一张表中的一条记录对应另外一张表的多条记录,同时另一张表的一条记录对应另外一张表的多条

高级数据操作(上)

数据的操作也叫做CRUD C:Create R:Read U:Update D:Delete 一.插入数据 标准语法: 1 insert into 表名[字段列表] values(值列表): 思考: 1,如何以最快的速度向数据表中插入100万条数据? (1)蠕虫复制 含义:在已有的数据的基础之上,将原来的数据进行复制,插入到对应的表中(也可以插入到自己的表中): 1 -- 蠕虫复制 2 insert into 表名 select *|字段列表 from 表名; 3 4 create table

SQL中的高级数据操作

一.新增数据 1. 主键冲突:更新和替换 ① insert into 表名 [(字段列表)] values (值列表) on duplicate key update 字段 = 新值, 字段 = 值, ...; -- 更新 ② replace into 表名 [(字段列表)] values (值列表); -- 替换 2. 蠕虫复制 create table 表名A like 数据库.表名B; -- 从已有表中复制表结构(不复制数据), 如表B与表A在同一数据库,可活力数据库名; insert i

DQL数据查询语言——连接查询

--内连接 两种写法 等值连接select r.*,b.bummc from t_hq_ryxx r, t_hq_bm b where r.bumbm = b.bumbm select r.*,b.bummc from t_hq_ryxx r inner join t_hq_bm b on r.bumbm = b.bumbm --不等值连接select r.*,b.bummc from t_hq_ryxx r, t_hq_bm b where r.bumbm > b.bumbm select r

mysql操作--连接查询

1.innerjoin(内连接,或等值连接) select * from table1 inner join table2 on table1.column1= table2.column2; 2.left join(左连接) select * from table1left join table2 on table1.column1= table2.column2; 3.right join(右连接) select * from table1 right join table2 on tabl