select 字段列表 from 表1 join 表2 on 两个表之间的关联条件
select 字段列表 from 表1,表2 where 两个表之间的关联条件
上面这两句是一个意思,都属于连接查询中的内连接,返回完全满足关联条件的记录;第一句其实完整写法应该这样:select 字段列表 from 表1 inner join 表2 on 两个表之间的关联条件
-----------------------------------
inner join内部连接 两表都满足的组合
full outer 全连 两表相同的组合在一起,A表有但B表没有的数据(显示null), 同样B表有,A表没有的显示为(null)
A表 left join B表 左连,以A表为基础,A表的全部数据,B表有的组合。没有的为null
A表 right join B表 右连,以B表为基础,B表的全部数据,A表的有的组合。没有的为null
查询分析器中执行:
--建表table1,table2:
create table table1(id int,name varchar(10))
create table table2(id int,score int)
insert into table1 select 1,'lee'
insert into table1 select 2,'zhang'
insert into table1 select 4,'wang'
insert into table2 select 1,90
insert into table2 select 2,100
insert into table2 select 3,70
如表
-------------------------------------------------
table1| table2|
-------------------------------------------------
|id name| |id score|
|1 lee| |1 90|
|2 zhang| |2 100|
|4 wang| |3 70|
-------------------------------------------------
以下均在查询分析器中执行
一、外连接
1概念:包括左向外联接、右向外联接或完整外部联接
2左连接:left join 或 left outer join
(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行
,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。
(2)sql语句
select from table1 left join table2 on table1id=table2id
-------------结果-------------
| id | name | id | score |
------------------------------
| 1 | lee | 1 | 90 |
| 2 | zhang | 2 | 100 |
| 4 | wang |NULL| NULL |
------------------------------
注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示
3右连接:right join 或 right outer join
(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
(2)sql语句
select from table1 right join table2 on table1id=table2id
-------------结果-------------
|id | name | id | score |
------------------------------
| 1 | lee | 1 | 90 |
| 2 |zhang | 2 | 100 |
|NULL| NULL | 3 | 70 |
------------------------------
注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示
4完整外部联接:full join 或 full outer join
(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行
,则整个结果集行包含基表的数据值。
(2)sql语句
select from table1 full join table2 on table1id=table2id
-------------结果-------------
| id | name | id | score |
------------------------------
| 1 | lee | 1 | 90 |
| 2 | zhang| 2 | 100 |
| 4 | wang|NULL| NULL|
|NULL| NULL| 3 | 70 |
------------------------------
注释:返回左右连接的和(见上左、右连接)
二、内连接
1概念:内联接是用比较运算符比较要联接列的值的联接
2内连接:join 或 inner join
3sql语句
select from table1 join table2 on table1id=table2id
-------------结果-------------
| id | name | id | score |
------------------------------
| 1 | lee | 1 | 90 |
| 2 | zhang| 2 | 100 |
------------------------------
注释:只返回符合条件的table1和table2的列
4等价(与下列执行效果相同)
A:select a,b from table1 a,table2 b where aid=bid
B:select from table1 cross join table2 where table1id=table2id (注:cross join后加条件只能用where,不能用on)
三、交叉连接(完全)
1概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
(table1和table2交叉连接产生33=9条记录)
2交叉连接:cross join (不带条件where)
3sql语句
select from table1 cross join table2
-------------结果-------------
| id | name | id | score |
------------------------------
| 1 | lee | 1 | 90 |
| 2 | zhang| 1 | 90 |
| 4 | wang| 1 | 90 |
| 1 | lee| 2 | 100 |
| 2 | zhang| 2 | 100 |
| 4 | wang| 2 | 100 |
| 1 | lee | 3 | 70 |
| 2 | zhang| 3 | 70 |
| 4 | wang| 3 | 70 |
------------------------------
注释:返回33=9条记录,即笛卡尔积
4等价(与下列执行效果相同)
A:select from table1,table2
SQL 联接--->完整外联接 (完整外部联接 full outer joinon) 收藏
SQL 联接--->完整外联接 (完整外部联接 full outer joinon)
有表 titles(书信息表) 如下图
有表 publishers(出版社) 如下图
执行完整外联接代码:
select titlestitles_id,titlestitle,publisherspub_name from titles full outer join publishers on titlespub_id=publisherspub_id 结果如下图:
大家看明白了吗? 现在要讲关于完整外联接的 理论了 要顶住呀!不带睡觉啊! 不听话按行规 剁两脚指头!
一、联接( join)
通过联接,可以根据各个表之间的逻辑关系从两个或多个表中检索数据。联接表示应如何使用一个表中的数据来选择另一个表中的行。
联接条件通过以下方法定义两个表在查询中的关联方式:
指定每个表中要用于联接的列。典型的联接条件在一个表中指定外键,在另一个表中指定与其关联的键。指定比较各列的值时要使用的逻辑运算符(=、<> 等)。
二、联接类型
当联接表时,创建的联接类型影响出现在结果集内的行。联接类型:
三、内联接
内连接也叫自然连接,它是组合两个表的常用方法。自然连接将两个表中的列进行比较,将两个表中满足连接条件的行组合起来,作为结果。自然连接有两种形式的语法。
语法一:
SELECT 列 FROM 表1 [insert] JION 表2 ON 表1列=表2列
语法二:
SELECT 列 FROM 表1,表2 WHERE表1列=表2列
例从titles、authors和titleauthor表中查询书的书号、书名、作者号和作者名。
select titlestitle_id, title, authorsau_id, au_lname from titles join titleauthor on titlestitle_id=titleauthortitle_id join authors on authorsau_id=titleauthorau_id
四、外连接(Outer join)
在自然连接中,只有在两个表中匹配的行才能在结果集中出现。而在外连接中可以只限制一个表,而对另外一个表不加限制(即所有的行都出现在结果集中)。
外连接分为左外连接、右外连接和全外连接。左外连接是对连接条件中左边的表不加限制;右外连接是对右边的表不加限制;全外连接对两个表都不加限制,所有两个表中的行都会包括在结果集中。
五、外连接(Outer join)语法
左外连接的语法为: SELECT 列 FROM 表1 LEFT [OUTER]JOIN 表2 ON 表1列1=表2列2
右外连接的语法为: SELECT select_list FROM 表1 RIGHT[OUTER]JOIN 表2 ON 表1列1=表2列2
全外连接(完整外部联接)的语法为: SELECT select_list FROM 表1 FULL[OUTER] JOIN 表2 ON 表1列1=表2列2
六、左向外联接
包括第一个命名表(“左”表,出现在 JOIN 子句的最左边)中的所有行。不包括右表中的不匹配行。
例35下面的 SQL 语句说明 titles 表和 publishers 表之间的左向外联接包括所有的书名,甚至包括那些没有出版商信息的书名: Use pubs SELECT titlestitle_id, titlestitle, publisherspub_name FROM titles LEFT OUTER JOIN publishers ON titlespub_id = publisherspub_id
七、右向外联接
包括第二个命名表(“右”表,出现在 JOIN 子句的最右边)中的所有行。不包括左表中的不匹配行。
例36在 titles 和 publishers 表之间的右向外联接将包括所有的出版商,甚至包括那些在 titles 表中没有书名的出版商。
SELECT titlestitle_id, titlestitle, publisherspub_name FROM titles RIGHT OUTER JOIN publishers ON titlespub_id = publisherspub_id
八、完整外部联接
包括所有联接表中的所有行,不论它们是否匹配。
例37 titles 表和 publishers 表之间的完整外部联接显示所有书名和所有出版商,甚至包括那些在另一个表中没有匹配值的书名和出版商。
SELECT titlestitle_id, titlestitle, publisherspub_name FROM titles FULL OUTER JOIN publishers ON titlespub_id = publisherspub_id
九、交叉联接
没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
例39 阅读以下程序:
USE pubs
SELECT au_fname, au_lname, pub_name FROM authors CROSS JOIN publishers ORDER BY au_lname DESC
说明:结果集包含 184 行(authors 有 23 行,publishers 有 8 行;23 乘以 8 等于 184)。 不过,如果添加一个 WHERE 子句,则交叉联接的作用将同内联接一样。
我认为你的代码放在模块中可能有问题:
1、没有定义数据库连接对象和记录集对象,如果你用的是VB 60 SP6 版本,实际连接数据库是非常简单,给你一段在模块中使用的代码:
Public conn As New ADODBConnection '声明数据库连接对象
Public RS As New ADODBRecordset '声明记录集对象
Public MC As String '声明一个全局变量
Public Sub SJK(conn) '数据库连接过程
connConnectionString = "DRIVER=Microsoft Access Driver (mdb);DBQ=" & AppPath & "\Data\db1mdb;PWD="
connOpen
End Sub
Public Sub JLJ(RS) '记录集过程
CALL SJK(conn)
dim access as string
access = "select from 工程信息 where 工程名称 ='" & Text1Text & "'"
'问题出来了,Text1Text是不是在每个界面都是数据库连接的检测输入框?如果不是,可用变量代替:
access = "select from 工程信息 where 工程名称 ='" & MC & "'"
RSOpen access, conn, adOpenKeyset, adLockPessimistic
End Sub
变量M在界面代码中是:M = Text1Text
我不知道,你的数据库是不是就一个表(工程信息)?而且检测就检测(工程名称)字段?如果不是,不要将记录集连接过程放在模块中!!
创建一个以JDBC连接数据库的程序,包含7个步骤:
1、加载JDBC驱动程序:
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过javalangClass类的静态方法forName(StringclassName)实现。
例如:
try{
//加载MySql的驱动类
ClassforName("commysqljdbcDriver");
}catch(e){
Systemoutprintln("找不到驱动程序类,加载驱动失败!");
e();
}
成功加载后,会将Driver类的实例注册到类中。
2、提供JDBC连接的URL
连接URL定义了连接数据库时的协议、子协议、数据源标识。
书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
例如:(MySql的连接URL)
jdbc:mysql:
//localhost:3306/testuseUnicode=true&=gbk;
useUnicode=true:表示使用Unicode字符集。如果设置为
gb2312或GBK,本参数必须设置为true。=gbk:字符编码方式。
3、创建数据库的连接
要连接数据库,需要向javasql请求并获得Connection对象,该对象就代表一个数据库的连接。
使用的(Stringurl,Stringusername,Stringpassword)方法传入指定的欲连接的数据库的路径、数据库的用户名和
密码来获得。
例如:
//连接MySql数据库,用户名和密码都是root
Stringurl="jdbc:mysql://localhost:3306/test";
Stringusername="root";
Stringpassword="root";
try{
Connectioncon=
(url,username,password);
}catch(se){
Systemoutprintln("数据库连接失败!");
se();
}
4、创建一个Statement
61要执行SQL语句,必须获得javasqlStatement实例,Statement实例分为以下3
种类型:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过实例实现。
3、执行数据库存储过程。通常通过实例实现。
具体的实现方式:
Statementstmt=con();
PreparedStatementpstmt=conprepareStatement(sql);
CallableStatementcstmt=
conprepareCall("{CALLdemoSp(,)}");
5、执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery、executeUpdate
和execute
1、ResultSetexecuteQuery(StringsqlString):执行查询数据库的SQL语句
,返回一个结果集(ResultSet)对象。
2、intexecuteUpdate(StringsqlString):用于执行INSERT、UPDATE或
DELETE语句以及SQLDDL语句,如:CREATETABLE和DROPTABLE等
3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的
语句。
具体实现的代码:
ResultSetrs=stmtexecuteQuery("SELECTFROM");
introws=stmtexecuteUpdate("INSERTINTO");
booleanflag=stmtexecute(Stringsql);
6、处理结果
两种情况:
1、执行更新返回的是本次 *** 作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
61ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
行中数据的访问。
61使用结果集(ResultSet)对象的访问方法获取数据:
while(rsnext()){
Stringname=rsgetString("name");
Stringpass=rsgetString(1);//此方法比较高效
}
(列是从左到右编号的,并且从列1开始)
7、关闭JDBC对象
*** 作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声
明顺序相反:
1、关闭记录集
2、关闭声明
3、关闭连接对象
if(rs!=null){//关闭记录集
try{
rsclose();
}catch(SQLExceptione){
eprintStackTrace();
}
}
if(stmt!=null){//关闭声明
try{
stmtclose();
}catch(SQLExceptione){
eprintStackTrace();
}
}
if(conn!=null){//关闭连接对象
try{
connclose();
}catch(SQLExceptione){
eprintStackTrace();
}
}
以上就是关于数据库连接查询全部的内容,包括:数据库连接查询、关系数据库外连接的语法与语法对应的执行过程、如何用VB全局定义,连接数据库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)