赞
踩
一、SELECT语句
使用SELECT语句可以从表中检索一个或者多个数据列。
关键字(keyword)作为SQL组成部分的保留字。关键字不能用作表或者列的名字。
1、检索单个列
输入:SELECT prod_name
FORM Products;
分析:上述语句利用select语句从Products表中检索一个名为prod_name的列。所需的列名在select关键字之后给出,from关键字指出从其中检索数据的表名。
SQL语句中大小写:注意在SQL语句中不区分大小写,因此都可以识别,但是为了方便调试和阅读,可以将SQL关键字写成大写,所有表和列可以使用小写。
2、检索多个列
要想从一个表中检索多个列,使用相同的SELECT语句。唯一的不同是必须在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。
注意:在选择多个列时候,一定要在列名之间加上逗号,但是最后一个列名后不加。加了之后将出现错误。
输入:SELECT prod_id, prod_name, prod_price
FROM Products;
分析:在这句当中,指定了3个列名,列名之间用逗号分隔。
3、检索所有列
除了指定所需的列外,SELECT语句还可以检索所有的列而不必逐个列出它们。这可以通过在实际列名的位置使用(*)通配符来达到。
输入:SELECT *
FROM Products;
分析:如果给定一个通配符(*),则返回表中所有列。
二、排序检索数据
1、一般的SELECT语句查询出来的行是没有排序的,所以根据需要,可以使用ORDER BY子句对查询的数据进行排序。
输入:SELECT prod_name
FROM Products
ORDER BY prod_name;
分析:这条语句除了指示DBMS软件对prod_name列以字母顺序排序数据的ORDER BY子句外,前面语句相同,后面子句取一个或者多个列的名字,据此对输出进行排序。
2、按多个列排序
经常需要按不止一个列进行数据的排序。例如,如果要显示雇员清单,可能希望按姓和名排序(首先按姓排序,然后在每个姓中再按名排序)。如果多个雇员具有相同的姓,这样做很有用。
为了按照多个列排序,简单指定列名,列名之间用逗号隔开即可(就像选择多个列那样)
输入:SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY prod_price,prod_name;
分析:首先是按照价格排序,然后是按照名称排序,如果在价格完全相同时,才会按照名称排序,要是列中所有的价格都是唯一的,哪儿不会按照名称再排序。
3、按列位置排序
除了能用列名指出排序顺序外,ORDER BY还支持按相对列位置进行排序。理解这个内容的最好办法是看下例子:
输入:SELECT prod_id,prod_price,prod_name
FROM Products
ORDER BY 2,3;
正如所见,这里的输出与上面的查询相同。不同之处在于ORDER BY子句。SELECT清单中指定的是选择列的相对位置而不是列名。ORDER BY 2表示按照SELECT清单中第二个列,prod_name列进行排序。ORDER BY 2,3表示先按prod_price,再按prod_name进行排序。
此项技术的主要好处在于不用重复输入列名。但它也有缺点。首先,不明确给出列名增加了错用列名排序的可能性。其次,在对SELECT清单进行更改时容易错误地对数据进行排序(忘记对ORDER BY子句做出相应的改动)。最后,如果进行排序的列不在SELECT清单中,显然不能使用这项技术。
4、指定排序方向
数据排序不限于升序排序(从A-Z)。这只是默认的排序顺序,还可以使用ORDER BY子句降序(从Z-A)顺序排序。为了进行降序排序,必须指定DESC关键字。
下面的例子按价格以降序排序产品(最贵的排在最前面)
输入:SELECT prod_id,prod_price,prod_name
FROM Produces
ORDER BY prod_price DESC;
要是打算用多个列排序怎么办?例子如下,只需在后面添加逗号列即可
输入:SELECT prod_id,prod_price,prod_name
FROM Produces
ORDER BY prod_price DESC,prod_name;
DESC关键字只应用到直接位于其前面的列名。在上例中,只对prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)任然按标准的升序排列。
在多个列上降序排序:如果想要在多个列上进行降序排序,必须对每个列指定DESC关键字。
三、过滤数据
1、使用WHERE子句
数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只要会根据特定操作或报告的需要提取表数据的子集。只检索所需要的数据需要指定搜索条件,搜索条件也称为过滤条件。
在SELECT语句中,数据根据WHERE子句中指定的搜索 条件进行筛选。WHERE子句在表名(FROM子句)之后给出,例如:
输入:SELECT prod_name,prod_price
FROM Products
WHERE prod_price=3.55;
分析:语句从products表中检索两个列,但不返回所有行,只返回prod_price=3.55的行。
注意:要是同时使用ORDER BY和WHERE子句时候,应该让ORDER BY位于WHERE之后,否则将会产生错误。
2、WHERE子句操作符
我们在关于相等的测试时看到了第一个WHERE子句,它确定一个列是否包含特定的值。
检查单个值
我们已经看了测试相等的例子,现在来看看
几个使用其他操作符的例子。
输入:SELECT prod_name,prod_price
FROM Products
WHERE prod_price<10;
分析:列出价格小于10美元的所有产品。
输入:SELECT prod_name,prod_price
FROM Products
WHERE prod_price<=10;
分析:列出价格小于等于10美元的所有产品。
不匹配检查
输入:SELECT prod_id,prod_name
FROM Products
WHERE prod_id<>'DLL01';
分析:列出产品id不是DLL01的所有产品。
注意:引号的使用,单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号,用来与数值列进行比较的值不用引号。
输入:SELECT prod_id,prod_name
FROM Products
WHERE prod_id!='DLL01';
!=和<>通常可以互换使用。但是并非所有的DBMS都支持这两种不等于操作符。所以还得参阅相应的DBMS文档。
范围值检查
为了检查某个范围的值,可使用BETWEEN操作符。其语法与其他WHERE子句的操作符稍有不同,因为它需要两个值,即范围的开始值和结束值。
输入:SELECT prod_name,prod_price
FROM Products
WHERE prod_price BETWEEN 5 AND 10;
分析:两个值用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始和结束值。
空值检查
在创建表时,表设计人员可以指定其中的列是否可以不包含值。在一个列不包含值时,称其为包含空值NULL。
NULL 无值(no value),它与字段包含0,空字符串或仅仅包含空格不同。
SELECT语句有一个特殊的WHERE子句,可以用来检查具有NULL值的列。就是IS NULL子句。
输入:SELECT prod_name
FROM Products
WHERE prod_price IS NULL;
这条语句返回没有价格(空prod_price字段,不是价格为0)的所有产品。
四、高级数据过滤
高级数据过滤主要体现在用组合WHERE子句建立功能更强的高级搜索条件。使用NOT和IN操作符。
1、组合WHERE子句
在之前使用的WHERE子句大多使用的都是单一的条件。为了进行更强的过滤控制,SQL允许给出多个WHERE子句。这些子句可以用两种方式使用,即:以AND子句的方式或者OR子句的方式使用。
操作符(operator)用来联结或改变WHERE子句中的子句的关键字。也称为逻辑操作符(logical operator)。
2、AND操作符
为了通过不知一个列进行过滤,可以使用AND操作符给WHERE子句附加条件。如:
输入:SELECT prod_id,prod_price,prod_name
FROM Products
WHERE vend_id='DLL01' AND prod_price<=4;
分析:此SQL语句检索由供应商DLL01制造并且价格小于等于4美元的所有产品的名称和价格。在SELECT语句中WHERE子句包含两个田间,要同时满足两个条件才可以被检索。
3、OR操作符
OR操作符与AND操作符不同,它指示数据库管理系统软件检索匹配任一条件的行。事实上,许多DBMS在OR WHERE子句的第一个条件满足的情况下,不再计算第二个条件。
输入:SELECT prod_name,prod_price
FROM Products
WHERE vend_id='DLL01'OR prod_price<=4;
分析:此操作语句只检索满足前一条件的DLL01的即可,要是检索出来就不再检索第二个条件。不用同时满足两个条件。
4、计算次序
WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤。
但是,组合AND和OR带来了一个有趣的问题。为了说明这个问题,举个例子:
输入:SELECT prod_name,prod_price
FROM Products
WHERE vend_id='DLL01'OR prod_price<=4
AND prod_id='DLL12';
分析:在这里的语句中,同时有三个条件被AND和OR连接,但是AND在计算次序中有限级更高,会先计算后两个AND的组合,也就是说计算顺序错误了。解决的办法就是使用圆括号明确的分组相应的操作符。
输入:SELECT prod_name,prod_price
FROM Products
WHERE (vend_id='DLL01'OR prod_price<=4)
AND prod_id='DLL12';
因为圆括号具有较AND和OR操作符更高的计算次序。圆括号能够有效地消除歧义。
5、IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值得逗号分隔的清单,全都在圆括号中。下面的例子说明了这个操作符:
输入:SELECT prod_name,prod_price
FROM Products
WHERE vend_id IN ('DLL01','BRS01')
ORDER BY prod_name;
分析:这句SELECT语句检索供应商DLL01和BRS01制造的所有产品。IN操作符后跟由逗号分隔的合法值清单,整个清单必须包括在圆括号中。
其优点为:
1\在使用长的合法选项清单时候,IN操作符的语法更清楚且更直观。
2\在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
3\IN操作符一般比OR操作符清单执行更快。
4\IN的最大优点是可以包含其他SELECT语句,能够更动态地建立WHERE子句。
6、NOT 操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。因为NOT从不自己使用(它总是与其它操作符一起使用),它的语法与其它 操作符有所不同。NOT可以用在要过滤的列前,而不仅是在其后。
NOT WHERE子句中用来否定后跟条件的关键字。
输入:SELECT prod_name
FROM Products
WHERE NOT vend_id='DLL01'
ORDER BY prod_name;
这里的NOT否定跟在它之后的条件,因此,DBMS不是匹配vend_id为DLL01,而是匹配非DLL01之外的其它所有东西。
同时也可以使用<>操作符来完成。
五、用通配符进行过滤
通配符(wildcard):用来匹配值的一部分的特殊字符。
搜索模式(search pattern):由字面值、通配符或者两者组合构成的搜索条件。
1、LIKE操作符
利用通配符可以创建比较特定数据的搜索模式。在这个例子中,如果要找出包含bean bag的所有产品,可以构造一个通配符搜索模式,找出产品名中任何位置出现bean bag的产品。
注意:通配符搜索只能用于文本字段(串),非文本数据类型字段不能使用通配符搜索。
2、百分号(%)通配符
最常使用的通配符是百分号(%),在搜索串中,%可以表示任何字符出现任意次数。例如:
输入:SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
分析:在执行这条句子时,将检索任意以FISH起头的词。%告诉DBMS接受fish之后的任意字符,不管它有多少字符。
3、下划线(_)通配符
另一个又用的通配符是下划线(_)。下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。
输入:SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE '_inch teddy bear';
与%能匹配0个字符不一样,_总是匹配一个字符,不能多也不能少。
4、方括号([])通配符
方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。
例如:
输入:SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE '[JM]%'
ORDER BY prod_id;
分析:此语句的WHERE子句中的模式为'[JM]%'。此搜索模式使用了两个不同的通配符。[JM]匹配任何以方括号中字母开头的联系人名,它只能匹配单个字符。因此,任何多于一个字符的名字都不匹配。[JM]之后的%通配符匹配第一个字符之后的任意数目的字符,返回所需的结果。
此通配符可以用前缀字符^(脱字号)来否定。例如,下面的查询匹配不以J或M开头的任意联系人
输入:SELECT prod_id,prod_name
FROM Products
WHERE prod_name LIKE '[^JM]%'
ORDER BY prod_id;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。