database里面inner join和outer join有什么区别

database里面inner join和outer join有什么区别,第1张

介绍 Inner Join 及 Outer Join 以及其应用

Inner Join

Inner Join 应该是最常用的 Join 方式, 它只会传回符合 Join 规则的纪录, 还是先来看看语法

Select <要选择的字段>From <主要资料表>

<Join 方式><次要资料表>[On <Join 规则>]

现在我们利用 MS SQL 内建的北风数据库来实际练习一下! 想多了解 MS SQL 的内建数据库, 你可以看看 SQL Server 的内建数据库 这篇文章

请打开 QA (Query Analyzer), 为了使用北风数据库, 请先执行 Use Northwind, 然后执行

Select ProductId, ProductName, SupplierId From Products

从 Products 产品资料表中取出三个字段, 分别是产品代码, 产品名称, 供货商代码, 但查询出来的结果保证让你的老板很不满意, 因为供货商代码对于人类实在是无虾米意义, 这个时候 Join 就可以帮上忙了, 藉由 Join Suppliers 这个资料表我们便可以查询到供货商名称

Select ProductId, ProductName, Suppliers.SupplierId

From Products

Inner Join Suppliers

Products.Suppliers = Suppliers.SupplierId

这款的查询结果是不是卡清楚呢! Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是讲 Join 规则不相符的资料就会被排除掉, 譬如讲在 Product 中有一项产品的供货商代码 (SupplierId), 没有出现在 Suppliers 资料表中, 那么这笔记录便会被排除掉

Outer Join

这款的 Join 方式是一般人比较少用到的, 甚至有些 SQL 的管理者也从未用过, 这真是一件悲哀的代志, 因为善用 Outer Join 是可以简化一些查询的工作的, 先来看看 Outer Join 的语法

Select <要查询的字段>From <Left 资料表>

<Left | Right>[Outer] Join <Right 资料表>On <Join 规则>

语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料, 接下来我们还是来做些实际 *** 作, 仍然是使用北风数据库, 但要先做一些小小的修改, 才能达到我们要的结果

首先要拿掉 Products 资料表的 Foreign Key, 否则没有法度在 Products 资料表新增一笔 SupplierId 没有对映到 Suppliers 资料表的纪录, 要知影一个资料表的 Constraint 你可以执行 SQL 内建的 sp_helpconstraint , 在 QA 执行

sp_helpconstraint Products

接下来删除 FK_Products_Suppliers 这个 Foreign Key

Alter Table Products

Drop Constraint FK_Products_Suppliers

再来新增一笔纪录于 Products 资料表, SupplierId 使用 50 是因为它并没有对映到 Suppliers 资料表中的记录

Insert Into Products (ProductName,SupplierId,CategoryId)

values ('Test Product','50','1')

现在我们再执行头前的查询, 只是将 Inner Join 改为 Left Outer Join

Select ProductId, ProductName, Suppliers.SupplierId

From Products

Left Outer Join Suppliers

Products.Suppliers = Suppliers.SupplierId

比较一下两种 Join 方式的查询结果, 你应该就会知影其中的差别!

再来看看 Right Outer Join, 请新增下底这笔记录

Insert Into Suppliers (CompanyName)

values ('LearnASP')

现在请使用 Right Out Join 来作查询, 比较看看查询的结果和 Inner Join 有什么不同!

寻找不相符纪录

这里我们来看看如何使用 Out Join 来找不相符纪录, 可能是有子纪录却没有父纪录或是颠倒过来

Select Suppliers.CompanyName From Products

Right Join Suppliers

On Products.SupplierId = Suppliers.SupplierId

Where Products.SupplierId is Null

执行结果你会找到一笔资料为 LearnASP, 该笔供货商资料存在, 但基本上已经没有产品是来自这个供货商, 想象一下如果不用 Outer Join 你要怎么以一个 SQL 指令完成同一查询结果! 知道 Outer Join 的好用了吧! 再执行

Select Products.ProductName

From Products

Left Join Suppliers

On Products.SupplierId = Suppliers.SupplierId

Where Suppliers.SupplierId is Null

这个查询结果你会发现 Test Product 这项产品竟然找不到供货商的资料!

安装一个数据库服务器,建立一个库。

然后先做这些练习吧,语句都加了注释了

/*

建立一个由3个文件组成的数据库,数据库名称为test。

主数据文件逻辑名称为test_data,物理文件名c:\test_data.mdf;

辅助数据文件逻辑名称为test_data2,物理文件名c:\test_data2.ndf

日至文件逻辑名称为test_log,物理文件名c:\test_log.ldf

所有文件初始尺寸为3mb,可以自动增长,最大尺寸为15mb。

*/

create database test on

primary

(

name=test_data,

filename='c:\test_data.mdf',

size=3mb,

maxsize=15mb,

filegrowth=1mb

),

(

name=test_data2,

filename='c:\test_data2.ndf',

size=3mb,

maxsize=15mb,

filegrowth=1mb

)

log on

(

name=test_log,

filename='c:\test_log.ldf',

size=3mb,

maxsize=15mb,

filegrowth=1mb

)

/*

创建一个名为employees的表,该表由5个字段组成:emp_id(员工编号)、ename(员工名称)、

age(年龄)、title(职务)、salary(薪水)。其中emp_id为该表的主键。该表存放在主文件组。

*/

use test

go

CREATE TABLE employees(

emp_id char (4) primary key,

ename nvarchar (10) NOT NULL,

age tinyint NOT NULL,

title nvarchar (10) NULL,

salary money NULL,

) ON [PRIMARY]

--向employees表插入部分数据

insert into employees values('0001','杨建新','22','经理','3000')

insert into employees values('0002','杨建新','23','职员','4000')

insert into employees values('0003','杨建新','24','总经理','5000')

insert into employees values('0004','杨建新','26','职员','2000')

--创建备份设备test_bak,其位置为c:\backup\test_bak.bak

sp_addumpdevice 'disk','test_bak','c:\backup\test_bak.bak'

--建立数据库test的完整备份到备份设备test_bak,并命名为test_full_bak1

backup database test to test_bak with name='test_full_bak1'

--向employees表插入新数据

insert into employees values('0005','王建新','24','总经理','1000')

insert into employees values('0006','刘建新','26','职员','2000')

--执行test数据库的事务日志备份,该备份追加到备份设备test_bak,命名为test_log_bak1

backup log test to test_bak with name='test_log_bak1'

--截断employees表,清空内容(记录此时的时间)

truncate table employees

--备份数据库的尾部日志

use master

go

backup log test to test_bak with name='test_log_recovery',norecovery

--恢复数据库的完整备份,并且不要执行还原进程(norecovery)

restore database test from test_bak with file=1,norecovery

--恢复第一个日志备份,如果此时执行recovery,将得到所有数据

restore log test from test_bak with file=2,recovery

--如果执行上述语句时,使用norecovery选项,则可以继续恢复第二个日志备份,即尾部日志

restore log test from test_bak with file=2,norecovery

restore log test from test_bak with file=3,recovery

--如果按照上述 *** 作,则恢复完成后employees表中没有任何数据,因为尾部日志中包含清空表的 *** 作

--若要恢复所有数据,也可以恢复到时间点到清空时间之前

restore log test from test_bak with file=3,stopat='2008-11-16 11:25:00'

--添加一个名为mike,密码为123456的login账户,该账户的默认数据库为northwind

sp_addlogin 'mike','123456','northwind'

--切换到northwind数据库

use northwind

go

--将登录账户mike映射为当前数据库中的用户

sp_grantdbaccess 'mike','mike' --或:sp_adduser 'mike','mike'

--建立数据库角色accessdata

sp_addrole tablecreate

--为数据库角色tablecreate赋予创建表的权限

grant create table to tablecreate

--将用户mike加入到角色tablecreate中

sp_addrolemember 'tablecreate','mike'

--赋予用户mike对products表的插入数据权限

grant insert on products to mike

--撤销用户mike对products表的权限

revoke insert on products from mike

--察看角色信息

sp_helprole tablecreate

--察看角色包括的成员

sp_helprolemember tablecreate

--在角色tablecreate中删除成员mike

sp_droprolemember 'tablecreate','mike'

--删除角色tablecreate

sp_droprole tablecreate

--删除数据库用户账户

sp_revokedbaccess 'mike'

--删除登录帐号

sp_droplogin 'mike'

11、已知数据库的排序规则是默认设置。在northwind 数据库中有一个表[order details],表示所有定单的详情,该表中有一列quantity,表

示定单中某产品的数量。你想实现按照产品数量从大到小排序来查询定单,使用order by 子句为(a)。

a、Select * from [order details] Order by quantity desc

b、Select * from order details Order by quantity asc

c、Select * from [order details] Order by quantity

d、Select * from [order details] Order by desc quantity

14.在ASP页面中用到的创建ActiveX组件实例的方法是(a)

a、server.createobject b、server.HTMLEncode

c、server.mappath d、server.servervariables

15. 请问Mid(“I am a student”,8,4)的结果是(a)

a、stud b、tude c、uden d、dent

16.请问Len(“我是中国人”)的结果是(5)

a、6 b、8 c、10 d、5

17、下面程序段执行完毕,页面上的显示内容是什么?(a)

<%

response.write "同学们"

Response.end

response.write "你们好!"

%>

a、同学们 b、你们好! c、同学们你们好! d、同学们(换行)你们好!

18、下面程序段执行完毕,页面上的显示内容是什么?(c)

<%

response.write "同学们"

Response.clear

response.write "你们好!"

%>

a、同学们 b、你们好! c、同学们你们好! d、同学们(换行)你们好!

19、对于下面的ASP代码,<a href=”index.asp?username=张三&pwd=1234”要获取参数username的值,正确的语句是(b,c)

a、request.form(“username”)

b、request(“username”)

c、request.querystring(“username”)

d、request.feilds(“username”)

20、Inputbox函数返回的值是(c)类型

a、数值型 b、bool型 c、字符串型 d、浮点型

msgbox函数返回的值是(b)类型

a、数值型 b、bool型 c、字符串型 d、浮点型

二、 填空题

1、 网站链接中,在同一个网站内部的链接叫做___站内链接/内链__________,不同网站文档之间的链接叫做______外部链接/外链

_______,在同一网页指定位置的链接叫做__________锚点_______。

2、 ASP的五大内部对象包括 、 、、

request,response,server,cookie,session

3、 把数值型转换为字符串型的VbScript函数是___cstr()_____;把字符串转换为整数VbScript函数是___cint/int/fix______。

4、 返回指定字符的ASCII码的函数是___asc_____;根据一个ASCII码值返回指定字符的函数是 __chr_______。

5、一段连接数据库的代码

<% set conn=server.creatobject("adodb.connection")

Connstr= "DSN=____数据源名____;UID=__用户名______;PWD=_____密码___;"

conn.open Connstr

%>

6、HTML标记,可单独使用或嵌入在各个ASP脚本单元中,以" ___<% %>______"为定界符;VBScript(或JScript)语句,可单独使用或嵌入在各

个ASP脚本单元中,以___<script language="vbscript" runat="server"></script>______为定界符, ASP脚本命令,可单独使用或包含在此和〈/html〉内,以"___<%%>______"为定界符。

不知道对不对,已经很久没用过ASP的内容了.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6769416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-28
下一篇 2023-03-28

发表评论

登录后才能评论

评论列表(0条)

保存