SQL技术大全(二)

SQL技术大全(二)

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

SQL循序渐进(18)------索引

索引

索引允许DBMS更快地访问数据。系统创建了这个内部地数据结构(即索引),它导致当查询以列为索引的时候搜索行,这样查询会快得多。这个索引对于给定列索引数值的时通知DBMS找到表中某一行,这有点象书的索引,它告诉你对于给定的字你能找到哪一页。下面让我们在AntiqueOwners列中为 OwnerID创建索引:

CREATE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID);

下面语句是为名字创建所以:

CREATE INDEX NAME_IDX ON ANTIQUEOWNERS (OWNERLASTNAME, OWNERFIRSTNAME);

为了删除索引,你可以利用DROP:

DROP INDEX OID_IDX;

就象前面教程中,我们也可以"drop"(删除)一个表。上面第二个例子中,是在两列上创建索引的。

有些DBMS不强迫要求主键,换句话说就是,类的唯一性不会自动强制。这是什么意思呢,好象听起来云里雾里的。好吧,再给你举个例子,如果你象插入另外一行到AntiqueOwners表中,比如这个OwnerID是02,有些系统可以让你这样做即使我们要求所有行的数值都要是不同的。为了避免两行有相同的值,我们有一种方法来克服,就是在列上创建唯一的索引,而在这个列上我们需要它成为主键,这样就可以系统不会出现复制的情况:

CREATE UNIQUE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值