(1) 数据库中的不同的表一般对应不同的实体,不同的实体具有不同的属性,如果将所有的表都汇总成一张表,则需要将所有的属性都集合在一起,不管哪个实体有没有,然后在没有此属性的实体赋值时,赋值为空,这严重浪费了磁盘的空间吧。
(2)数据库中每张表都存储一定的记录,若将所有的记录都汇总成一张表,你查询的时候,速度将会非常慢,数据库查询的时候,你给它表名,它根据表名找到此表,然后一条一条的查询记录,但若都集中的一张表中,那此表的记录将时原来分开表中记录的n多倍,那得查询多少时间啊??
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接 *** 作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。
SQL-92标准所定义的FROM子句的连接语法格式为:
FROM join_table join_type join_table
[ON (join_condition)]
其中join_table指出参与连接 *** 作的表名,连接可以对同一个表 *** 作,也可以对多表 *** 作,对同一个表 *** 作的连接又称做自连接。
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。
内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较 *** 作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。
外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。
交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
连接 *** 作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。
无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:
SELECT p1pub_id,p2pub_id,p1pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1pr_info)=DATALENGTH(p2pr_info)
(一)内连接
内连接查询 *** 作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:
SELECT
FROM authors AS a INNER JOIN publishers AS p
ON acity=pcity
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
SELECT a,ppub_id,ppub_name,pcountry
FROM authors AS a INNER JOIN publishers AS p
ON acity=pcity
(二)外连接
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来:
SELECT a,b FROM luntan LEFT JOIN usertable as b
ON ausername=busername
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:
SELECT a,b
FROM city as a FULL OUTER JOIN user as b
ON ausername=busername
左连接:(也叫左外连接,给出两个表的配匹行,并且以左边的表为准,如果左边表有而右边表没有的行,则在右边表的相应行选择的列显示为NULL,允许左边的基准表对应右边表多条满足条件的记录)左连接就是返回左边的匹配行,不考虑右边的表是否有相应的行,如:select field1,field2 from table1 left join table2
on field1=field2(基准字段,可以多个)
where table1field3=table2field3
右连接:(也叫右外连接,给出两个表的配匹行,并且以右边的表为准,如果右边表有而左边表没有的行,则在右边表的相应行选择的列显示为NULL,允许右边的基准表对应左边表多条满足条件的记录)
(三)交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等于68=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY
1数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。
2通过表的关系,来帮助我们怎样建表,建几张表。
一对一
一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然。
学生表:姓名,性别,年龄,身高,体重,籍贯,家庭住址,紧急联系人
其中姓名、性别、年龄、身高,体重属于常用数据,但是籍贯、住址和联系人为不常用数据
如果每次查询都是查询所有数据,不常用的数据就会影响效率,实际又不用
常用信息表:ID(P),姓名,性别,年龄,身高,体重
不常用信息表:ID(P),籍贯,家庭住址,紧急联系人
解决方案:将常用的和不常用的信息分享存储,分成两张表
不常用信息表和常用信息表,保证不常用信息表与常用信息表能够对应上:找一个具有唯一性的
字段来共同连接两张表。
一个常用表中的一条记录永远只能在一张不常用表中匹配一条记录,反之亦然。
一对多
一张表中有一条记录可以对应另外一张表中的多条记录;但是反过来,另外一张表的一条记录
只能对应第一张表的一条记录,这种关系就是一对多或多对一
母亲与孩子的关系:母亲,孩子两个实体
母亲表:ID(P),名字,年龄,性别
孩子表:ID(P),名字,年龄,性别
以上关系:一个妈妈可以在孩子表中找到多条记录(也可能是一条),但是一个孩子只能找到一个妈妈
是一种典型的一对多的关系。
但是以上设计:解决了实体的设计表问题,但是没有解决关系问题,孩子找不到母亲,母亲也找不到孩子
解决方案:在某一张表中增加一个字段,能够找到另外一张表中的记录:在孩子表中增加一个字段
指向母亲表,因为孩子表的记录只能匹配到一条母亲表的记录。
母亲表:ID(P),名字,年龄,性别
孩子表:ID(P),名字,年龄,性别,母亲表ID(母亲表主键)
多对多
一对表中(A)的一条记录能够对应另外一张表(B)中的多条记录;同时B表中的一条记录
也能对应A表中的多条记录
老师和学生
老师表 T_ID(P),姓名,性别
学生表 S_ID(P),姓名,性别
以上设计方案:实现了实体的设计,但是没有维护实体的关系
一个老师教过多个学生,一个学生也被多个老师教过
解决方案:增加一张中间关系表
老师与学生的关系表:ID(P),T_ID,S_ID
老师表与中间表形成一对多的关系,而中间表是多表;维护了能够唯一找到一表的关系;
同样的学生表与中间表也是一个一对多的关系;
学生找老师:找出学生ID--->中间表寻找匹配记录(多条)--->老师表匹配(一条)
老师找学生:找出老师ID--->中间表寻找匹配记录(多条)--->学生表匹配(一条)
你用用户表和管理员表
关联有什么意义么?
表之间的关联是表示表之间的关系
比如
你有个用户分类表
在用户表中有个用户类型
这个时候在用户类型字段
你就可以存放用户分类的一个编号
注意:在这里这个编号只要是唯一的就可以啊,见得一定得是自动编号的
再打个比方说
一个员工表
记录员工的基本信息
一个工资表
记录员工的工资
这个时候在工资表中的员工信息部分完全可以只村一个员工编号姓名可以重复
但是编号不会
在每个表中的这个唯一的字段
称为“关键字”
当然也可以是几个字段的组合
比如员工有两个叫张
一个男的一个女的
我们在数据库查询的时候完全可以用
姓名='张'
and
性别='男'
这样来查询到那个男的张
当然就像是上面说的
这个员工还有个唯一的编号
这个时候可以用
编号=12345
这样的来查询到
你这问题,是有四问吗?
解答:1
SELECT name,sex FROM seller where id = 1
2
SELECT store_name,store_logo FROM seller_store WHERE seller_id = 1(这问有点没看懂你的意思)
3
SELECT SUM(goods_id) FORM seller_order WHERE state = 1 and seller_id = 1
SELECT SUM(goods_id) FORM seller_order WHERE state = 2 and seller_id = 1
4
SELECT SUM(name) FORM seller_goods WHERE state = 1 and seller_id = 1
SELECT SUM(name) FORM seller_order WHERE state = 2 and seller_id = 1
个人感觉你这问题有毛病。。
首先要检查你的表与表之间是不是有约束(主外键约束),如果存在,才可以像 上面这位朋友的方式进行连接,一般连接有左连接、右连接、内连接,下面给你举例:
----做笛卡尔积
select sid,sname,scid,scsname,scscore from infom s ,score sc
------内连接 写法一
select sid,sname,scid,scsname,scscore
from infom s ,score sc inner join score sc
on sid= scid ------内连接的条件
------on sid <>scid --------是全集 - 交集
------where scscore>80
------内连接 方法二
select sid,sname,scid,scsname,scscore
from infom s ,score sc
where sid= scid
------
-------------------------------------------------------外连接 左连接
--------------左表数据完全显示,右表中相同的数据显示,不同数据null
select Studentname,scorescore
from Student left join score -----------------先写的为左表
on Studentid=score id -----------------连接条件
-------------------------------------------------------外连接 右连接
--------------右表数据完全显示,左表中相同的数据显示,不同数据显示null
select Studentname,scorescore
from Student right join score
on Studentid=score id
-------------------------------------------------------全连接 full join
-------------------------------------------------------左、右表的数据完全显示,相同的数据显示一次
select Studentname,scorescore
from Student full join score
on Studentid=score id
-------------------------------------------------------交叉联接
------------------------------------------交叉联接得到的是两表联接所有的数据组合
------------------------------------------(A表的数据记录 B 表的数据记录)
-------------------------------------------方式一
select Student,score from Student,score
-------------------------------------------方式二
select score ,Student from Student
cross join score
-----------------------------------------------------多表联接
--------------------------------------要求查出张三 C#的考试成绩,涉及student,score,subject三个表
---------方式一:
select studentname,subjectsname ,score score
from Student
inner join score
on studentid= scoreid
inner join subject
on scoreid=subjectid
where Studentname='张三' and subjectsname='C#'
---------方式二:等值联接
select studentname,subjectsname ,score score
from Student,score ,subject
where StudentDBid=scoreid and score id=subjectid
and Studentname='张三' and subjectsname='C#'
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
现有info_200601,info_200602至info_20060X个表,其表是动态生成的,表结构相同,只是表名不同,请问如果用循环语句一次查出这些表中的内容,并以sn字段做降序
解析:
只要循环查询字符串里面FROM子句后面的表名就可以了。
如C#中:
string table="info_20060";
string sql="select ";
for(int i=1;i<=X;i++)
{
string temp=table+iToString();
sql =sql+ temp+"";
if(i<X) sql+= ",";
}
sql+=" from ";
for(int i=1;i<=X;i++)
{
string temp=table+iToString();
sql += temp;
if (i < X) sql += ",";
}
sql=sql+" order by info_200601sn desc";
最后的sn不知道你什么意思。
以上就是关于数据库中为什么用多张表,而不汇总成一张表全部的内容,包括:数据库中为什么用多张表,而不汇总成一张表、怎样使数据库中的多表实现联合查询、数据库怎么设计多对多的数据表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)