USE mydb
CREATE DATABASE mydb --创建数据库(不指定文件创建数据库)
--drop database mydb --删除数据库
==============以mydb数据库为例==========================
-----1、创建指定数据文件和事务日志文件的数据库---------------------
ON --指定显式定义用来存储数据库数据部分的磁盘文件(数据文件)
(
NAME = mydb_mdf,--定义的文件指定逻辑名称
FILENAME = 'C:\data\mydb_mdf.mdf', --定义的文件指定操作系统文件名 --此文件夹要先建好,否则会报设备错误
SIZE = 10, --定义的文件大小。
MAXSIZE = 50, --定义的文件可以增长到的最大大小。
FILEGROWTH = 5 --定义的文件的增长增量。
)
LOG ON --指定显式定义用来存储数据库日志的磁盘文件(日志文件)
(
NAME = mydb_ldf,
FILENAME = 'C:\data\mydb_ldf.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB
)
-----2、向数据库中添加文件----------------------------------------
ALTER DATABASE mydb --使用ALTER来修改数据库
ADD FILE
(
NAME = mydb_mdf2,
FILENAME = 'C:\data\mydb_mdf2.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 10%
)
GO
----3、向数据库中添加两个日志文件---------------------------------
ALTER DATABASE mydb
ADD LOG FILE
(
NAME = mydb_ldf2,
FILENAME = 'C:\data\mydb_ldf2.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 10%
),
(
NAME = mydb_ldf3,
FILENAME = 'C:\data\mydb_ldf3.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5
)
----4、向数据库中添加由两个文件组成的文件组--------------------------
ALTER DATABASE mydb
ADD FILEGROUP filegroup1
ALTER DATABASE mydb
ADD FILE
(
NAME = mydb_mdf3,
FILENAME = 'C:\data\mydb_mdf3.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 10
),
(
NAME = mydb_mdf4,
FILENAME = 'C:\data\mydb_mdf4.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 10
)
TO FILEGROUP filegroup1
ALTER DATABASE mydb
MODIFY FILEGROUP filegroup1 DEFAULT ---将filegroup1设置为默认文件组
----5、从数据库中删除文件-----------------------------------------
ALTER DATABASE mydb
REMOVE FILE mydb_mdf4
----6、更改文件
ALTER DATABASE mydb
MODIFY FILE
(
NAME = mydb_mdf3,
SIZE = 20MB
)
--分离和附加数据库----------------------------------
sp_detach_db mydb --使用sp_detach_db存储过程分离该数据库
--FOR ATTACH --再使用带有FRO ATTACH子句的CREATE DATABASE重新附加.如:
CREATE DATABASE mydb
ON PRIMARY (FILENAME = 'C:\data\mydb_mdf.mdf')
FOR ATTACH
exec sp_helpdb mydb --查询数据库信息的方法
exec sp_help stud --查询表信息的方法
exec sp_dboption mydb ,'autoshrink',bool --压缩数据库的方法,bool为true时表示自动周期性压缩,为false时表示只执行本次压缩.
select @@version --查看SQL Server 的版本号
-----扩展数据库--------------------------------------
alter database 数据库名 modify file(name = 数据库名,size = 目标大小)
--如:
ALTER DATABASE mydb MODIFY FILE(NAME = mydb,SIZE = 200) --将数据库mydb的大小改为200M。
print '任务执行完毕'
---数据类型---------------------------------------
/* -------------------------------------------------------------
长度确定 长度可变 确定长度 不确定
char varchar nchar nvarchar
8000 8000 4000 4000
----------------------------------------------------------------*/
/*---1、数据约束--------------------------------------
--PRIMARY KEY 是用于定义主键列,主键列要求该列的值不能重复且不能为空。
--FOREIGN KEY (FK)是用于建立和加强两个表数据之间链接的列或多列属性。
--UNIQUE 作为表定义的一部分在创建表时使用。
如果组成UNIQUE约束的列或列组合只包含唯一值或UNLL值,则可向现有表添加UNIQUE约束。一个表可含多个UNIQUE。
--CHECK 约束是对表的某一列的值进行检查,以便其值能够满足要求,比如需要某一列的值都要大于0。
约束可以作为表定义的一部分在创建表时创建。
约束可以添加到现有表中。
表和列可以包含多个CHECK约束。
修改或删除现有的CHECK约束。
--DEFAULT 是定义表中的某一列的缺省值。
可以添加到现有表中。
表的每一列都可包含一个DEFAULT定义。
--IDENTITY 属性可以建立标识符列,每个表中只能创建一个标识符列和一个全局唯一标识符列。*/
CREATE TABLE stud
(
s_ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
s_name nvarchar(50) NOT NULL,
s_*** char(2),
s_age smallint,
s_tell varchar(15),
s_address nvarchar(50),
s_calssnum char(5)
)
ALTER TABLE stud ADD dep_email char(25) --向表中增加新列
ALTER TABLE stud DROP COLUMN dep_calssnum --向表中删除列
INSERT INTO stud VALUES('张三','男',22,88852212,'深圳市','')
INSERT INTO stud (s_tell,s_name,s_address) VALUES(99999,'李四','上海') --插入与列顺序不同的数据
INSERT INTO stud (s_tell,s_name,s_address) VALUES(8888,'李','上海') --插入与列顺序不同的数据
--将数据装载到带有标识列的表
SET IDENTITY_INSERT stud ON
INSERT INTO stud(s_ID,s_name) VALUES(-1,'单天芳')
DELETE stud WHERE s_ID = -1
truncate TABLE stud --删除表中的所有行,是一种快速、无日志记录的方法。
select * from stud
select s_*** as 姓名 from stud
delete stud --删除表或视图中的一行或多行。
DROP TABLE stud --删除表的定义
------临时表---------------------------------------------------
--临时表:临时表与永久表相似,但临时表存储在tempdb中,当不再使用时会自动删除。
--两种类型:1、本地临时表:本地临时表的名称以单个数字符号“#”打头;它们仅对当前的用户连接是可见的;当用户从SQL Server实例断开连接时被删除。
-- 2、全局临时表:全局临时表的名称以数学符号“##”打头,创建后对任何用户都是可见的,当所有引用该表的用户从SQL Server断开连接时被删除。
/*因临时表中有IDENTY,所以在创建临时表后在对该表添加数据前,需先用SET IDENTITY_INSERT stud表OFF将以前打开的“stud”表的IDENTITY_INSERT属性关闭,
然后再用SET IDENTITY_INSERT #stud ON将“#stud”的IDENTITY_INSERT属性打开,然后将stud的数据添加到临时表中.*/
CREATE TABLE #stud
(
s_ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
s_name nvarchar(50) NOT NULL,
s_*** char(2),
s_age smallint,
s_tell varchar(15),
s_address nvarchar(50),
s_calssnum char(5)
)
SET IDENTITY_INSERT stud OFF
SET IDENTITY_INSERT #stud ON
INSERT INTO #stud (s_ID,s_name,s_***,s_age,s_tell,s_address,s_calssnum)
SELECT TOP 10 * FROM stud
SELECT * FROM #stud
DROP TABLE #stud
--表查询
-----------------------------------------------------------------
CREATE TABLE bookPublishing --图书出版社
(
bp_num INT IDENTITY (1,1) PRIMARY KEY NOT NULL, --出版社编号
bp_name VARCHAR (40) DEFAULT 'NanSan', --出版社名称
bp_address VARCHAR (100) NULL, --出版社地址
bp_tell VARCHAR (20) NULL --出版社电话
)
INSERT INTO bookPublishing VALUES ('清华出版社','北京','010-112319922')
INSERT INTO bookPublishing VALUES ('深圳出版社','深圳','0755-88852212')
INSERT INTO bookPublishing VALUES ('上海出版社','上海','111111231022')
INSERT INTO bookPublishing VALUES ('广州出版社','广州','020-102123333')
INSERT INTO bookPublishing VALUES ('广州出版社','广州','020-102123333')
delete bookPublishing where bp_num = '1'
CREATE TABLE bookInformation --图书信息
(
bi_num INT IDENTITY(1,1) PRIMARY KEY NOT NULL, --图书编号
bi_author NVARCHAR (50) NOT NULL, --作者
bi_name NVARCHAR (50) NOT NULL, --名称
bp_num INT FOREIGN KEY REFERENCES bookPublishing, --将出版社编号列作为“图书出版社”的外键列
bi_bookPublishNum VARCHAR (50) NULL, --图书出版号
bi_price NUMERIC(10,4) NOT NULL, --单价
bi_buynum INT NOT NULL, --购进数量
bi_totalprice AS (bi_buynum * bi_price) --购书总价
)
INSERT INTO bookInformation (bi_author,bi_name,bi_bookPublishNum,bi_price,bi_buynum) VALUES ('张红','Linux C develop','100','34','30')
INSERT INTO bookInformation (bi_author,bi_name,bi_bookPublishNum,bi_price,bi_buynum) VALUES ('小三','Linux kernel','30','12','9')
INSERT INTO bookInformation (bi_author,bi_name,bi_bookPublishNum,bi_price,bi_buynum) VALUES ('李月','driver develop','50','78','20')
INSERT INTO bookInformation (bi_author,bi_name,bi_bookPublishNum,bi_price,bi_buynum) VALUES ('张三','unix','50','78','900')
INSERT INTO bookInformation (bi_author,bi_name,bi_bookPublishNum,bi_price,bi_buynum) VALUES ('李四','embedded develop','50','78','20')
delete bookInformation
CREATE TABLE bookDiscount --图书折扣
(
bd_num NVARCHAR (10) NOT NULL, --折扣编号
bd_bookNum INT FOREIGN KEY REFERENCES bookInformation, --折扣书编号为图书信息表的外键
bd_discountMoney DECIMAL (4,2) NOT NULL --折后金额
)
INSERT INTO bookDiscount (bd_num,bd_discountMoney) VALUES ('1001','10')
INSERT INTO bookDiscount (bd_num,bd_discountMoney) VALUES ('1002','50')
INSERT INTO bookDiscount (bd_num,bd_discountMoney) VALUES ('1003','20')
INSERT INTO bookDiscount (bd_num,bd_discountMoney) VALUES ('1004','5')
INSERT INTO bookDiscount (bd_num,bd_discountMoney) VALUES ('1006','70')
drop table bookPublishing
----------SELECT---------------------------
select * from bookDiscount
select * from bookPublishing
select * from bookInformation
SELECT bd_num,bd_discountMoney FROM bookDiscount --查询显示指定的列
select bd_num as 折扣编号,bd_discountMoney as '折扣金额' FROM bookDiscount --查询指定列的别名
SELECT bp_name = bp_name + 'P',bp_tell = bp_tell + '(0755)' FROM bookPublishing --查询选择特定列
SELECT bp_name = bp_name+','+bp_tell FROM bookPublishing --查询结果集中的常量 (效率和性能有明显的优势)
SELECT DISTINCT bp_name FROM bookPublishing --使用DISTINCT消除重复项
SELECT TOP 2 * FROM bookDiscount --查询显示表的前N条数据
SELECT TOP 51 PERCENT bd_discountMoney FROM bookDiscount --指定了percent,n就是返回结果集的百分比
SET ROWCOUNT 2 SELECT bd_discountMoney FROM bookDiscount --限制结果集的一种方法 SET ROWCOUNT N
SET ROWCOUNT 5 SELECT * FROM bookPublishing ORDER BY bp_name DESC --使用SET ROWCOUNT ,ORDER BY 能发挥作用。
/*--SET ROWCOUNT and TOP 的区别:-------
1、TOP 子句的有效范围是指定了该子句的单个SELECT语句。
而SET ROWCOUNT的有效范围是在执行另一个SET ROWCOUNT语句之前,SET ROWCOUNT会一直有效。
SET ROWCOUNT 0 将会关闭此选项。
2、对ORDER BY 的处理不同:
--使用SET ROWCOUNT ,ORDER BY 能发挥作用,如:SET ROWCOUNT 5 SELECT * FROM bookPublishing ORDER BY bp_name DESC
--当指定了ORDER BY ,SELECT TOP 语句将在从某个已根据指定的ORDER BY分类进行了排序的值中选择N行后终止。如:
SELECT TOP 2 * FROM bookPublishing ORDER BY bp_name DESC
*/
------------------------------------------------
SELECT * FROM bookInformation WHERE bi_price = '78'
SELECT bi_name as 图书名称
FROM bookInformation
WHERE bi_price > $34
GROUP BY bi_name
HAVING AVG(bi_buynum) > 45 --HAVING 子句通常与GROUP BY结合使用。
SELECT * FROM bookInformation WHERE bi_buynum BETWEEN 20 AND 50 --BETWEEN 和 NOT BETWEEN 范围关键子
SELECT bi_name FROM bookInformation WHERE bi_buynum NOT BETWEEN 20 AND 50
SELECT * FROM bookInformation WHERE bi_num IN (7,9,11) --使用IN 和NOT IN 可选值的列表
SELECT bi_author FROM bookInformation WHERE bi_num NOT IN (7,9,11)
SELECT * FROM bookInformation WHERE bi_author LIKE'张%' --“%”包含零个或更多字符的任意字符串。
SELECT bi_author FROM bookInformation WHERE bi_author LIKE'%张%'
SELECT bi_author FROM bookInformation WHERE bi_author = N'张三'
SELECT * FROM bookInformation WHERE bp_num IS NOT NULL --使用字符型的空值判断字IS NULL和IS NOT NULL
SELECT * FROM bookInformation WHERE bp_num IS NULL
SELECT * FROM bookInformation WHERE bi_buynum > 20 OR (bi_price >=78 AND bi_totalprice > 1560 ) --=ALL >ALL <=ALL
SELECT * FROM bookInformation WHERE bi_buynum > 20 OR (bi_price >= 78 AND bi_totalprice >= 1560) --当一个语句中同时包含多个逻辑运算符时,取值的优先顺序依次为:NOT、AND、和 OR。
SELECT COUNT(*) AS 符合条件的记录数或行数, bi_totalprice = SUM(bi_totalprice) FROM bookInformation --函数使用
SELECT COUNT(ALL bi_num) AS 符合条件的记录数或行数, bi_totalprice = AVG(bi_totalprice) FROM bookInformation WHERE bi_price >= 34 --
SELECT COUNT(DISTINCT bi_buynum) AS 符合条件的记录数或行数, bi_totalprice = AVG(bi_totalprice) FROM bookInformation WHERE bi_price >= 34 --COUNT中使用DISTINCT去除一些重复的记录。
SELECT bi_totalprice = MAX(bi_totalprice) FROM bookInformation --函数的使用
SELECT bi_totalprice = MIN(bi_totalprice) FROM bookInformation
SELECT bi_totalprice = MIN(bi_totalprice),bi_totalprice = MAX(bi_totalprice) FROM bookInformation
SELECT bi_buynum as 购进数量,bi_bookPublishNum AS 版号, COUNT(*) AS 数量 FROM bookInformation WHERE bi_price > 0 GROUP BY bi_buynum,bi_bookPublishNum--GROUP BY的使用
SELECT * FROM bookInformation
SELECT bi_bookPublishNum AS 编号 FROM bookInformation GROUP BY bi_bookPublishNum --查询有多少个不同的版本号
SELECT bi_bookPublishNum, bi_totalprice = SUM(bi_totalprice),COUNT(*)AS 数量 FROM bookInformation WHERE bi_buynum > 10 GROUP BY bi_bookPublishNum HAVING SUM(bi_price) > 20
SELECT * FROM bookInformation
/*-------------WHERE 、 GROUP BY 、HAVING---------------------------------
--WHERE 子句搜索条件在进行分组之前应用;而HAVING搜索条件在进行分组操作之后应用;
WHERE 和 HAVING 语法类似,但HAVING可以包含聚合函数
HAVING 子句可以引用选择列表中出现的任意项。
--WHERE 子句用来筛选FROM子句中指定的操作所产生的行,所以WHERE常在FROM之后。
GROUP BY 子句用来分组WHERE 子句的处理后的结果,所以GROUP BY常在WHERE之后。
HAVING子句用来从GROUP BY 分组的结果中筛选行,所以HAVING常在GROUP BY 之后。
*/
SELECT bi_name FROM bookInformation GROUP BY bi_name HAVING COUNT(*) = 1
SELECT bi_name FROM bookInformation GROUP BY bi_name HAVING bi_name LIKE'L%'
------------------------------------------
SELECT bi_name AS 名称,--bi_bookPublishNum,--bi_num,
SUM(bi_price) AS 总价格,
AVG(bi_buynum) AS 总数量,
COUNT(*) AS 总数
FROM bookInformation
WHERE bi_buynum > 10 AND bi_totalprice < 7000
GROUP BY ALL bi_name --, bi_bookPublishNum --
HAVING SUM(bi_price) >= 10 AND AVG(bi_buynum) <1000
ORDER BY bi_name DESC
---------UPDATE ----------
/*
UPDATE table
SET line = new values ...
WHERE line = values ...
*/
UPDATE bookInformation SET bi_author = '李光' WHERE bi_price > 30
UPDATE bookInformation SET bi_author = 'Nshenzhen ' + bi_name
UPDATE bookInformation --将UPDATE 语句与SELECT 语句中的TOP子句一起使用.
SET bi_author = '张五'
FROM(SELECT TOP 3 * FROM bookInformation) AS T --将SELECT 语句中的TOP 子句的结果集作为一个表来处理.
WHERE T.bi_num = bookInformation.bi_num
DELETE bookInformation WHERE bi_author = '李光'
DELETE bookInformation
FROM(SELECT TOP 2 * FROM bookInformation) AS T
WHERE T.bi_num = bookInformation.bi_num
select * from bookDiscount
select * from bookPublishing
select * from bookInformation
--========高级查询====================================
SELECT bi_buynum FROM bookInformation WHERE bi_buynum ='20'
SELECT bi_buynum
FROM bookInformation
WHERE bi_buynum =
(
SELECT bd_discountmoney FROM bookDiscount WHERE bd_discountmoney = '20'
)
SELECT bi_buynum AS 购进数量
FROM bookInformation
WHERE bi_buynum NOT IN
(
SELECT bd_discountmoney FROM bookDiscount WHERE bd_discountmoney = '20'
)
SELECT bi.bi_buynum AS 购进数量
FROM bookInformation AS bi
WHERE bi_buynum IN
(
SELECT bd_discountmoney FROM bookDiscount WHERE bd_discountmoney = '20'
AND bd_num = '1003'
)
---- >、<、<>、>=、<=、!>、 !<、> ALL、< ALL、SOME = ANY、MIN
SELECT DISTINCT bi.bi_buynum AS 购进数量
FROM bookInformation AS bi
WHERE bi_buynum >
(
SELECT MIN(bd_discountmoney)
FROM bookDiscount
GROUP BY bd_discountmoney
HAVING bd_discountmoney = '20'
)
SELECT DISTINCT bi.bi_buynum AS 购进数量
FROM bookInformation AS bi
WHERE bi_buynum NOT IN --<>ALL与NOT IN意义相同
(
SELECT MIN(bd_discountmoney)
FROM bookDiscount
GROUP BY bd_discountmoney
HAVING bd_discountmoney = '20'
)
SELECT DISTINCT bi.bi_buynum AS 购进数量
FROM bookInformation AS bi
WHERE bi_buynum = ANY --IN 使用“=ANY”运算符与使用IN等效。但<>ANY 运算符与NOT IN有所不同。
(
SELECT bd_discountmoney FROM bookDiscount WHERE bd_discountmoney = '20'
AND bd_num = '1003'
)
SELECT DISTINCT bi.bi_buynum AS 购进数量
FROM bookInformation AS bi
WHERE bi_buynum > ALL ---用ALL代替了求最大值
(
SELECT bd_discountmoney
FROM bookDiscount
GROUP BY bd_discountmoney
HAVING bd_discountmoney = '20'
)
SELECT DISTINCT bi.bi_buynum AS 购进数量
FROM bookInformation AS bi
WHERE bi_buynum > ANY --用ANY代替了求最小值。
(
SELECT bd_discountmoney
FROM bookDiscount
GROUP BY bd_discountmoney
HAVING bd_discountmoney = '20'
)
SELECT bi_buynum AS 购进数量 FROM bookInformation
WHERE EXISTS
(
SELECT * FROM bookDiscount WHERE bd_discountmoney = '20'
)
--1、
SELECT bi_buynum
FROM bookInformation
WHERE bd_bookNum = ANY
(
SELECT bd_bookNum FROM bookDiscount
)
SELECT bi_buynum
FROM bookInformation
WHERE EXISTS
(
SELECT * FROM bookDiscount
WHERE bookInformation.bd_bookNum = bookDiscount.bd_bookNum
)
--2、
SELECT bi_buynum
FROM bookInformation
WHERE bd_bookNum IN
(
SELECT bd_bookNum FROM bookDiscount
WHERE bd_discountmoney = '20'
)
SELECT bi_buynum
FROM bookInformation
WHERE EXISTS
(
SELECT * FROM bookDiscount
WHERE bookInformation.bd_bookNum = bookDiscount.bd_bookNum
AND bd_discountmoney = '20'
)
--3、
SELECT bi_buynum
FROM bookInformation
WHERE NOT EXISTS
(
SELECT * FROM bookDiscount
WHERE bookInformation.bd_bookNum = bookDiscount.bd_bookNum
AND bd_discountmoney = '20'
)
/*--
1、 ">ALL"表示大于每一个值,换句话说,大于ALL后的最大值。
">ANY"表示至少大于一个值,也就是大于ANY后面的最小值。
要使带有">ALL"的字查询中的某行满足外部查询中指定的条件,引入子查询的列中的值必须大于由子查询返回的值的列表中的每个值。
同样,">ANY"表示要使某一行满足外部查询中指定的条件,引入子查询的列中的值必须至少大于由子查询返回的值的列表中的一个值。
2、使用“=ANY”运算符与使用"IN"等效。但<>ANY 运算符与NOT IN有所不同。
<>表示不等于a,或不等于b,或不等于c,即不等于任何一个。
NOT IN表示不等于a,且不等于b,且不等于c,即与所有的都不相等。
<>ALL与NOT IN意义相同。
3、使用EXISTS的子查询(EXISTS关键字引入一个子查询时,就相当于进行一次存在测试。WHERE子句测试子查询返回的行是否存在。子查询实际上不产生任何数据;它只返回TRUE或FALSE。)
使用EXISTS关键字前面没有列名、常量或其他表达式。
由EXISTS引入的子查询的选择列表通常几乎早由(*)组成。由于只是测试是否存在符合子查询中指定条件的行,所以不必列出列名。
(1)、EXISTS和ANY等效。
(2)、EXISTS和IN等效。
*/
------------------------------------------------------------
SELECT * FROM bookInformation
---UPDATE
UPDATE bookInformation
SET bi_buynum = bi_buynum/2
WHERE bi_buynum IN
(
SELECT bd_discountmoney FROM bookDiscount WHERE bd_discountmoney = '20'
AND bd_num ='1003'
)
---DELETE
DELETE bookInformation
WHERE bi_buynum NOT IN
(
SELECT bd_discountmoney FROM bookDiscount WHERE bd_discountmoney = '20'
AND bd_num = '1003'
)
/*
1、内联接:内联接是用比较运算符比较要联接列的值的联接。
(1)、使用等号的运算符的联接。
(2)、使用等号以外的运算符的联接。
2、外联接的使用:只有当只少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。
外联接会返回FROM子句中提到的至少一个表或视图的所有行,只要这些行符合任何WHERE或HAVING搜索条件,它将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。
完整外部联接中两个表的所有行都将返回。对FROM子句中指定的外联接使用以下关键字:
LEFT OUTER JOIN 或 LEFT JOIN
RIGHT OUTER JOIN 或 RIGHT JOIN
FULL OUTER JOIN 或 FULL JOIN
(3)、左向外联接:是指不管第二个表中是否有匹配的数据,结果将包含第一个表中的所有行。
(4)、右向外联接:是指不管第一个表中是否有匹配的数据,结果将包含第二个表中的所有行。右向外联接的运算符是:RIGHT OUTER JOIN
(5)、完整外部联接:是指不管另一个表中是否有匹配的数据,结果集都包括两个表中的所有行。完整外部联接的运算符是:FULL OUTER JOIN
若要通过在联接结果中包括不匹配的行以保留不匹配的信息,应该优先考虑使用完整外部联接。
3、交叉联接:交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。
结果集中的行数将等于左表中的行数与右表中的行数的乘积,所以没有WHERE子句的交叉联接将产生联接所涉及的表的笛卡尔积。笛卡尔积结果集的大小等于第一个表的行数乘以第二个表的行数。
4、自联接:表可以通过自联接与自身联接。自联接主要用于同一个表的一列值的比较。
5、联接三个或更多的表:虽然每个联接规范只联接两个表,但FROM子句可包含多个联接规范。
*/
select * from bookDiscount
select * from bookPublishing
select * from bookInformation
--(1)
SELECT * FROM bookInformation AS a INNER JOIN bookPublishing AS p
ON a.bp_num = p.bp_num
ORDER BY p.bp_name DESC
SELECT p.bi_author,p.bi_name,a. * FROM bookInformation p INNER JOIN bookPublishing a
ON a.bp_num = p.bp_num
ORDER BY a.bp_name DESC
--(2)
SELECT p.bi_name,p.bi_author,a.bp_name,a.bp_tell FROM bookInformation p INNER JOIN bookPublishing a
ON a.bp_num > p.bp_num
WHERE p.bi_name = '小三'
ORDER BY a.bp_name ASC
SELECT DISTINCT a.bp_name,p.bi_author FROM bookInformation p INNER JOIN bookPublishing a
ON a.bp_num = p.bp_num
AND a.bp_name <> p.bi_author
WHERE a.bp_num < 10 AND p.bi_num < 30
--(3)
SELECT a.bp_name,a.bp_tell,p.bi_author,p.bi_name
FROM bookPublishing a LEFT JOIN bookInformation p
ON a.bp_num = p.bp_num
ORDER BY a.bp_name ASC,p.bi_author
---(4)
SELECT a.bp_name,a.bp_tell,p.bi_author,p.bi_name
FROM bookPublishing AS a RIGHT OUTER JOIN bookInformation AS p
ON a.bp_num = p.bp_num
AND a.bp_num > p.bp_num
ORDER BY a.bp_name ASC,p.bi_author
--(5)
SELECT a.bp_name,a.bp_tell,p.bi_author,p.bi_name
FROM bookPublishing a FULL OUTER JOIN bookInformation p
ON a.bp_num = p.bp_num
ORDER BY a.bp_name ASC,p.bi_author
--3交叉联接
SELECT a.bp_name,a.bp_tell,p.bi_author,p.bi_name
FROM bookPublishing a CROSS JOIN bookInformation p
ORDER BY a.bp_name ASC,p.bi_author
--如果添加一个WHERE子句,则交叉联接的作用将同内联接一样。
SELECT a.bp_name,a.bp_tell,p.bi_author,p.bi_name
FROM bookPublishing a CROSS JOIN bookInformation p
WHERE a.bp_num = p.bp_num
ORDER BY a.bp_name ASC,p.bi_author DESC
--==上等效
SELECT a.bp_name,a.bp_tell,p.bi_author,p.bi_name
FROM bookPublishing a INNER JOIN bookInformation p
ON a.bp_num = p.bp_num
ORDER BY a.bp_name ASC,p.bi_author DESC
--4、自联接
SELECT * FROM bookInformation
SELECT a.bi_author,a.bi_name,b.bi_price,b.bi_buynum
FROM bookInformation a INNER JOIN bookInformation b
ON a.bi_buynum = b.bi_buynum
WHERE a.bi_bookPublishNum = '50'
ORDER BY a.bi_author ASC
SELECT a.bi_author,a.bi_name,b.bi_price,b.bi_buynum
FROM bookInformation a INNER JOIN bookInformation b
ON a.bi_buynum = b.bi_buynum
WHERE a.bi_bookPublishNum = '50'
AND a.bi_price = '78'
AND a.bi_totalprice < 2000
ORDER BY a.bi_author ASC
-- 三表查询
SELECT a.bi_author,a.bi_name,b.bi_price,b.bi_buynum
FROM bookInformation a INNER JOIN bookInformation b
ON a.bi_buynum = b.bi_buynum JOIN bookDiscount c
ON b.bi_num = c.bd_num
WHERE a.bi_bookPublishNum = '50'
AND a.bi_price = '78'
AND a.bi_totalprice < 2000
ORDER BY a.bi_author ASC
select * from bookInformation
----------
/*--子查询规则:
1、通过比较运算符引入的子查询的选择列表只能包括一个表达式或列名称(分别对SELECT * 或列表进行EXISTS 或IN 操作除外)。
2、如果外部查询的WHERE子句包括某个列名,则该子句必须与子查询选择列表中的该列在联接上兼容。
3、子查询的选择列表中不允许出现ntext 、text和image数据类型。
4、