澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

详尽实例,SQL的多表操作

2019-11-10 作者:数据库网络   |   浏览(170)

又自学,把SQL的局地常用语句复习了贰遍。

多表更新

正文首要列举两张和三张表来陈述多表连接查询。

收拾如下:

生龙活虎经我们有两张表,一张表为Product表存放产物新闻,个中有成品价格列普赖斯;此外一张表是ProductPrice表,大家要将Product普赖斯表中的价格字段Price更新为Price表中标价字段的百分之八十。 

新建两张表:

1增

在Mysql中大家有二种手腕能够完毕这点,大器晚成种是update table1 t1, table2 ts ...的措施:

表1:student  截图如下:

1.1【插入单行】
insert [into] <表名> (列名) values (列值)
详尽实例,SQL的多表操作。例:insert into Strdents (姓名,性别,出生日期) values ('兴奋朋朋','男','1980/6/15')

UPDATE product p, productPrice pp 
SET pp.price = pp.price * 0.8 
WHERE p.productId = pp.productId 
AND p.dateCreated < '2004-01-01' 

图片 1

1.2【将长存表数据增多到一个原来就有表】
insert into <已部分新表> (列名) select <原表列名> from <原表名>
例:insert into tongxunlu ('姓名','地址','电子邮件')
select name,address,email
from Strdents

 

表2:course  截图如下:

1.3【直接拿现成表数据创立三个新表并填写】
select <新建表列名> into <新建表名> from <源表名>
例:select name,address,email into tongxunlu from strdents

别的大器晚成种方法是选拔inner join然后校勘: 

图片 2
(当时那样建表只是为了演示连接SQL语句,当然实际费用中大家不会这么建表,实际支付中那多个表会有和好分歧的主键。卡塔 尔(英语:State of Qatar)

1.4【使用union关键字合併数据开展插入多行】
insert <表名> <列名> select <列值> tnion select <列值>
例:insert Students (姓名,性别,出生辰期)
select '快乐朋朋','男','一九八〇/6/15' union(union代表下生龙活虎行卡塔 尔(英语:State of Qatar)
select '墨铁蓝小明','男','19**/**/**'

 

一、外连接


2删

2.1【删除&lt;满足条件的&gt;行】  
delete from &lt;表名&gt; [where &lt;删除条件&gt;]  
例:delete from a where name='开心朋朋'(删除表a中列值为开心朋朋的行)


2.2【删除整个表】  
truncate table &lt;表名&gt;  
truncate table tongxunlu  
注意:删除表的所有行,但表的结构、列、约束、索引等不会被删除;不能用语有外建约束引用的表

代码如下:

外接连可分为:左连接、右连接、完全外接连。

3改

UPDATE product p 
INNER JOIN productPrice pp 
ON p.productId = pp.productId 
SET pp.price = pp.price * 0.8 
WHERE p.dateCreated < '2004-01-01' 

1、左连接  left join 或 left outer join

update <表名> set <列名=更新值> [where <更新标准>]
例:update tongxunlu set 年龄=18 where 姓名='雪青别名'

 

SQL语句:select * from student left join course on student.ID=course.ID

~~~~~~~

此外我们也足以行使left outer join来做多表update,举例说纵然ProductPrice表中绝非产品价格记录以来,将Product表的isDeleted字段置为1,如下sql语句: 

推行结果:

4查

代码如下:

图片 3

4.1``精确(条件)查询
select <列名> from <表名> [where <查询条件发挥试>] [order by <排序的列名>[asc或desc]]

UPDATE product p 
LEFT JOIN productPrice pp 
ON p.productId = pp.productId 
SET p.deleted = 1 
WHERE pp.productId IS null 

左外连接满含left join左表全数行,假如左表中某行在右表未有相配,则结果中对应行右表的意气风发部分全部为空(NULL).

4.1.1【查询全体数据行和列】
例:select * from a
表达:查询a表中全部行和列

 

注:当时我们不可能说结果的行数等于左表数据的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表此时为大器晚成对黄金年代提到。

4.1.2【查询部分行列--条件查询】
例:select i,j,k from a where f=5
注解:查询表a中f=5的享有行,并显示i,j,k3列

除此以外,上面包车型大巴多少个例证都以两张表之间做涉嫌,可是只更新一张表中的记录,其实是足以同期更改两张表的,如下sql: 

详尽实例,SQL的多表操作。2、右连接  right join 或 right outer join

4.1.3【在询问中采取AS纠正列名】
例:select name as 姓名 from a where xingbie='男'
注脚:查询a表中性别为男的持有行,展现name列,并将name列改名叫(姓名卡塔尔国突显

代码如下:

SQL语句:select * from student right join course on student.ID=course.ID

4.1.4【查询空行】
例:select name from a where email is null
表明:查询表a中email为空的具有行,并展现name列;SQL语句中用is null恐怕is not null来剖断是还是不是为空行

UPDATE product p 
INNER JOIN productPrice pp 
ON p.productId = pp.productId 
SET pp.price = pp.price * 0.8, 
p.dateUpdate = CURDATE() 
WHERE p.dateCreated < '2004-01-01' 

推行结果:

4.1.5【在询问中央银行使常量】
例:select name, '唐山' as 地址 from Student
表达:查询表a,显示name列,并丰硕地址列,其列值都为'江门'

两张表做涉嫌,更新了ProductPrice表的price字段和Product表字段的dateUpdate七个字段。

图片 4

4.1.6【查询再次来到约束行数(关键字:top percent)】
例1:select top 6 name from a
证实:查询表a,展现列name的前6行,top为尤为重要字
例2:select top 60 percent name from a
证实:查询表a,展现列name的三成,percent为首要字

---------------------------------------------------------------------------------华丽分水岭---------------------------------------------------------------------------------

右外连接富含right join右表全体行,纵然左表中某行在右表未有相配,则结果中对应左表的生龙活虎部分全部为空(NULL)。

4.1.7【查询排序(关键字:order by , asc , desc卡塔 尔(阿拉伯语:قطر‎】
例:select name
from a
where chengji>=60
order by desc
证实:查询a表中chengji大于等于60的富有行,并按降序展现name列;默感觉ASC升序

多表查询

注:同样那个时候大家无法说结果的行数等于右表的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表那时候为风流倜傥对生龙活虎提到。

4.2``指鹿为马查询
4.2.1【使用like实行模糊查询】
瞩目:like运算副只用于字符串,所以仅与char和varchar数据类型联合利用
例:select * from a where name like '赵%'
证实:查询突显表a中,name字段第三个字为赵的记录

新建两张表:

3、完全外连接  full join 或 full outer join

4.2.2【使用between在某些范围内实行询问】
例:select * from a where nianling between 18 and 20
注明:查询突显表a中nianling在18到20里面包车型大巴笔录

表1:student      表2:course

SQL语句:select * from student full join course on student.ID=course.ID

4.2.3【使用in在罗列值内进行查询】
例:select name from a where address in ('北京','上海','唐山')
申明:查询表a中address值为香港(Hong Kong卡塔 尔(阿拉伯语:قطر‎市要么新加坡要么曲靖的记录,展现name字段

  图片 5      图片 6

施行结果:

4.3``.分组查询
4.3.1【使用group by举行分组查询】
例:select studentID as 学员编号,AVG(score) as 平均成绩(注释:这里的score是列名)
from score (注释:这里的score是表名)
group by studentID
证实:在表score中询问,按strdentID字段分组,呈现strdentID字段和score字段的平均值;select语句中只允许被分组的列和为各样分组重临的一个值的表明式,比如用叁个列名作为参数的聚合函数

(那个时候如此建表只是为着演示连接SQL语句,当然实际花费中大家不会如此建表,实际支付中那多个表会有自身不相同的主键。卡塔尔国

图片 7

4.3.2【使用having子句进行分组筛选】
例:select studentID as 学员编号,AVG(score) as 平均战表(注释:这里的score是列名)
from score (注释:这里的score是表名)
group by studentID
having count(score)>1
表达:接上头例子,呈现分组后count(score)>1的行,由于where只可以在平昔不分组时选拔,分组后不能不使用having来界定条件。

一、外连接

一起外接连包蕴full join左右两表中具备的行,如若右表中某行在左表中并没有相配,则结果中对应行右表的有的全部为空(NULL),假若左表中某行在右表中一直不相配,则结果中对应行左表的片段全体为空(NULL)。

4.4``.多表联接查询

外接连可分为:左连接、右连接、完全外接连。

二、内连接  join 或 inner join

4.4.1内联接

1、左连接  left join 或 left outer join

SQL语句:select * from student inner join course on student.ID=course.ID

4.4.1.1【在where子句中钦赐联接条件】
例:select a.name,b.chengji
from a,b
where a.name=b.name
表达:查询表a和表b中name字段相等的笔录,并显示表a中的name字段和表b中的chengji字段

SQL语句:select * from student left join course on student.ID=course.ID

实施结果:

4.4.1.2【在from子句中动用join…on】
例:select a.name,b.chengji
from a inner join b
on (a.name=b.name)
说明:同上

 

图片 8

4.4.2外联接

施行结果:图片 9左外连接满含left join左表全数行,假设左表中某行在右表未有相配,则结果中对应行右表的生龙活虎部分全部为空(NULL).

inner join 是相比较运算符,只回去相符条件的行。

4.4.2.1【左外联接查询】
例:select s.name,c.courseID,c.score
from strdents as s
left outer join score as c
on s.scode=c.strdentID
表达:在strdents表和score表中查询满意on条件的行,条件为score表的strdentID与strdents表中的sconde相像

注:此时大家不可能说结果的行数等于左表数据的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表那个时候为意气风发对一事关。

那儿一定于:select * from student,course where student.ID=course.ID

4.4.2.2【右外联接查询】
例:select s.name,c.courseID,c.score
from strdents as s
right outer join score as c
on s.scode=c.strdentID
注明:在strdents表和score表中查询满足on条件的行,条件为strdents表中的sconde与score表的strdentID相似

 

三、交叉连接 cross join

 

2、右连接  right join 或 right outer join

1.概念:未有 WHERE 子句的接力联接将发出连接所波及的表的笛Carl积。第二个表的行数乘以首个表的行数等于笛Carl积结果集的分寸。

下文首要列举两张和三张表来说述多表连接查询。

SQL语句:select * from student right join course on student.ID=course.ID

SQL语句:select * from student cross join course

新建两张表:

实践结果:图片 10右外连接包蕴right join右表所有行,假使左表中某行在右表未有相配,则结果中对应左表的黄金时代部分全部为空(NULL)。

推行结果:

表1:student  截图如下:

注:相近那个时候大家不可能说结果的行数等于右表的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表此时为生机勃勃对一涉及。

图片 11

图片 12

 

假定大家在这里刻给那条SQL加上WHERE子句的时候譬如SQL:select * from student cross join course where student.ID=course.ID

表2:course  截图如下:

3、完全外连接  full join 或 full outer join

这个时候将重临切合条件的结果集,结果和inner join所示施行结果形似。

图片 13
(此时这么建表只是为了演示连接SQL语句,当然实际支出中大家不会那样建表,实际付出中那三个表会有温馨分裂的主键。卡塔尔

SQL语句:select * from student full join course on student.ID=course.ID

四、两表关系为生机勃勃对多,多对意气风发或多对深入的延续语句

一、外连接

推行结果:图片 14全盘外接连富含full join左右两表中有着的行,假如右表中某行在左表中并没有相称,则结果中对应行右表的某些全部为空(NULL),假若左表中某行在右表中一向不相配,则结果中对应行左表的局地全部为空(NULL)。

当然上面两表为风流倜傥对后生可畏涉嫌,那么只要表A和表B为后生可畏对多、多对生机勃勃或多对多的时候,大家又该怎么写连接SQL语句呢?

外接连可分为:左连接、右连接、完全外接连。

 

实在两表意气风发对多的SQL语句和风流倜傥对大器晚成的SQL语句的写法都大概,只是查询的结果不等同,当然两表也要略有改换。

1、左连接  left join 或 left outer join

二、内连接  join 或 inner join

比方说表1的列能够改为:

SQL语句:select * from student left join course on student.ID=course.ID

SQL语句:select * from student inner join course on student.ID=course.ID

Sno Name Cno

试行结果:

实施结果:图片 15inner join 是相比较运算符,只回去切合条件的行。那个时候一定于:select * from student,course where student.ID=course.ID

表2的列能够改为:

图片 16

 

Cno CName

左外连接富含left join左表全数行,倘使左表中某行在右表未有相配,则结果中对应行右表的意气风发对全部为空(NULL).

三、交叉连接 cross join

这样两表就能够写黄金年代对多和多对后生可畏的SQL语句了,写法和上边包车型客车黄金年代对后生可畏SQL语句雷同。

注:当时大家不能够说结果的行数等于左表数据的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表此时为大器晚成对黄金时代涉及。

1.概念:未有 WHERE 子句的穿插联接将生出连接所涉嫌的表的笛Carl积。第八个表的行数乘以第贰个表的行数等于笛Carl积结果集的高低。

下边介绍一下当两表为多对多的时候大家该怎么建表甚至些SQL语句。

2、右连接  right join 或 right outer join

SQL语句:select * from student cross join course

新建三表:

SQL语句:select * from student right join course on student.ID=course.ID

实行结果:图片 17倘使大家在那时候候给那条SQL加上WHERE子句的时候例如SQL:select * from student cross join course where student.ID=course.ID

表A:  student 截图如下:

试行结果:

那儿将赶回适合条件的结果集,结果和inner join所示实施结果风流洒脱致。

图片 18

图片 19

四、两表关系为豆蔻梢头对多,多对生龙活虎或多对长期的三番一遍语句

表B:  course 截图如下:

右外连接包蕴right join右表全部行,要是左表中某行在右表未有相称,则结果中对应左表的有的全部为空(NULL)。

本来上面两表为风流倜傥对意气风发涉及,那么只要表A和表B为意气风发对多、多对风华正茂或多对多的时候,我们又该怎么着写连接SQL语句呢?

图片 20

注:相像那时大家不能说结果的行数等于右表的行数。当然这里查询结果的行数等于左表数据的行数,因为左右两表当时为大器晚成对后生可畏关乎。

实质上两表生机勃勃对多的SQL语句和非常的SQL语句的写法都大约,只是查询的结果不均等,当然两表也要略有更换。

表C:  student_course 截图如下:

3、完全外连接  full join 或 full outer join

诸如表1的列能够改为:

图片 21

SQL语句:select * from student full join course on student.ID=course.ID

Sno Name Cno

叁个学子能够筛选多门科目,一门科目能够被多少个学子选用,由此学子表student和课程表course之间是多对多的关联。

实践结果:

表2的列可以改为:

当两表为多对多涉及的时候,我们需求树立二个当中表student_course,中间表最少要有两表的主键,当然还足以有别的内容。

图片 22

Cno CName

SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno

全然外接连包涵full join左右两表中存有的行,若是右表中某行在左表中绝非相配,则结果中对应行右表的一些全部为空(NULL),倘若左表中某行在右表中未有相称,则结果中对应行左表的有个别全部为空(NULL)。

诸如此比两表就可以写风姿浪漫对多和多对黄金时代的SQL语句了,写法和地点的风度翩翩对后生可畏SQL语句同样。

执行结果:

二、内连接  join 或 inner join

上边介绍一下当两表为多对多的时候大家该怎么建表以至些SQL语句。

图片 23

SQL语句:select * from student inner join course on student.ID=course.ID

新建三表:

此条SQL实行的结果是学员选课的状态。

实行结果:

表A:  student 截图如下:     表B:  course 截图如下:   表C:  student_course 截图如下:

 

图片 24

    图片 25            图片 26      图片 27

 

inner join 是比较运算符,只回去相符条件的行。

叁个学员能够采用多门科目,一门课程能够被八个学子采用,因而学子表student和学科表course之间是多对多的涉及。

 

此时也就是:select * from student,course where student.ID=course.ID

当两表为多对多关系的时候,大家须要建构多少个中间表student_course,中间表最少要有两表的主键,当然还足以有其余内容。

Union

UNION 操作符用于合併四个或七个 SELECT 语句的结果集。

UNION 运算符通过结合别的三个结实表(举例 TABLE1 和 TABLE2卡塔 尔(阿拉伯语:قطر‎并消去表中其余重复行而派生出三个结实表。

当 ALL 随 UNION 一同行使时(即 UNION ALL卡塔尔国,不拔除重复行。两种状态下,派生表的每意气风发行不是缘于 TABLE1 就是缘于 TABLE2。

注意:使用UNION时,两张表查询的结果有相仿数量的列、列类型一般。

学子表音讯(Students卡塔 尔(英语:State of Qatar):

ID Name Age City MajorID
101 Tom 20 BeiJing 10
102 Lucy 18 ShangHai 11

 

 

 

先生表新闻(Teachers卡塔尔:

 ID  Name
 101  Mrs Lee
 102  Lucy

 

 

 

预置脚本:

INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)

INSERT INTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
INSERT INTO Teachers(ID,Name) VALUES(102,'Lucy')

 

1卡塔 尔(英语:State of Qatar)基本UNION查询,查询学园教师职员和工人、学子的总的新闻表,包含ID和姓名

SELECT ID,Name FROM Students
UNION
SELECT ID,Name FROM Teachers

查询结果:

 ID  Name
101 Mrs Lee
101 Tom
102  Lucy

 

 

 

 

2)带条件的UNION查询,也得以查询同一张表,查询年龄为18,25虚岁的上学的小孩子音信

SELECT ID,Name FROM Student WHERE Age=18
UNION
SELECT ID,Name FROM Student WHERE Age=23

本来,那能够动用IN恐怕O奥迪Q5十分轻便实现,这里只是点到,以后境遇复杂查询,相信你会用到。

3卡塔 尔(英语:State of Qatar)查询教师学子全体人名

 因为UNION只会选拔分歧的值,假使学员杏月教师的天分中有重名的气象,那就需求UNION ALL

SELECT Name FROM Students
UNION ALL
SELECT Name FROM Teachers

查询结果:

 ID  Name
101 Tom
102 Lucy
101 Mrs Lee
102  Lucy

 

 

 

  

三、交叉连接 cross join

SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno

 

1.概念:未有 WHERE 子句的交叉联接将生出连接所涉嫌的表的笛Carl积。第三个表的行数乘以第二个表的行数等于笛Carl积结果集的深浅。

推行结果:图片 28此条SQL推行的结果是学员选课的图景。

SQL语句:select * from student cross join course

 

实行结果:

---------------------------------------------------------------------------------华丽分水线---------------------------------------------------------------------------------

图片 29

distinct的非常用法:select  count(*) from (select distinct cdkey from tbl_alipay) s;

若是我们在此儿给那条SQL加上WHERE子句的时候比如SQL:select * from student cross join course where student.ID=course.ID

 

此时将回到相符条件的结果集,结果和inner join所示实行结果少年老成致。

distinct的另生机勃勃种方式:

四、两表关系为意气风发对多,多对生龙活虎或多对长期的连年语句

select *, count(distinct name) from table group by name

本来上边两表为风流倜傥对生龙活虎关系,那么风流洒脱旦表A和表B为大器晚成对多、多对意气风发或多对多的时候,大家又该如何写连接SQL语句呢?

结果:

骨子里两表生机勃勃对多的SQL语句和十分的SQL语句的写法都差不离,只是查询的结果不相通,当然两表也要略有改变。

   id name count(distinct name)
   1 a 1
   2 b 1
   3 c 1

举个例子表1的列能够改为:

最后风华正茂项是剩下的,不用管就能够了,目标到达

Sno Name Cno

group by 必得放在 order by 和 limit早前,不然会报错

表2的列能够改为:

 

Cno CName

引用自:

这么两表就可以写生龙活虎对多和多对风度翩翩的SQL语句了,写法和方面包车型地铁大器晚成对风姿罗曼蒂克SQL语句同样。

上边介绍一下当两表为多对多的时候大家该怎么建表以致些SQL语句。

新建三表:

表A:  student 截图如下:

图片 30

表B:  course 截图如下:

图片 31

表C:  student_course 截图如下:

图片 32

一个学员能够接纳多门课程,一门课程能够被多个学生选用,因而学子表student和科目表course之间是多对多的涉及。

当两表为多对多涉及的时候,大家必要创建一个西路表student_course,中间表最少要有两表的主键,当然还是能有别的内容。

SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno

推行结果:

图片 33

此条SQL实行的结果是学员选课的气象。

                                 接下来是另一个事例!

今昔存在简单的表(里面包车型地铁主键外键就不写了卡塔 尔(阿拉伯语:قطر‎:

  1. Create table Employee(    EmpID int,    EmpName nvarchar(10),    DepID int);  
  2. Create table Department(  DepID int,    DepName nvarchar(10));  
  3. Create talbe Manager(     EmpID int,    DepID int);  

若是本身要查询部门的音讯,包蕴(部门ID,部门名称,部门总裁,部门人数卡塔 尔(阿拉伯语:قطر‎。那要求多表连查和用到集中函数。

 

SQL语句如下:

 

  1. select D.DepID, DepName,E.EmpName ,G.Num   
  2. from t_Department as D   
  3. left join t_Manager as M   
  4. on M.DepID=D.DepID   
  5. left join t_Employee as E   
  6. on E.EmpID=M.ManagerID   
  7. left join   
  8. (select DepID,COUNT(*) as Num   
  9. from t_Employee   
  10. group by(DepID)   
  11. ) as G   
  12. on D.DepID=G.DepID;  

部门表<-->经理表<-->职工表

 

人口结果

三个结果总是便赢得结果

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:详尽实例,SQL的多表操作

关键词: