|
楼主 |
发表于 2003-6-13 08:09:39
|
显示全部楼层
SQL循序渐进(11)------GROUP BY子句
GROUP BY子句
首先讲讲GROUP BY 子句语法:
SELECT column1, SUM(column2)
FROM "list-of-tables"
GROUP BY "column-list";
这个GROUP BY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。当然最好解释的方法是给出一个例子啦:
假设我们将从employee表中搜索工资最高的列,可以使用以下的SQL语句:
SELECT max(salary), dept
FROM employee
GROUP BY dept;
这条语句将在每一个单独的部门中选择工资最高的工资。结果他们的salary和dept将被返回。
SQL循序渐进(12)------HAVING子句
HAVING子句
下面先给出HAVING子句的语法:
SELECT column1, SUM(column2)
FROM "list-of-tables"
GROUP BY "column-list"
HAVING "condition";
这个HAVING子句允许你为每一个组指定条件,换句话说,可以根据你指定的条件来选择行。如果你想使用HAVING子句的话,它应该处再GROUP BY子句之后。
下面将以一个例子来解释HAVING子句。假设我们的employee表中包含雇员的name、departmen、salary和age。如果你想为每个部门中每个雇员选择平均工资的话,你可以使用下面的SQL语句:
SELECT dept, avg(salary)
FROM employee
GROUP BY dept;
当然,如果你还想只计算和显示salary大于20000的平均工资的话,你还可以加上HAVING子句:
SELECT dept, avg(salary)
FROM employee
GROUP BY dept
HAVING avg(salary) > 20000;
SQL循序渐进(13)------ORDER BY子句 [
ORDER BY子句
ORDER BY子句的语法为:
SELECT column1, SUM(column2)
FROM "list-of-tables"
ORDER BY "column-list" [ASC | DESC];
[ ] = optional
ORDER BY是一个可选的子句,它允许你根据指定要order by的列来以上升或者下降的顺序来显示查询的结果。例如:
ASC = Ascending Order – 这个是缺省的
DESC = Descending Order
下面举个例子:
SELECT employee_id, dept, name, age, salary
FROM employee_info
WHERE dept = 'Sales'
ORDER BY salary;
这条SQL语句将从employee_info表中列dept等于'Sales'选择employee_id,、dept、 name、 age和 salary,并且根据他们的salary按升序的顺序来列出检索结果。
如果你想对多列排序的话,那么在列与列之间要加上逗号,比如 :
SELECT employee_id, dept, name, age, salary
FROM employee_info
WHERE dept = 'Sales'
ORDER BY salary, age DESC;
SQL循序渐进(14)------组合条件和布尔运算符
组合条件和布尔运算符
以下的SQL语句中就含有组合条件:
SELECT column1, SUM(column2)
FROM "list-of-tables"
WHERE "condition1" AND "condition2";
AND运算符可以在WHERE子句中连接两个或者多个条件。AND条件的两旁必须都为true(真),即两个条件都同时满足的时候,这些行才将被显示。
当然,你也可以使用OR运算符,它也可以在WHERE子句中连接两个或者多个条件。但是,只要OR运算符两旁有一个为true的时候条件就满足了,因此行才会被显示。所以你使用OR运算符的时候,可以是OR运算符两旁只有一个为true或者两旁都为true。
下面举个例子吧:
SELECT employeeid, firstname, lastname, title, salary
FROM employee_info
WHERE salary >= 50000.00 AND title = 'Programmer';
这条SQL语句是从employee_info表中选择salary大于等于50000.00并且title等于'Programmer'的列employeeid、 firstname、 lastname、 title和 salary。此时必须AND运算符两旁的条件都为真,行才会最为检索结果返回。如果其中有一个条件为假,那么就什么都没有显示。
你可以使用圆括号将条件括起来,虽然它们也不一定是必须的,但是括起来看起来更清晰一些,这是一个编程习惯的问题。比如 :
SELECT employeeid, firstname, lastname, title, salary
FROM employee_info
WHERE (salary >= 50000.00) AND (title = 'Programmer');
下面再举个例子:
SELECT firstname, lastname, title, salary
FROM employee_info
WHERE (title = 'Sales') OR (title = 'Programmer');
这条语句将从employee_info表中选择title等于'Sales'或者等于'Programmer'的列firstname、 lastname, title和 salary。
SQL循序渐进(15)------IN 和 BETWEEN 条件运算符
IN 和 BETWEEN 条件运算符
下面是IN条件运算符的SQL语句:
SELECT column1, SUM(column2)
FROM "list-of-tables"
WHERE column3 IN (list-of-values);
下面是BETWEEN条件运算符的SQL语句:
SELECT column1, SUM(column2)
FROM "list-of-tables"
WHERE column3 BETWEEN value1 AND value2;
实际上,IN条件运算符是一个设置成员测试运算符,也就是说,它用于测试是否一个数值处在IN关键字之后提供的数值之中。举个例子如下:
SELECT employeeid, lastname, salary
FROM employee_info
WHERE lastname IN ('Hernandez', 'Jones', 'Roberts', 'Ruiz');
这条语句是从employee_info表中选择lastname等于Hernandez、Jones、 Roberts或者 Ruiz名字之一的列employeeid、 lastname和 salary。如果它在其中就将返回行。
IN条件运算符可以使用混合条件来替代,比如你可以使用等号运算符或者使用OR运算符等等,但是结果是一样的,例如:
SELECT employeeid, lastname, salary
FROM employee_info
WHERE lastname = 'Hernandez' OR lastname = 'Jones' OR lastname = 'Roberts' OR lastname = 'Ruiz';
你可以观察到,利用IN运算符时语句会更加简短并且容易读,特别是在你测试两个或者三个数值以上的时候尤为突出。
当然你也可以使用NOT IN 来在你的列表中排除行的。
而BETWEEN条件运算符是用与测试一个数值是否处在BETWEEN关键字两边指定数值的中间,比如:
SELECT employeeid, age, lastname, salary
FROM employee_info
WHERE age BETWEEN 30 AND 40;
这条SQL语句是从employee_info表中选择age处于30到40岁之间(包括30岁和40岁)的列employeeid、age、 lastname和salary。
这条语句同样可以不用BETWEEN运算符,而使用混合条件来替代,例如:
SELECT employeeid, age, lastname, salary
FROM employee_info
WHERE age >= 30 AND age <= 40;
当然,你也可以类似于NOT IN的方法,使用NOT BETWEEN来排除一些数据。
SQL循序渐进(16)------数学运算符
数学运算符
标准的ANSI SQL-92支持下面四个基本的算术运算符:
+
加
-
减
*
乘
/
除
%
求余
其中求余运算符决定除法的余数。这个运算符不是ANSI SQL支持的,但是,绝大多数的数据库支持他。下面是一些有用的数学函数,因为可能要用到它,所以我这里要集中提一下。在ANSI SQL-92中不支持这些函数,但是它们可能对于某些特殊的RDBMS是有效的。然而它们对于几个主要的数据库系统都是有效的。下面就说说这些数学函数吧:
ABS(x)
返回x的绝对值
SIGN(x)
当x为负数、零、正数的时候分别返回x的符号-1、0或者1
MOD(x,y)
返回x除以y的余数,跟x%y作用一样
FLOOR(x)
返回小于等于x的最大整数
CEILING(x) 或 CEIL(x)
返回大于等于x的最小整数
POWER(x,y)
返回x的y次方的数值
ROUND(x)
返回最接近于x的数
ROUND(x,d)
返回小数点数为4的接近于x的数
SQRT(x)
返回x的平方根
下面举个例子:
SELECT round(salary), firstname
FROM employee_info
上面这条语句将从employee_info表中选择salary最接近的数以及firstname列。
SQL循序渐进(17)------JOIN子句 [
JOIN子句
不知你有没有发现直到现在我们利用SELECT语句来检索的时候只能从一个表中进行。如果你想从两个表或者更多的表中进行检索,该怎么办呢?好在我们可以使用SQL和关系数据库系统的一个很有用的特性,即"Join"。为了简单说明,实际上"Join"就是使得关系数据库系统相关的东东。"Join"允许你从两个表或者更多的表连接数据进行数据检索,而只需要利用一个SELECT语句。如果在FROM关键字之后有多个表的话,"Join"可以在SQL SELECT语句中识别它们。
下面举个例子:
SELECT "list-of-columns"
FROM table1,table2
WHERE "search-condition(s)"
"Join"
通过示范当你只处理一个表的时候会发生什么事情可以使得"Join"的解释更简单,所以这里我没有使用"Join"。这个单一的数据库有事也被称为"flat table"(平表)。现在你有一个表的数据库用来检索所有顾客的信息以及他们从你的商店买了什么,下面就是这个表的所有列:
id first last address city state zip date item price
每次一个新行被插入到表中,所有的列都将被更新,这样就导致了不必要的”多余数据”。比如,每次Jenny买东西,下面的行都将被插入到表中:
id first last address city state zip date item price
10982 Wolfgang Jenny 300 N. 1st Ave Yuma AZ 85002 032299 snowboard 25.00
10982 Wolfgang Jenny 300 N. 1st Ave Yuma AZ 85002 032299 shovel 15.00
10982 Wolfgang Jenny 300 N. 1st Ave Yuma AZ 85002 032299 gloves 15.00
10982 Wolfgang Jenny 300 N. 1st Ave Yuma AZ 85002 032299 lantern 35.00
10982 Wolfgang Jenny 300 N. 1st Ave Yuma AZ 85002 032299 tent 95.00 |
|