SQL数据基本操作

数据的基本操作

插入表:

create table 系部
(
 系部代码 char(6) not null primary key,
 系部名称 varchar(30) not null ,
 系主任 char(8)
)
go
create table 专业
(
 专业代码 char(4) not null primary key,
 专业名称 varchar(20) not null,
 系部代码 char(6) constraint wz11 references 系部(系部代码)
)
go
create table 班级
(
 班级代码 char(9) not null primary key ,
 班级名称 varchar(20) ,
 专业代码 char(4) constraint wz1 references 专业(专业代码),
 系部代码 char(6)  constraint wz2 references 系部(系部代码),
 备注  varchar(50)
)
go
create table 学生
(
 学号 char(12) not null primary key ,
 姓名 char(8),
 性别 char(2),
 出生日期 datetime,
 入学时间 datetime,
 班级代码 char(9) constraint wz3 references 班级(班级代码),
 系部代码 char(6) constraint wz4 references 系部(系部代码),
 专业代码 char(4) constraint wz5 references 专业(专业代码),
 高考分数 int
)

内容:

insert 系部(系部代码,系部名称,系主任) values('01','计算机系','老张')
go
insert 系部(系部代码,系部名称,系主任) values('02','经济管理系','老陈')
go
insert 系部(系部代码,系部名称,系主任) values('03','机械系','老李')
go
insert 系部(系部代码,系部名称,系主任) values('04','数学系','老梁')
go
 

insert 专业(专业代码,专业名称,系部代码) values('0101','软件工程','01')
go
insert 专业(专业代码,专业名称,系部代码) values('0102','网络工程','01')
go
insert 专业(专业代码,专业名称,系部代码) values('0103','信息工程','01')
go
insert 专业(专业代码,专业名称,系部代码) values('0201','工商管理','02')
go
insert 专业(专业代码,专业名称,系部代码) values('0202','物流管理','02')
go
insert 专业(专业代码,专业名称,系部代码) values('0301','模具加工','03')
go
insert 专业(专业代码,专业名称,系部代码) values('0302','机电一化','03')
go
insert 专业(专业代码,专业名称,系部代码) values('0401','应用数学','04')
go
insert 专业(专业代码,专业名称,系部代码) values('0402','金融数学','04')
go


insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('010101','软件工程1班','0101','01','暂无')
go
insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('010102','软件工程2班','0101','01','暂无')
go
insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('010103','网络工程1班','0102','01','暂无')
go
insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('010104','网络工程2班','0102','01','暂无')
go
insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('010105','信息工程1班','0103','01','暂无')
go
insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('010106','工商管理1班','0201','02','暂无')
go
insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('010107','物流管理1班','0202','02','暂无')
go
insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('010108','模具加工1班','0301','03','暂无')
go
insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('010109','应用数学1班','0401','04','暂无')
go
insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('0101010','金融数学1班','0402','04','暂无')
go
insert 班级(班级代码,班级名称,专业代码,系部代码,备注)
values('0101011','金融数学2班','0402','04','暂无')
go


insert 学生 values('010101000000','刘德华','男','1988-5-5','2010-9-1','010101','01','0101',356)
go
insert 学生 values('010101000001','张学友','男','1988-1-4','2010-9-1','010101','01','0101',354)
go
insert 学生 values('010101000002','梁静茹','女','1988-2-1','2010-9-1','010101','01','0101',342)
go
insert 学生 values('010101000003','陈奕迅','男','1983-5-3','2010-9-1','010102','01','0101',441)
go
insert 学生 values('010101000004','张韶涵','女','1987-8-6','2010-9-1','010102','01','0101',354)
go
insert 学生 values('010101000005','林俊杰','男','1988-6-6','2010-9-1','010102','01','0101',498)
go
insert 学生 values('010101000006','孙燕姿','女','1984-5-3','2010-9-1','010106','02','0201',522)
go
insert 学生 values('010101000007','周华健','男','1986-8-6','2010-9-1','010106','02','0201',378)
go
insert 学生 values('010101000008','尚雯婕','女','1988-6-6','2010-9-1','010106','02','0201',365)
go
insert 学生 values('010101000009','任贤齐','男','1984-5-3','2010-9-1','010108','03','0301',421)
go
insert 学生 values('010101000010','魏晨','男','1986-8-6','2010-9-1','010108','03','0301',574)
go
insert 学生 values('010101000011','庞龙','男','1988-6-6','2010-9-1','010108','03','0301',452)
go
insert 学生 values('010101000012','刘若英','女','1988-5-3','2010-9-1','0101011','04','0402',354)
go
insert 学生 values('010101000013','李圣杰','男','1989-8-6','2010-9-1','0101011','04','0402',324)
go
insert 学生 values('010101000014','克群','男','1989-2-9','2010-9-1','0101011','04','0402',321)
go

--外连接查询表--------------------------------------------------------
create table 产品
(
 产品编号 char(9) not null ,
 产品名称 varchar(20)  not null ,
)
go
create table 产品销售
(
 产品编号 char(9) not null ,
 销量 int
)
go
 insert 产品 values('001','显视器')
 insert 产品 values('002','键盘')
 insert 产品 values('003','鼠标')
insert 产品销售 values('001','25')
insert 产品销售 values('003','35')
insert 产品销售 values('005','30')


--st_table ------------------------------------------------------
create table st_table
(
 学号 int not null identity,
 姓名 char(8) not null,
 专业方向 varchar(50) not null,
 系部代码 char(2) not null,
 备注 varchar(50),
 高考分数 int
)
go
insert st_table values('张学友','网络','01','没有','411')
insert st_table values('刘德华','计算机','02','没有','412')
insert st_table values('舒淇','计算机','01','没有','413')
insert st_table values('梁咏琪','动漫','02','没有','431')
insert st_table values('杨千嬅','计算机','01','没有','465')
insert st_table values('李宇春','动漫','02','没有','485')
insert st_table values('蔡依林','网络','01','没有','468')
insert st_table values('郑源','计算机','02','没有','510')
insert st_table values('陈楚生','动漫','01','没有','550')
insert st_table values('张韶涵','计算机','02','没有','421')
insert st_table values('猛非','动漫','01','没有','423')
insert st_table values('郑秀文','网络','02','没有','411')
insert st_table values('林俊杰','计算机','01','没有','511')
insert st_table values('羽泉','计算机','01','没有','500')
insert st_table values('郭富城','网络','02','没有','400')
insert st_table values('黄品源','动漫','02','没有','589')
insert st_table values('梁朝伟','计算机','02','没有','530')
insert st_table values('李克勤','网络','01','没有','520')
insert st_table values('陈小春','国际金融','02','没有','512')
insert st_table values('刘若英','证券期货','02','没有','421')
insert st_table values('刘嘉玲','房地产金融','01','没有','428')
insert st_table values('谭咏麟','房地产金融','02','没有','498')
insert st_table values('张学友','证券期货','01','没有','454')
insert st_table values('张卫健','证券期货','02','没有','515')
insert st_table values('周传雄','房地产金融','01','没有','532')
insert st_table values('周星驰','国际金融','02','没有','423')
insert st_table values('游鸿明','房地产金融','02','没有','477')
insert st_table values('言承旭','国际金融','02','没有','488')
insert st_table values('许志安','国际金融','01','没有','582')
insert st_table values('叶倩文','房地产金融','01','没有','495')
insert st_table values('叶世荣','房地产金融','02','没有','499')
insert st_table values('张雨生','证券期货','02','没有','531')
insert st_table values('周润发','国际金融','01','没有','531')
insert st_table values('张信哲','证券期货','01','没有','424')
insert st_table values('周渝民','证券期货','02','没有','412')
insert st_table values('太极乐队','证券期货','02','没有','423')

 

一、连接查询

前面所讲的查询是单表查询。若一个查询时涉及两个或两个以上的

表,则称为连接查询。连接查询是关系数据库中最主要的查询,包括

等值与非等值查询、自然连接、自身连接查询、外连接查询和复合条

件连接查询等。交叉连接的语法格式:

 

SELECT 列表列名 FROM 表名1 CROSS JOIN 表名2

CROSS JOIN   交叉表连接关键字

如:SELECT * FROM 学生 cross join 班级

 

 

1、交叉连接查询

(1) 把A表中的所有数据,跟B表中的每一条数据进行拼接,从而形成了的新的数据集

新数据集=A表所有记录 x B表所有记录

代码:SELECT 学生.姓名,学生.性别,班级.班级名称 FROM 学生 cross join 班级

 

(2)进行拼接时,加个条件语句

把学生表的每条记录的班级代码,与班级表的表的班级代码进行比较,如果列值相等,则拼接形成一条记录,否则不拼接。

代码:SELECT 学生.姓名,学生.性别,班级.班级名称 FROM 学生 cross join 班级

WHERE 学生.班级代码=班级.班级代码

 

2、自然连接

用来连接两个表的条件称为连接条件或连接谓词,其中,比较运算符主要是:=><>=<=!=

等值连接的过程类似于交叉连接,不过它只拼接满足连接条件的记录到结果集中。语法格式为:

SELECT 列表列名 FROM 表名1 JOIN 表名2  

ON 表名.列名=表名2.列名

代码:SELECT 学生.姓名,学生.性别,班级.班级名称 FROM 学生 join 班级

ON 学生.班级代码=班级.班级代码

 

3、自身连接查询

连接操作既可在多表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。使用自身连接时,必须为表指定两个别名,以示区别。

代码:select a.姓名,b.性别 from 学生 as a  join 学生 as b  on a.学号=b.学号

 

 4、外连接查询

外连接的结果集不但包含满足连接条件的行,还包括相应表中的所有行,也就是说,即使某些行不满足连接条件,但仍需要输出该行记录。外连接包括三种:左外连接、右外连接和完全外连接。

 

代码:SELECT * FROM 产品  JOIN 产品销售   ON 产品.产品编号=产品销售.产品编号

 

(1)左外连接(LEFT OUTER JOIN)

左外连接是结果表中除了包含满足连接条件的记录外,还包含左表中不满足连接条件的记录。左表中不满足条件的记录与右表记录拼接时,右表的相应列上填充NULL值。左外连接的语法格式为:

SELECT 列表列名 FROM 表名1 LEFT [OUTER] JOIN 表名2

ON 表名1.列名=表名2.列名

代码:

SELECT * FROM 产品  right JOIN 产品销售

ON 产品.产品编号=产品销售.产品编号

(2)右外连接(LEFT OUTER JOIN)

右外连接是结果表中除了包含满足连接条件的记录外,还包含右表中不满足连接条件的记录。右表中不满足条件的记录与左表记录拼接时,左表的相应列上填充NULL值。右外连接的语法格式为:

 

SELECT 列表列名 FROM 表名1 RIGHT [OUTER] JOIN 表名2

ON 表名1.列名=表名2.列名

代码:SELECT * FROM 产品 LEFT  JOIN 产品销售

ON 产品.产品编号=产品销售.产品编号

 

(3)完全外连接(FULL OUTER JOIN)

完全外连接是结果表中除了包含满足连接条件的记录外,还包含右表中不满足连接条件的记录。左()表中不满足条件的记录与右()表记录拼接时,右()表的相应列上填充NULL值。完全外连接的语法格式为

SELECT 列表列名 FROM 表名1 FULL [OUTER] JOIN 表名2

ON 表名1.列名=表名2.列名

代码:

SELECT * FROM 产品  full JOIN 产品销售

ON 产品.产品编号=产品销售.产品编号

 

11、合并结果集

使用UNION 语句可以将查询结果集合并为一个结果集,也就合并操作语法如下:

SELECT 语句

  {UNION SELECT 语句}[,n]

参加UNION操作的各结果集的列数必须相同,对应的数据类型也必须相同。

系统将自己动去掉并集的得复记录

代码:SELECT 学生.姓名,学生.性别 FROM 学生

      Union

      SELECT 学生.姓名,学生.性别 FROM  new-table

5、复合连接条件查询

前面所介绍的连接查询中,ON连接条件表达式只有一个条件,允许ON连接表达式有多个连接条件,称为复合条件连接,或多表连接.

代码:

SELECT 学生.学号,学生.姓名,学生.性别,班级.班级名称,专业.专业名称,

系部.系部名称

FROM 学生 JOIN 班级 ON 学生.班级代码=班级.班级代码

  JOIN 专业 ON 学生.专业代码=专业.专业代码

  JOIN 系部 ON 学生.系部代码=系部.系部代码

 

二、子查询

将一个查询块嵌套在另一个查询块的WHERE 子句或HAVING 短语条件中的查询叫做嵌套查询。我们把括号内的查询块称为子查询或内层查询,与之相对的概念是父查询或外层查询,即包含子查询的查询块。SQL 允许多层嵌套。但是子查询的SELECT语句中不能使用ORDER BY 子句,ORDER BY 只能对最终查询结果进行排序。

 

1、带有IN运算符的子查询(IN运算符的子查询返回的结果是集合)

SELECT 列名 FROM 表名 WHERE 列名 IN 

(SELECT 列名 FROM 表名 WHERE 列名 IN

 SELECT 列名 FROM 表名 WHERE 列名 IN(1,2,3)

)

代码 

SELECT * FROM 学生 WHERE 班级代码 IN 

(SELECT 班级代码 FROM 班级 WHERE 专业代码 IN

(SELECT 专业代码 FROM 专业 WHERE 系部代码 IN

  (SELECT 系部代码 FROM 系部 WHERE 系部代码 IN(01))

)

)

 

2、带有比较运算符的子查询

父查询与子查询之间通过比较运算符连接,便形成了带有比较运算符的子查询。

父查询中的一个表达式与子查询返回的结果(单值)进行比较

(1)带有比较运算符的子查询返回的结果是单值

(2)IN的子查询结果集为单值,则”=”符号和IN 可以互换

SELECT * FROM 表名 WHERE 列名=

(SELECT 列名 FROM 表名 WHERE 列名=X)

代码:SELECT * FROM 学生 WHERE 出生日期 >=

(SELECT 出生日期 FROM 学生 WHERE 姓名='李圣杰')

实验现象是查出了年纪最小的

 

3、带有ANY 或 ALL运算符的子查询

子查询返回单值时可以使用比较运算符,而使用ANY ALL运算符时还必须同时使用比较运算符,带有ANY ALL 运算符的子查询的处理过程是:父查询通过ANY ALL运算符将父查询中的一个表达式与子查返回结果集中的某个值进行比较。

 

代码:SELECT * FROM st_table WHERE 高考分数 >= any

(SELECT 高考分数 FROM st_table WHERE 学号 in(25,29))

实验现象,查出st_table表中分数大于等于学号为2529的人的记录


代码:SELECT * FROM st_table WHERE 高考分数 >= all

(SELECT 高考分数 FROM st_table WHERE 学号 in(25,29))

实验现象,查出st_table表中分数大于等于学号为2529分数的人的记录

 

4、带有EXISTS运算符的子查询

使用EXISTS运算符后,子查询不返回任何数据,此时,若子查询结果非空(即至小存在一条记录则父查询的WHERE 子句返回真(TRUE),否则返回假(FLASE)

代码:SELECT * FROM st_table as a WHERE EXISTS

(SELECT * FROM 学生 where a.姓名 学生.姓名)

实验现象:查出两个表中具有相同姓名的数据

 

 这个app潮流公众帐号主要是推荐给手机用户最近最潮的软件,让大家随时跟上时尚。我们会提供给你们最好的服务,喜欢我们就帮我们推荐吧!

 

原文地址:https://www.cnblogs.com/shaoyangjiang/p/2398676.html