SqlServer 2008
建立一个姓名表,格式内容如图所示
建立一个职业表,格式内容如图所示.
建立一个补充表,格式内容如图所示.
按照我们前面所学的内容,如果我们要查询id为1的姓名.
那如果我们要查询id为1的姓名以及职业怎么办呢?select * from 表_姓名,表_职业 where 表_姓名.id =1 AND 表_职业.id=1;这是一种写法.
如果我们想把三个表一一对应都显示出来,还可以使用以下的写法.
还有一种写法.select * from 表_姓名 inner join 表_职业 on 表_姓名.id = 表_职业.id;inner join 就是把两个表连接起来. 而查询条件关键字却不是where 而是on了这一点是需要记住的.
那如果三张表连接起来怎么样查询呢? 我们只需要把第一个和第二个连接起来的表当做一个表来看就简单理解了.select * from 表_姓名 inner join 表_职业 on 表_姓名.id = 表_职业.idinner join 表_补充 on 表_姓名.id = 表_补充.id;-------------------------------------------------------------可以简单把红色圈住的部分理解成第一个表,把绿色圈住的部分理解成第二个表.以后无论是增加多个表,都是这样子去理解. 把前面所有的表查询结果理解成一个表.
如果我们想再多增加一个查询条件怎么办呢???select * from 表_姓名 inner join 表_职业 on 表_姓名.id=表_职业.id inner join 表_补充 on表_姓名.id = 表_补充.id AND 表_姓名.id=1;
那么我们再看这一种写法.select * from 表_姓名,表_职业,表_补充 where 表_姓名.id=表_职业.id AND 表_姓名.id = 表_补充.id;
其实仔细观察这两种写法.就是把逗号变成了 inner join以及条件全部放到了where后面查询.
inner join这种写法是ANSI-SQL语法规范的92版本.而逗号这种写法是ANSI-SQL语法规律的89版本.都可以实现同一种功能.只是写法不一样.
在ANSI-SQL 89语法中交叉连接使用.--from 表1,表2在ANSI-SQL 89语法中内连接使用.--from 表1,表2 where 条件
在ANSI-SQL 89语法中没有外连接.这是后来的语法升级规范版本提出来的概念.
但是这样做效率高吗?我们首先要对几个表进行整合或者说合并操作. 合并完了之后,再进行筛选.如果这几个表数据量非常大的话,速度性能会损耗非常明显.
select * from 表_姓名,表_职业,表_补充 where 表_姓名.id=表_职业.id AND 表_姓名.id = 表_补充.id AND 表_姓名.姓名='极客编程';比如我们想要姓名为'极客编程'的信息.我们想想是不是先把几个表整合起来,然后再查询.
那么我们来换一种写法.我们首先查询到这个姓名的id值是多少.select 表_姓名.id from 表_姓名 where 表_姓名.姓名='极客编程';
select * from 表_职业,表_补充 where 表_职业.id = (select 表_姓名.id from 表_姓名 where 表_姓名.姓名='极客编程')AND 表_职业.id=表_补充.id;
这就是传说中的子查询.我们先把查询结果当做查出来的id赋值给表_职业.id省去了大量检索的时间. 当然这是我们把索引建立到姓名和id之上的前提.
选择子查询的目的简单来说.将一个查询的结果作为另一个查询的条件.我们一般把里面的查询称为子查询,外面的查询成为外部查询.
子查询的结果有几种可能性.1.单值(一个单元格) 比如我们上面那种情况.2.多行.3.多列.4.多表
1.单值一般我们直接作为条件. 就比如上面我们写的那种语法.如果是多值的话就不能使用了.2.多行不考虑.3.多列一般放在in中作为批量删除,修改,查询操作!4.多表 一般作为数据源进行再一次检索.