
有关数据库的一写 *** 作:
创建表项就不说了
CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20),
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
插入记录:
insert into Student (Sno,Sname,Ssex,Sdept) values('aaa','mary','f','172');
删除记录:
delete from Student where Sno = 'aaa';
注:只需要删除一个主键就可以了。其他的记录会相应的删除掉。
删除表中一个字段:
ALTER TABLE Student DROP column Ssex; 列名;
修改表中的那一行数据:
原来的记录:
Sno Sname Ssex Sdept
aaa mary f 172
update Student set Sname='mary1', Ssex='m' where Sno='aaa';
修改后:
Sno Sname Ssex Sdept
aaa mary1 m 172
desc倒叙排列:
建立索引:
create unique index Sno on Student(Sno);
索引的一点好处:在查询时候比较方便,在存在的所有记录中查找一个Sno=1的时候!建立索引的表中就直接查找Sno项比较它是否=1找到后查相关的记录就比较快。没有建立索引的需要把所有信息都查找一遍,再在其中找Sno字段,再比较其值=1的相关记录。
默认是ASC。
按表中哪个字段倒叙排序:
select from Student order by Sno desc;
注意:要排序的字段必须是int型。
设置成自增长的字段在插入数据的时候不需要插入该字段的值:
select from Student order by Sno desc;
原来没有设置成自增长插入数据命令:
insert into Student (Sno,Sname,Ssex,Sdept) values('aaa','mary','f','172');
将int型的Sno字段设置成自增长后
insert into Student (Sname,Ssex,Sdept) values('mary1','f','172');
insert into Student (Sname,Ssex,Sdept) values('mar1y','f','172');
insert into Student (Sname,Ssex,Sdept) values('ma1ry','f','172');
insert into Student (Sname,Ssex,Sdept) values('m1ary','f','172');
在表中的排序如下:
Sno Sname Ssex Sdept
1 mary1 f 172
2 mar1y f 172
3 ma1ry f 172
4 m1ary f 172
/
2006720
/
查询表中记录总数:(无字段名字)
select count() from usertable;
或:(userid 为字段名字,结果是字段的总行数)
select count() userid from Student;
查询字段的平均值:
selecet avg(Sno) from Student;
select avg(字段名)from 表名;
给出查询的字段的平均值取别名:
select avg(字段名) as (别名) from (表名);
查找指定的字段的其他字段
select Sdept,Ssex,Sname
from Student
where Sno=3;
(where Sname='mary1';或则where Sname like 'mary1';)
在between语句查询的都是在and之间的所有值而IN语句则必须是in括号里面的值
select Sno,Ssex,Sname from Student where Sdept between 180 and 190;
select Sno,Ssex,Sname from Student where Sdept in (172,190);
查询Student表中的所有的名字中的Sno和Ssex值
select Sno,Ssex from Student where Sdept >= 170 and Sname like '%%';
注:%%之间是把所有的String类型的值
like和where条件查询
select last_name,salsry,department_id from employees where last_name like 'G%' and salary>3000;
查询Student表中的所有的名字中间有mary的所有名字对应的的Sno和Ssex值
select Sno,Ssex from Student where Sdept >= 170 and Sname like '%mary%';
注:mary1,1mary,marydsajdh,等
注意:and or not 用的时候,and是用在连接并列条件的2个不同的字段
or是用在选择的2个不同的字段之间,not一般用于not in(180,190)之间
order by 和asc|desc的一点不同:
order by是按先进先排,desc是先进后排,asc和desc是排列顺序不一样
disctinct条件查询
distinct 这个关键字来过滤掉多余的重复记录只保留一条,
select distinct name from table 表示将返回table表中name字段不重复的所有字段的集合。
注:distinct必须放在开头,select id distinct name from table 是错误的!
-------------------------------------------------------------------------------------
表TEST_1:
id name1 name2
9 aaa 11
8 bbb 22
3 ccc 33
4 ccc 44
5 bbb 55
6 ddd 66
7 eee 77
-------------------------------------------------------------------------------------
select distinct(name1) from test_1
结果:
name1
aaa
bbb
ccc
ddd
eee
distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的集合,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段,即上表中只能返回name1字段的所有不重复记录集合。
-------------------------------------------------------------------------------------
如果现在想查询出表test_1中所有name1不重复的id和name1字段的记录呢
select distinct name, id from table
结果:
name1 id
aaa 9
bbb 5
bbb 8
ccc 3
ccc 4
ddd 6
eee 7
并不是我们所想要的结果
select distinct name,id from table 作用了两个字段,也就是必须得id与name都相同的才会被排除,即返回去除table表中id和name两个字段同时相同情况下所有集合。
-------------------------------------------------------------------------------------
如果现在想查询出表test_1中所有name1不重复的所有字段的记录呢
对于
select from test_1 where name1 in (select distinct name1 from tablename)
等价于
select from test_1 where name1 in ('aaa','bbb','ccc','ddd','eee')
我们很可能认为它是可行的,但实际上结果却是:
id name1 name2
9 aaa 11
8 bbb 22
3 ccc 33
4 ccc 44
5 bbb 55
6 ddd 66
7 eee 77
正确sql应该是:
select from test_1 inner join (select min(id) as id from test_1 group by name1 order by id ) T on test_1id = Tid
min(id)或max(id)都行,order by id 可要可不要这里用内连接实现联合查询,也可以用where语句
select from test_1 ,(select min(id) as id from test_1 group by name1 order by id ) where test_1id = Tid
-------------------------------------------------------------------------------------
联合查询
查询表中的各个字段的值
select Sno,Sname,Ssex,Sdept from Student;
多表查询(2个表,publishtable和publishtable,给表起了别名)
select uuserid,uage,uusername,ppublishname from usertable u,publishtable p where uuserid = ppublishid;
多表查询(3个表employees,departments和locations表,给表起别名)
(从多表中查询出所有姓smith的雇员的名字,所在部门以及部门所在的城市)
select efirst_name,elast_name,ddepartment_name,lcity from employees e,departments d,locations l where edepartment_id = ddepartment_id and dlocation_id = llocation_id and elast_name = 'smith';
联合查询
等值连接
/将books表和表bookstype中的信息联合查询,条件是联系键相等/
select from books,bookstype where bookstypetypeid = bookstypeid
内连接
/将books表和表bookstype中的信息联合查询,条件是联系键相等,和等值连接等价/
select from books inner join bookstype on bookstypeid = bookstypetypeid
左外连接
/将books表和表bookstype中的信息联合查询,包括在books表中没有和bookstype表关联的信息/
select from books left outer join bookstype on bookstypetypeid = bookstypeid
右外连接
/将bookstype表和books表中的信息联合查询,包括在bookstype表中没有和books表关联的信息/
select from books right outer join bookstype on bookstypetypeid = bookstypeid
全连接
/将bookstype表和books表中的信息联合查询,包括在books表中没有和bookstype表关联的信息以及在bookstype表中没有和books表关联的信息/
select from books full outer join bookstype on bookstypetypeid = bookstypeid
联合查询
多表查询应该注意的几点:
多表查询和单表查询的不同在于多表查询在查询某个字段的时候应该带上表名
格式是:表名字段名,表名字段名
select bbsid,bbsname,bbsdep,bbsrid,bbsrname
from bbs,bbsr
where bbsid=bbsrid;
一般的在多表查询中的表名取的麻烦用别名来代替
如下:
select bid,bname,bdep,cid,cname
from bbs as b ,bbsr as c // from bbs b,bbsr c注意取别名也可以用空格或则用as
where bid=cid;
分组查询
在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息SQLServer 按照group by 子句中指定的表达式的值分组查询结果。
-------------------------------------------------------------------------------------
分组查询一般是用来进行统计需求的,要进行分组查询必须使用group by子句或having子句,在分组统计时要用到SQL的多行存储函数。在where条件中不能使用多行存储函数
查询语句的select 和group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。
在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数
------------------------------------------------------------------------------------
部门表department:
department_id department_name
10 开发部
20 测试部
30 用服部
40 财务部
50 培训部
雇员表employees:(department_id为外键)
id employees_name department_id
1 cheng 10
2 zhou 50
3 liguo 10
4 wang 20
5 feng 30
6 ling 30
7 wu 20
8 tang 20
9 yang 40
10 tan 50
------------------------------------------------------------------------------------
按部门编号统计出表employees中的每个部门的人数(group by分组查询)
select department_id, count() from employees
group by department_id;
显示出部门人数少于5人的部门编号以及人数( 按照department_id来分组,having count()<5做为限制条件 )
select department_id 部门号, count() 部门人数 from employees
group by department_id
having count()<5;
--------------------------------------
(注意:having必须在group by子句的后面)
--------------------------------------
图:
部门号 部门人数
------------------------------
10 2
20 3
30 2
40 1
50 2
-------------------------------------------------------------------------------------
where子句和having子句可以同时使用,where子句是对要分组的行进行过滤,即选择要分组的行;
而having子句是对分组后的数据进行过滤。此时where子句必须在group byhaving子句之前
-------------------------------------------------------------------------------------
显示出所有工资大于5000,且部门人数大于5个的部门号,部门最低工资和部门人数
select department_id 部门号(记住department_id 和部门号之间要空格), min(salary) 最低工资,count() 部门人数 from employees
where salary >5000
group by department_id
having count()>5;
图:
--------------------------------------
部门号 最低工资 部门人数
80 6100 34
100 6800 6
group by 按照哪个字段来排序查询,一般的group by和having一起使用,注意在查询中只能查询与group by和having有关的字段。
--------------------------------------
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。
查询每个部门的每种职位的雇员数(待测试)
select deptno,job,count() from emp group by deptno,job;
数据排序
order by子句中可以用asc(升序)和desc(降序)来完成相应的排序,默认时是按找asc(升序)。
---------------------------------------------------------------------------------
显示出所有工资大于5000,且部门人数大于5个的部门号,部门最低工资和部门人数,并要求按照部门人数降序排序
select department_id 部门号(记住department_id 和部门号之间要空格), min(salary) 最低工资,count() 部门人数 from employees
where salary >5000
group by department_id
having count()>5
order by count()desc
-------------------------------------------------------------------
(注意:当对分组查询后的结果进行排序时,order by 必须在group by之后)
-------------------------------------------------------------------
图:
--------------------------------------
部门号 最低工资 部门人数
80 6100 34
100 6800 30
90 6500 28
70 6300 25
子查询
-----------------------------------------------------------------------------------------------------
子查询是一个在select查询中含有其他的select语句,子查询通常用在where子句中,即将一个查询结果做为查询的条件
-----------------------------------------------------------------------------------------------------
统计表employees中所有工资小于平均工资的人数
select count()工资 from employees
where salary <
(select avg(salary) from employees)
图:
----------------
工资
56
49
36
Select MIN(Salary),Manager_id
from Employee
group by Manager_id
having MIN(Salary) >
(Select MIN(Salary)
From Employee
where Manager_id=004);
注意在多表查询中返回的值应该是一个唯一确定的值,而不应该是多中值。
select Employee_id,Last_name,Salary,Manager_id
from Employee
WHERE Salary>
(select Salary
from Employee
where Manager_id=003)
and
Last_name= (select Last_name
from Employee
where Last_name like 'mary');
注意在any,or,all的区别:
Select Salary,Manager_id,Last_name,Employee_id
from Employee
where Salary < any
(Select Salary
From Employee
where Manager_id=005);
Select Salary
From Employee
where Manager_id=005;返回的是2000,2500
就是在工资中小于20002500其中一个就可以了,而ALL则必须是小于2000和2500其中任何一个
。而or则是和and用在一起的
集合运算
---------------------------------------------------------------------------------
集合运算是将2个或多个子查询结果进行(并union),交(intersect)和减(minus)
---------------------------------------------------------------------------------
(并union):
select employee_id,empname from emp1
union
select employee_id,name from emp2
图:
-----------------
employee_id empname
100 king1
1000 king2
1000 king3
10000 king4
100000 king5
1000000 king6
注:使用union,重复行只包括一个,当使用union all时将包括重复行
交(intersect):2个或多个子查询的公共行
select employee_id,empname from emp1
intersect
select employee_id,name from emp2
减(minus):从第一个查询结果中去掉出现在第二个查询结果中的行:
select employee_id,empname from emp1
minus
select employee_id,name from emp2
视图,存储过程和触发器
创建视图:(查询数据,用于系统统计报表)
create view dept_sum_vu
(name,minsal,maxsal,avgsal)
as select ddepartment_name,min(esalary),max(esalary),avg(esalary)
from employees e,departments d
where edepartment_id = ddepartment_id
group by ddepartment_name;
存贮过程,触发器和删除外键
1)存贮过程:
存贮过程的路径:打开Stored Procedures中new一个新的Stored Procedures,中间填写代码,代码如下:
CREATE PROCEDURE sabbsTest AS
select Bbsid ,content , area_id , name FROM BBs a JOIN bbs_area b
on aarea_id = bid
CREATE PROCEDURE bbsTest AS
select Bbsid ,content , area_id , name FROM BBs a JOIN bbs_area b
on aarea_id = bid
2)触发器
打开用户表项,点设计表,选中其中一个字段,右键task点manager triggers,在d出的表单中写代码:
CREATE TRIGGER [tD_bbs_area] ON [dbo][bbs_area]
FOR DELETE
AS
BEGIN
DELETE rebbs
FROM bbs, deleted
WHERE rebbsbbs_id = bbsbbsid
AND bbsarea_id = deletedid
DELETE bbs
FROM deleted
WHERE bbsarea_id = deletedid
END
3)删除外键
打开用户表项,点设计表,选中其中一个字段,右键relationships,在d出的主键和外键中选择就可以了
删除外键,需要先删除主键表里面的有关外键的字段,再来删除外键的有关字段
举个简单的例子吧,从结果来理解比较具体些。
a表
name sex
张三 男
李四 女
b表
name age
李四 30
王五 23
1\全外连接
select aname,asex,bname,bage
from a full outer join b on aname=bname
结果如下,
name sex name age
张三 男 NULL NULL
李四 女 李四 30
NULL NULL 王五 23
关联字段name,左表有而右表没有的,如张三,bname,bage都为NULL,加上左右两边都有的就是左连接的结果;而右表有而左表表没有的,如王五,aname,asex都为NULL,加上左右两边都有的就是右连接的结果;左右两边都有的如,李四,这就是内连接。相见如下
2\左
select aname,asex,bname,bage
from a left outer join b on aname=bname
结果如下
name sex name age
张三 男 NULL NULL
李四 女 李四 30
2\右
select aname,asex,bname,bage
from a right outer join b on aname=bname
结果如下
name sex name age
李四 女 李四 30
NULL NULL 王五 23
3\内联
select aname,asex,bname,bage
from a inner join b on aname=bname
结果如下
name sex name age
李四 女 李四 30
4\交叉
select aname,asex,bname,bage
from a cross join b on aname=bname
结果如下
name sex name age
张三 男 李四 30
李四 女 王五 23
张三 男 王五 23
李四 女 李四 30 望采纳
INNER JOIN 产生的结果是AB的交集
SELECT FROM TableA INNER JOIN TableB ON TableAname = TableBname
2LEFT [OUTER] JOIN 产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
SELECT FROM TableA LEFT OUTER JOIN TableB ON TableAname = TableBname
3RIGHT [OUTER] JOIN 产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。
SELECT FROM TableA RIGHT OUTER JOIN TableB ON TableAname = TableBname
图标如left join类似。
4FULL [OUTER] JOIN 产生A和B的并集。对于没有匹配的记录,则会以null做为值。
SELECT FROM TableA FULL OUTER JOIN TableB ON TableAname = TableBname
你可以通过is NULL将没有匹配的值找出来:
SELECT FROM TableA FULL OUTER JOIN TableB ON TableAname = TableBname
WHERE TableAid IS null OR TableBid IS null
5 CROSS JOIN 把表A和表B的数据进行一个NM的组合,即笛卡尔积。如本例会产生44=16条记录,在开发过程中我们肯定是要过滤数据,所以这种很少用。
SELECT FROM TableA CROSS JOIN TableB
相信大家对inner join、outer join和cross join的区别一目了然了。
SQL查询语句精华大全 一、 简单查询
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的
表或视图、以及搜索条件等。
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
SELECT nickname,email
FROM testtable
WHERE name='张三'(一) 选择列表
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变
量和全局变量)等构成。1、选择所有列
例如,下面语句显示testtable表中所有列的数据:
SELECT
FROM testtable2、选择部分列并指定它们的显示次序
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
例如:
SELECT nickname,email
FROM testtable3、更改列标题
在选择列表中,可重新指定列标题。定义格式为:
列标题=列名
列名 列标题
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列
标题:
SELECT 昵称=nickname,电子邮件=email
FROM testtable4、删除重复行
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。5、限制返回的行数
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是
表示一百分数,指定返回的行数等于总行数的百分之几。
例如:
SELECT TOP 2
FROM testtable
SELECT TOP 20 PERCENT
FROM testtable(二) FROM子句
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,
它们之间用逗号分隔。
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应
使用下面语句格式加以限定:
SELECT username,citytablecityid
FROM usertable,citytable
WHERE usertablecityid=citytablecityid
在FROM子句中可用以下两种格式为表或视图指定别名:
表名 as 别名
表名 别名
例如上面语句可用表的别名格式表示为:
SELECT username,bcityid
FROM usertable a,citytable b
WHERE acityid=bcityid
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。
例如:
SELECT aau_fname+aau_lname
FROM authors a,titleauthor ta
(SELECT title_id,title
FROM titles
WHERE ytd_sales>10000
) AS t
WHERE aau_id=taau_id
AND tatitle_id=ttitle_id
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。(三) 使用WHERE子句设置查询条件
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:
SELECT
FROM usertable
WHERE age>20
WHERE子句可包括各种条件运算符:
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
范围运算符(表达式值是否在指定的范围):BETWEEN…AND…
NOT BETWEEN…AND…
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)
NOT IN (项1,项2……)
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
2、列表运算符例:country IN ('Germany','China')
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、
varchar、text、ntext、datetime和smalldatetime等类型查询。
可使用以下通配字符:
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
例如:
限制以Publishing结尾,使用LIKE '%Publishing'
限制以A开头:LIKE '[A]%'
限制以A开头外:LIKE '[^A]%'
4、空值判断符例WHERE age IS NULL
5、逻辑运算符:优先级为NOT、AND、OR
(四)查询结果排序
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:
ORDER BY {column_name [ASC|DESC]} [,…n]
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排
序。
例如:
SELECT
FROM usertable
ORDER BY age desc,userid ASC
另外,可以根据表达式进行排序。二、 联合查询
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联
合查询。UNION的语法格式为:
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]
其中selectstatement为待联合的SELECT查询语句。
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一
行。
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类
型,系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:
查询1 UNION (查询2 UNION 查询3)三、连接查询
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型
数据库管理系统的一个标志。
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在
一个表中。当检索数据时,通过连接 *** 作查询出存放在多个表中的不同实体的信息。连接 *** 作给用户带
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行
查询。
连接可以在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(三)交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等
于68=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY typeSQL核心语句(非常实用的几个技巧)插入数据向表中添加一个新记录,你要使用SQL INSERT 语句。这里有一个如何使用这种语句的例子:INSERT mytable (mycolumn) VALUES (‘some data’)这个语句把字符串’some data’插入表mytable的mycolumn字段中。将要被插入数据的字段的名字在第一个括号中指定,实际的数据在第二个括号中给出。INSERT 语句的完整句法如下:INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |</p><p>Values_list | select_statement}如果一个表有多个字段,通过把字段名和字段值用逗号隔开,你可以向所有的字段中插入数据。假设表mytable有三个字段first_column,second_column,和third_column。下面的INSERT语句添加了一条三个字段都有值的完整记录:INSERT mytable (first_column,second_column,third_column)VALUES (‘some data’,’some more data’,’yet more data’)注意你可以使用INSERT语句向文本型字段中插入数据。但是,如果你需要输入很长的字符串,你应该使用WRITETEXT语句。这部分内容对本书来说太高级了,因此不加讨论。要了解更多的信息,请参考Microsoft SQL Sever 的文档。如果你在INSERT 语句中只指定两个字段和数据会怎么样呢?换句话说,你向一个表中插入一条新记录,但有一个字段没有提供数据。在这种情况下,有下面的四种可能:如果该字段有一个缺省值,该值会被使用。例如,假设你插入新记录时没有给字段third_column提供数据,而这个字段有一个缺省值’some value’。在这种情况下,当新记录建立时会插入值’some value’。如果该字段可以接受空值,而且没有缺省值,则会被插入空值。如果该字段不能接受空值,而且没有缺省值,就会出现错误。你会收到错误信息:The column in table mytable may not be null最后,如果该字段是一个标识字段,那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记录时,只要忽略该字段,标识字段会给自己赋一个新值。注意向一个有标识字段的表中插入新记录后,你可以用SQL变量@@identity来访问新记录的标识字段的值。考虑如下的SQL语句:INSERT mytable (first_column) VALUES(‘some value’)INSERT anothertable(another_first,another_second)VALUES(@@identity,’some value’)如果表mytable有一个标识字段,该字段的值会被插入表anothertable的another_first字段。这是因为变量@@identity总是保存最后一次插入标识字段的值。字段another_first应该与字段first_column有相同的数据类型。但是,字段another_first不能是应该标识字段。Another_first字段用来保存字段first_column的值。删除记录要从表中删除一个或多个记录,需要使用SQL DELETE语句。你可以给DELETE 语句提供WHERE 子句。WHERE子句用来选择要删除的记录。例如,下面的这个DELETE语句只删除字段first_column的值等于’Delete Me’的记录:DELETE mytable WHERE first_column=’Deltet Me’DELETE 语句的完整句法如下:DELETE [FROM] {table_name|view_name} [WHERE clause]在SQL SELECT 语句中可以使用的任何条件都可以在DELECT 语句的WHERE子句中使用。例如,下面的这个DELETE语句只删除那些first_column字段的值为’goodbye’或second_column字段的值为’so long’的记录:DELETE mytable WHERE first_column=’goodby’ OR second_column=’so long’如果你不给DELETE 语句提供WHERE 子句,表中的所有记录都将被删除。你不应该有这种想法。如果你想删除应该表中的所有记录,应使用第十章所讲的TRUNCATE TABLE语句。注意为什么要用TRUNCATE TABLE 语句代替DELETE语句?当你使用TRUNCATE TABLE语句时,记录的删除是不作记录的。也就是说,这意味着TRUNCATE TABLE 要比DELETE快得多。更新记录要修改表中已经存在的一条或多条记录,应使用SQL UPDATE语句。同DELETE语句一样,UPDATE语句可以使用WHERE子句来选择更新特定的记录。请看这个例子:UPDATE mytable SET first_column=’Updated!’ WHERE second_column=’Update Me!’这个UPDATE 语句更新所有second_column字段的值为’Update Me!’的记录。对所有被选中的记录,字段first_column的值被置为’Updated!’。下面是UPDATE语句的完整句法:UPDATE {table_name|view_name} SET [{table_name|view_name}]{column_list|variable_list|variable_and_column_list}[,{column_list2|variable_list2|variable_and_column_list2}…[,{column_listN|variable_listN|variable_and_column_listN}]][WHERE clause]注意你可以对文本型字段使用UPDATE语句。但是,如果你需要更新很长的字符串,应使用UPDATETEXT语句。这部分内容对本书来说太高级了,因此不加讨论。要了解更多的信息,请参考Microsoft SQL Sever 的文档。如果你不提供WHERE子句,表中的所有记录都将被更新。有时这是有用的。例如,如果你想把表titles中的所有书的价格加倍,你可以使用如下的UPDATE 语句:你也可以同时更新多个字段。例如,下面的UPDATE语句同时更新first_column,second_column,和third_column这三个字段:UPDATE mytable SET first_column=’Updated!’Second_column=’Updated!’Third_column=’Updated!’WHERE first_column=’Update Me1’技巧SQL忽略语句中多余的空格。你可以把SQL语句写成任何你最容易读的格式。用SELECT 创建记录和表你也许已经注意到,INSERT 语句与DELETE语句和UPDATE语句有一点不同,它一次只 *** 作一个记录。然而,有一个方法可以使INSERT 语句一次添加多个记录。要作到这一点,你需要把INSERT 语句与SELECT 语句结合起来,象这样:INSERT mytable (first_column,second_column)SELECT another_first,another_secondFROM anothertableWHERE another_first=’Copy Me!’这个语句从anothertable拷贝记录到mytable只有表anothertable中字段another_first的值为’Copy Me!’的记录才被拷贝。当为一个表中的记录建立备份时,这种形式的INSERT 语句是非常有用的。在删除一个表中的记录之前,你可以先用这种方法把它们拷贝到另一个表中。如果你需要拷贝整个表,你可以使用SELECT INTO 语句。例如,下面的语句创建了一个名为newtable的新表,该表包含表mytable的所有数据:SELECT INTO newtable FROM mytable你也可以指定只有特定的字段被用来创建这个新表。要做到这一点,只需在字段列表中指定你想要拷贝的字段。另外,你可以使用WHERE 子句来限制拷贝到新表中的记录。下面的例子只拷贝字段second_columnd的值等于’Copy Me!’的记录的first_column字段。SELECT first_column INTO newtableFROM mytableWHERE second_column=’Copy Me!’使用SQL修改已经建立的表是很困难的。例如,如果你向一个表中添加了一个字段,没有容易的办法来去除它。另外,如果你不小心把一个字段的数据类型给错了,你将没有办法改变它。但是,使用本节中讲述的SQL语句,你可以绕过这两个问题。例如,假设你想从一个表中删除一个字段。使用SELECT INTO 语句,你可以创建该表的一个拷贝,但不包含要删除的字段。这使你既删除了该字段,又保留了不想删除的数据。如果你想改变一个字段的数据类型,你可以创建一个包含正确数据类型字段的新表。创建好该表后,你就可以结合使用UPDATE语句和SELECT 语句,把原来表中的所有数据拷贝到新表中。通过这种方法,你既可以修改表的结构,又能保存原有的数据。
--不懂再问 随时都在
select acno,bcname,count(acno) tcount
from teacher a join college b on acno=bcno
group by acno,bcname
SQL查询语句使用详解
好东东不敢独享,贴出来大家看看,对编写数据库程序有所帮助
一、简单查询
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的
表或视图、以及搜索条件等。
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
SELECT nickname,email
FROM testtable
WHERE name='张三'
(一)选择列表
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变
量和全局变量)等构成。
1、选择所有列
例如,下面语句显示testtable表中所有列的数据:
SELECT
FROM testtable
2、选择部分列并指定它们的显示次序
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
例如:
SELECT nickname,email
FROM testtable
3、更改列标题
在选择列表中,可重新指定列标题。定义格式为:
列标题=列名
列名 列标题
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列
标题:
SELECT 昵称=nickname,电子邮件=email
FROM testtable
4、删除重复行
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认
为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。
5、限制返回的行数
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是
表示一百分数,指定返回的行数等于总行数的百分之几。
例如:
SELECT TOP 2
FROM testtable
SELECT TOP 20 PERCENT
FROM testtable
(二)FROM子句
FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,
它们之间用逗号分隔。
在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列
所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应
使用下面语句格式加以限定:
SELECT username,citytablecityid
FROM usertable,citytable
WHERE usertablecityid=citytablecityid
在FROM子句中可用以下两种格式为表或视图指定别名:
表名 as 别名
表名 别名
例如上面语句可用表的别名格式表示为:
SELECT username,bcityid
FROM usertable a,citytable b
WHERE acityid=bcityid
SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。
例如:
SELECT aau_fname+aau_lname
FROM authors a,titleauthor ta
(SELECT title_id,title
FROM titles
WHERE ytd_sales>10000
) AS t
WHERE aau_id=taau_id
AND tatitle_id=ttitle_id
此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。
(三)使用WHERE子句设置查询条件
WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:
SELECT
FROM usertable
WHERE age>20
WHERE子句可包括各种条件运算符:
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
范围运算符(表达式值是否在指定的范围):BETWEEN…AND…
NOT BETWEEN…AND…
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)
NOT IN (项1,项2……)
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR
1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
2、列表运算符例:country IN ('Germany','China')
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、
varchar、text、ntext、datetime和smalldatetime等类型查询。
可使用以下通配字符:
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
例如:
限制以Publishing结尾,使用LIKE '%Publishing'
限制以A开头:LIKE '[A]%'
限制以A开头外:LIKE '[^A]%'
4、空值判断符例WHERE age IS NULL
5、逻辑运算符:优先级为NOT、AND、OR
(四)查询结果排序
使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:
ORDER BY {column_name [ASC|DESC]} [,…n]
其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排
序。
例如:
SELECT
FROM usertable
ORDER BY age desc,userid ASC
另外,可以根据表达式进行排序。
二、联合查询
UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联
合查询。UNION的语法格式为:
select_statement
UNION [ALL] selectstatement
[UNION [ALL] selectstatement][…n]
其中selectstatement为待联合的SELECT查询语句。
ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一
行。
联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语
句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。
在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选
择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类
型,系统将低精度的数据类型转换为高精度的数据类型。
在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:
查询1 UNION (查询2 UNION 查询3)
三、连接查询
通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型
数据库管理系统的一个标志。
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在
一个表中。当检索数据时,通过连接作查询出存放在多个表中的不同实体的信息。连接作给用户带
来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行
查询。
连接可以在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
(三)交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等
于68=48行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
'-----------------------------------------------------------------------
时间有限,平时在工作中还有很多的查询技巧有时间我再搜集贴出来
上一篇:小弟总结的几个日期时间函数
下一篇:运行时实现组件移动,改变大小
等值连接
select from 作者,借书表 where 作者编号=借书表编号 and 借书表借阅次数>50
内连接
select from 作者 join 借书表 on 作者编号=借书表编号 where 借阅次数>50
内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连 接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连 接)中的所有数据行。
以上就是关于SQL语言的用法全部的内容,包括:SQL语言的用法、数据库里左连接右连接和全连接的区别、SQL查询语句等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)