sql[MSSQL防范]
本文“sql[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
掌握SQL四条最基本的数据操作语句:Insert,Select,Update和Delete.-dqx7O
练掌握SQL是数据库用户的贵重财 富.在本文中,我们将指导你掌握四条最基本的数据操作语句—SQL的核心功效—来顺次介绍对比操作符、挑选断言以及三值逻辑.当你完成这些学习后,明显你已经开始算是精通SQL了.-dqx7O
在我们开始之前,先利用CREATE TABLE语句来成立一个表(如图1所示).DDL语句对数据库对象如表、列和视举行定义.它们并不对表中的行举行处理,这是因为DDL语句并不处理数据库中实际的数据.这些工作由另一类SQL语句—数据操作语言(DML)语句举行处理.-dqx7O
SQL中有四种基本的DML操作:INSERT,SELECT,UPDATE和DELETE.由于这是大大都SQL用户常常用到的,我们有必要在此对它们举行一一阐明.在图1中我们给出了一个名为EMPLOYEES的表.此中的每一行对应一个特定的雇员记录.请熟习这张表,我们在背面的例子中将要用到它.-dqx7O
衔接查询 -dqx7O
通过衔接运算符可以实现多个表查询.衔接是关系数据库模子的主要特点,也是它辨别于别的范例-dqx7O
数据库管理系统的一个标志.-dqx7O
在关系数据库管理系统中,表成立时各数据之间的关系没必要肯定,常把一个实体的全部信息存放在-dqx7O
一个表中.当检索数据时,通过衔接操作查询出存放在多个表中的差别实体的信息.衔接操作给用户带-dqx7O
来很大的机动性,他们可以在任什么时刻候增添新的数据范例.为差别实体成立新的表,此后通过衔接举行-dqx7O
查询.-dqx7O
衔接可以在SELECT 语句的FROM子句或WHERE子句中成立,似是而非在FROM子句中指出衔接时有助于-dqx7O
将衔接操作与WHERE子句中的搜索条件区脱离来.所以,在Transact-SQL中举荐利用这种办法.-dqx7O
SQL-92尺度所定义的FROM子句的衔接语法格局为:-dqx7O
FROM join_table join_type join_table-dqx7O
[ON (join_condition)]-dqx7O
此中join_table指出参与衔接操作的表名,衔接可以对同一个表操作,也可以对多表操作,对同一-dqx7O
个表操作的衔接又称做自衔接.-dqx7O
join_type 指出衔接范例,可分为三种:内衔接、外衔接和穿插衔接.内衔接(INNER JOIN)利用比-dqx7O
较运算符举行表间某(些)列数据的对比操作,并列出这些表中与衔接条件相匹配的数据行.按照所利用-dqx7O
的对比方法差别,内衔接又分为等值衔接、自然衔接和不等衔接三种.-dqx7O
外衔接分为左外衔接(LEFT OUTER JOIN或LEFT JOIN)、右外衔接(RIGHT OUTER JOIN或RIGHT JOIN)-dqx7O
和全外衔接(FULL OUTER JOIN或FULL JOIN)三种.与内衔接差别的是,外衔接不只列出与衔接条件相匹-dqx7O
配的行,而是列出左表(左外衔接时)、右表(右外衔接时)或两个表(全外衔接时)中全部符合搜索条件的-dqx7O
数据行.-dqx7O
穿插衔接(CROSS JOIN)没有WHERE 子句,它返回衔接表中全部数据行的笛卡尔积,后来果调集合的-dqx7O
数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数.-dqx7O
衔接操作中的ON (join_condition) 子句指出衔接条件,它由被衔接表中的列和对比运算符、逻辑-dqx7O
运算符等构成.-dqx7O
无论哪类衔接都不能对text、ntext和image数据范例摆列行直接衔接,但可以对这三种摆列行间接-dqx7O
衔接.比方:-dqx7O
SELECT p1.pub_id,p2.pub_id,p1.pr_info-dqx7O
FROM pub_info AS p1 INNER JOIN pub_info AS p2-dqx7O
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)-dqx7O
-dqx7O
(一)内衔接-dqx7O
内衔接查询操作列出与衔接条件匹配的数据行,它利用对比运算符对比被衔接列的列值.内衔接分-dqx7O
三种:-dqx7O
1、等值衔接:在衔接条件中利用等于号(=)运算符对比被衔接列的列值,其查询后果中列出被衔接-dqx7O
表中的全部列,包含此中的反复列.-dqx7O
2、不等衔接: 在衔接条件利用除等于运算符以外的别的对比运算符对比被衔接的列的列值.这些-dqx7O
运算符包含>、>=、<=、<、!>、!<和<>.-dqx7O
3、自然衔接:在衔接条件中利用等于(=)运算符对比被衔接列的列值,但它利用挑选列表指出查询-dqx7O
后果调集合所包含的列,并删除衔接表中的反复列.-dqx7O
例,下面利用等值衔接列出authors和Publishers表中位于同一城市的作者和出版社:-dqx7O
SELECT *-dqx7O
FROM authors AS a INNER JOIN publishers AS p-dqx7O
ON a.city=p.city-dqx7O
-dqx7O
又如利用自然衔接,在挑选列表中删除authors 和publishers 表中反复列(city和state):-dqx7O
SELECT a.*,p.pub_id,p.pub_name,p.country-dqx7O
FROM authors AS a INNER JOIN publishers AS p-dqx7O
ON a.city=p.city-dqx7O
-dqx7O
(二)外衔接-dqx7O
内衔接时,返回查询后果调集合的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和衔接条件-dqx7O
的行.而采取外衔接时,它返回到查询后果调集合的不但包含符合衔接条件的行,并且还包含左表(左外-dqx7O
衔接时)、右表(右外衔接时)或两个边接表(全外衔接)中的全部数据行.-dqx7O
以下面利用左外衔接将论坛内容和作者信息衔接起来:-dqx7O
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b-dqx7O
ON a.username=b.username-dqx7O
-dqx7O
下面利用全外衔接将city表中的全部作者以及user表中的全部作者,以及他们所在的城市:-dqx7O
SELECT a.*,b.*-dqx7O
FROM city as a FULL OUTER JOIN user as b-dqx7O
ON a.username=b.username-dqx7O
-dqx7O
(三)穿插衔接-dqx7O
穿插衔接不带WHERE 子句,它返回被衔接的两个表全部数据行的笛卡尔积,返回到后果调集合的数-dqx7O
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数.-dqx7O
例,titles表中有6类图书,而publishers表中有8家出版社,则下列穿插衔接检索到的记录数将等-dqx7O
于6*8=48行.-dqx7O
SELECT type,pub_name-dqx7O
FROM titles CROSS JOIN publishers-dqx7O
ORDER BY type-dqx7O
UNION运算符可以将两个或两个以上上SELECT语句的查询后果调集归并成一个后果调集显示,即履行联-dqx7O
合查询.UNION的语法格局为:-dqx7O
select_statement-dqx7O
UNION [ALL] selectstatement-dqx7O
[UNION [ALL] selectstatement][…n]-dqx7O
此中selectstatement为待结合的SELECT查询语句.-dqx7O
ALL选项表示将全部行归并到后果调集合.不指定该项时,被结合查询后果调集合的反复行将只保存一-dqx7O
行.-dqx7O
结合查询时,查询后果的列标题为第一个查询语句的列标题.因此,要定义列标题必须在第一个查询语-dqx7O
句中定义.要春结合查询后果排序时,也必须利用第一查询语句中的列名、列标题大概列序号.-dqx7O
在利用UNION 运算符时,应保证每个结合查询语句的挑选列表中有相同数目的表达式,并且每个查询选-dqx7O
择表达式应具有相同的数据范例,或是可以自动将它们转换为相同的数据范例.在自动转换时,关于数值类-dqx7O
型,系统将低精度的数据范例转换为高精度的数据范例.-dqx7O
在包含多个查询的UNION语句中,其履行次序是自左至右,利用括号可以改变这一履行次序.比方:-dqx7O
查询1 UNION (查询2 UNION 查询3)
-dqx7O
INSERT语句-dqx7O
用户可以用INSERT语句将一行记录插入到指定的一个表中.比方,要将雇员John Smith的记录插入到本例的表中,可以利用以下语句:-dqx7O
INSERT INTO EMPLOYEES VALUES-dqx7O
('Smith','John','1980-06-10',-dqx7O
'Los Angles',16,45000);-dqx7O
通过这样的INSERT语句,系统将试着将这些值填入到呼应的列中.这些列按照我们成立表时定义的次序布列.在本例中,第一个值"Smith"将填到第一个列LAST_NAME中;第二个值"John"将填到第二列FIRST_NAME中……以此类推.-dqx7O
我们说过系统会"试着"将值填入,除了履行法则之外它还要举行范例查抄.假如范例不符(如将一个字符串填入到范例为数字的列中),系统将回绝这一次操作并返回一个错误信息.-dqx7O
假如SQL回绝了你所填入的一列值,语句中其他各列的值也不会填入.这是因为SQL供应对事件的支持.一次事件将数据库从一种一致性转移到另一种一致性.假如事件的某一部份失利,则整个事件城市失利,系统将会被恢复(或称之为回退)到此事件之前的状况.-dqx7O
回到本来的INSERT的例子,请注意全部的整形十进制数都不需求用单引号惹起来,而字符串和日期范例的值都要用单引号来辨别.为了增添可读性而在数字间插入逗号将会惹起错误.记着,在SQL中逗号是元素的脱离符.-dqx7O
一样要注意输入文字值时要利用单引号.双引号用来封装限界标识符.-dqx7O
关于日期范例,我们必须利用SQL尺度日期格局(yyyy-mm-dd),但是在系统中可以举行定义,以承受其他的格局.当然,2000年临近,请你最好还是利用四位来表示年份.-dqx7O
既然你已经理解了INSERT语句是怎样工作的了,让我们转到EMPLOYEES表中的其他部份:-dqx7O
INSERT INTO EMPLOYEES VALUES-dqx7O
('Bunyan','Paul','1970-07-04',-dqx7O
'Boston',12,70000);-dqx7O
INSERT INTO EMPLOYEES VALUES-dqx7O
('John','Adams','1992-01-21',-dqx7O
'Boston',20,100000);-dqx7O
INSERT INTO EMPLOYEES VALUES-dqx7O
('Smith','Pocahontas','1976-04-06',-dqx7O
'Los Angles',12,100000);-dqx7O
INSERT INTO EMPLOYEES VALUES-dqx7O
('Smith','Bessie','1940-05-02',-dqx7O
'Boston',5,200000);-dqx7O
INSERT INTO EMPLOYEES VALUES-dqx7O
('Jones','Davy','1970-10-10',-dqx7O
'Boston',8,45000);-dqx7O
INSERT INTO EMPLOYEES VALUES-dqx7O
('Jones','Indiana','1992-02-01',-dqx7O
'Chicago',NULL,NULL);-dqx7O
在最后一项中,我们不知道Jones先生的工薪级别和年薪,所以我们输入NULL(不要引号).NULL是SQL中的一种特别情形,我们今后将举行具体的谈论.目前我们只需认为NULL表示一种未知的值.-dqx7O
有时,像我们方才所谈论的情形,我们大概但愿对某一些而不是全部的摆列行赋值.除了对要省略的列输入NULL外,还可以采取别的一种INSERT语句,以下:-dqx7O
INSERT INTO EMPLOYEES(-dqx7O
FIRST_NAME, LAST_NAME,-dqx7O
HIRE_DATE, BRANCH_office)-dqx7O
VALUE(-dqx7O
'Indiana','Jones',-dqx7O
'1992-02-01','Indianapolis');-dqx7O
这样,我们先在表名之后列出一系列列名.未列出的列中将自动填入缺省值,假如没有设置缺省值则填入NULL.请注意我们改变了列的次序,而值的次序要对应新的列的次序.假如该语句中省略了FIRST_NAME和LAST_NAME项(这两项规定不能为空),SQL操作将失利.-dqx7O
让我们来看一看上述INSERT语句的语法图:-dqx7O
INSERT INTO table-dqx7O
[(column { ,column})]-dqx7O
VALUES-dqx7O
(columnvalue [{,columnvalue}]);-dqx7O
和前一篇文章中一样,我们用方括号来表示可选项,大括号表示可以反复肆意次数的项(不能在实际的SQL语句中利用这些特别字符).VALUE子句和可选的列名列表中必须利用圆括号.-dqx7O
SELECT语句-dqx7O
SELECT语句可以从一个或多个表中选取特定的行和列.因为查询和检索数据是数据库管理中最重要的功效,所以SELECT语句在SQL中是工作量最大的部份.实际上,仅仅是拜候数据库来解析数据并生成报表的人可以对其他SQL语句一窍不通.-dqx7O
SELECT语句的后果普通是生成别的一个表.在履行历程中系统按照用户的尺度从数据库中选出匹配的行和列,并将后果放到暂时的表中.在直接SQL(direct SQL)中,它将后果显示在终端的显示屏上,大概将后果送到打印机或文件中.也可以结合其他SQL语句来将后果放到一个已出名称的表中.-dqx7O
SELECT语句功效强盛.固然表面上看来它只用来完本钱文第一部份中提到的关系代数运算"挑选"(或称"限制"),但实际上它也可以完成其他两种关系运算—"投影"和"衔接",SELECT语句还可以完成聚合计算并对数据举行排序.-dqx7O
SELECT语句最简单的语法以下:-dqx7O
SELECT columns FROM tables;-dqx7O
当我们以这种情势履行一条SELECT语句时,系统返回由所挑选的列以及用户挑选的表中全部指定的行构成的一个后果表.这就是实现关系投影运算的一个情势.-dqx7O
让我们看一下利用图1中EMPLOYEES表的一些例子(这个表是我们今后全部SELECT语句实例都要利用的.而我们在图2和图3中给出了查询的实际后果.我们将在其他的例子中利用这些后果).-dqx7O
假定你想查看雇员工作部门的列表.那下面就是你所需求编写的SQL查询:-dqx7O
SELECT BRANCH_OFFICE FROM EMPLOYEES;-dqx7O
以上SELECT语句的履行将产生如图2中表2所示的后果.-dqx7O
由于我们在SELECT语句中只指定了一个列,所以我们的后果表中也只有一个列.注意后果表中具有反复的行,这是因为有多个雇员在同一部门工作(记着SQL从所选的全部行中将值返回).要消除后果中的反复行,只要在SELECT语句中加上DISTINCT子句:-dqx7O
SELECT DISTINCT BRANCH_OFFICE-dqx7O
FROM EMPLOYEES;-dqx7O
这次查询的后果如表3所示.-dqx7O
目前已经消除了反复的行,但后果并非按照次序布列的.假如你但愿以字母表次序将后果列出又该怎么做呢?只要利用ORDER BY子句便可以按照升序或降序来布列后果:-dqx7O
SELECT DISTINCT BRANCH_OFFICE-dqx7O
FROM EMPLOYEES-dqx7O
ORDER BY BRANCH_OFFICE ASC;-dqx7O
这一查询的后果如表4所示.请注意在ORDER BY之后是若何安布列名BRANCH _OFFICE的,这就是我们想要对其举行排序的列.为什么即便是后果表中只有一个列时我们也必须指出列名呢?这是因为我们还可以按照表中其他摆列行排序,即便它们并不显示出来.列名BRANCH_ OFFICE之后的关键字ASC表示按照升序布列.假如你但愿以降序布列,那么可以用关键字DESC.-dqx7O
一样我们应当指出ORDER BY子句只将暂时表中的后果举行排序;并不影响本来的表.-dqx7O
假定我们但愿得到按部门排序并从工资最高的雇员到工资最低的雇员布列的列表.除了工资括号中的内容,我们还但愿看到按照聘用时间从近来聘用的雇员开始列出的列表.以下是你将要用到的语句:-dqx7O
SELECT BRANCH_OFFICE,FIRST_NAME,-dqx7O
LAST_NAME,SALARY,HIRE_DATE-dqx7O
FROM EMPLOYEES-dqx7O
ORDER BY SALARY DESC,-dqx7O
HIRE_DATE DESC;-dqx7O
这里我们举行了多列的挑选和排序.排序的优先级由语句中的列名次序所决意.SQL将先对列出的第一个摆列行排序.假如在第一个列中呈现了反复的行时,这些行将被按照第二摆列行排序,假如在第二列中又呈现了反复的行时,这些行又将被按照第三摆列行排序……如此类推.这次查询的后果如表5所示.-dqx7O
将一个很长的表中的全部列名写出来是一件相当麻烦的事,所以SQL答应在挑选表中全部的列时利用*号:-dqx7O
SELECT * FROM EMPLOYEES;-dqx7O
这次查询返回整个EMPLOYEES表,如表1所示.-dqx7O
下面我们对开始时给出的SELECT语句的语法举行一下更新(竖直线表示一个可选项,答应在此中挑选一项.):-dqx7O
SELECT [DISTINCT]-dqx7O
(column [{, columns}])| *-dqx7O
FROM table [ {, table}]-dqx7O
[ORDER BY column [ASC] | DESC-dqx7O
[ {, column [ASC] | DESC }]];-dqx7O
定义挑选尺度-dqx7O
在我们目前所介绍的SELECT语句中,我们对后果表中的列作出了挑选但返回的是表中全部的行.让我们看一下若何对SELECT语句举行限制使得它只返回但愿得到的行:-dqx7O
SELECT columns FROM tables [WHERE predicates];-dqx7O
WHERE子句对条件举行了设置,只有满意条件的行才被包含到后果表中.这些条件由断言(predicate)举行指定(断言指出了关于某件事情的一种大概的事实).假如该断言关于某个给定的行成立,该行将被包含到后果表中,不然该行被忽视.在SQL语句中止言普通通过对比来表示.比方,假定你需求查询全部姓为Jones的职员,则可以利用以下SELECT语句:-dqx7O
SELECT * FROM EMPLOYEES-dqx7O
WHERE LAST_NAME = 'Jones';-dqx7O
LAST_NAME = 'Jones'部份就是断言.在履行该语句时,SQL将每一行的LAST_NAME列与"Jones"举行对比.假如某一职员的姓为"Jones",即断言成立,该职员的信息将被包含到后果表中(见表6).-dqx7O
利用最多的六种对比-dqx7O
我们上例中的断言包含一种基于"等值"的对比(LAST_NAME = 'Jones'),但是SQL断言还可以包含其他几种范例的对比.此中最常用的为:-dqx7O
等于 =-dqx7O
不等于 <>-dqx7O
小于 <-dqx7O
大于 >-dqx7O
小于或等于 <=-dqx7O
大于或等于 >=-dqx7O
下面给出了不是基于等值对比的一个例子:-dqx7O
SELECT * FROM EMPLOYEES-dqx7O
WHERE SALARY > 50000;-dqx7O
这一查询将返回年薪高于$50,000.00的职员(拜见表7).-dqx7O
逻辑衔接符-dqx7O
有时我们需求定义一条不止一种断言的SELECT语句.举例来说,假如你仅仅想查看Davy Jones的信息的话,表6中的后果将是不精确的.为了进一步定义一个WHERE子句,用户可以利用逻辑衔接符AND,OR和NOT.为了只得到职员Davy Jones的记录,用户可以输入以下语句:-dqx7O
SELECT * FROM EMPLOYEES-dqx7O
WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';-dqx7O
在本例中,我们通过逻辑衔接符AND将两个断言衔接起来.只有两个断言都满意时整个表达式才会满意.假如用户需求定义一个SELECT语句来使得当此中任何一项成立就满意条件时,可以利用OR衔接符:-dqx7O
SELECT * FROM EMPLOYEES-dqx7O
WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';-dqx7O
有时定义一个断言的最好办法是通过相反的描写来阐明.假如你想要查看除了Boston办事处的职员以外的其他全部职员的信息时,你可以举行以下的查询:-dqx7O
SELECT * FROM EMPLOYEES-dqx7O
WHERE NOT(BRANCH_OFFICE = 'Boston');-dqx7O
关键字NOT背面随着用圆括号括起来的对比表达式.后来果是对后果取否定.假如某一职员所在部门的办事处在Boston,括号内的表达式返回true,但是NOT操作符将该值取反,所以该行将不被选中.-dqx7O
断言可以与其他的断言嵌套利用.为了保证它们以精确的次序举行求值,可以用括号将它们括起来:-dqx7O
SELECT * FROM EMPLOYEES-dqx7O
WHERE (LAST_NAME = 'Jones'-dqx7O
AND FIRST_NAME = 'Indiana')-dqx7O
OR (LAST_NAME = 'Smith'-dqx7O
AND FIRST_NAME = 'Bessie');-dqx7O
SQL相沿数学上尺度的表达式求值的约定—圆括号内的表达式将最早举行求值,其他表达式将从左到右举行求值.-dqx7O
-dqx7O
以上是“sql[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:利用HTTP拜候SQLServer
- ·下一篇文章:用中值排序基数法实现树状构造
- ·中查找“sql”更多相关内容
- ·中查找“sql”更多相关内容