The environment for test is Toad for Oracle 9,and the Oracle version is oracle10g on windows 7.
--
主键
• PRIMARY KEY 约束唯一标识数据库表中的每条记录。
• 主键必须包含唯一的值。
• 主键列不能包含 NULL 值。
• 每个表应该都一个主键,并且每个表只能有一个主键。
Test1:create table named Persons and create primary key with only one column.
Way1:
CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
Way2:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_personId PRIMARY KEY (Id_P)
)
Test2:create table named Persons and create primary key using two columns or more.
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_personId PRIMARY KEY (Id_P,Lastname)
)
Test3:create table named Persons which doesn’t contain primary key and create primary key using ‘ALTER’.
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
Way1:
ALTER TABLE Persons ADD PRIMARY KEY (ID_P);
Way2:
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P)
Or
ALTER TABLE PERSONS ADD (
CONSTRAINT PK_PERSONID
PRIMARY KEY
(ID_P)
);
If you want to add primary key with two column,the statement below can be used:
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName);
Ok,I think :
ALTER TABLE <tableName> CONSTRAINT <primaryName> PRIMARY KEY(column name1,column name2,…);
is the common format to add primary key to table which is already created.
Test3:drop primary key
Way1:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
ALTER TABLE Persons ADD PRIMARY KEY (ID_P)
ALTER TABLE Persons DROP PRIMARY KEY;
Note:you can’t drop the primary key by using constraint,because you haven’t creat a constraint.
Way2:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P);
ALTER TABLE PERSONS DROP CONSTRAINT pk_PersonID;
When primary key with two colunms:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName);
You can
ALTER TABLE PERSONS DROP PRIMARY KEY;
or
ALTER TABLE PERSONS DROP CONSTRAINT pk_PersonID;
Note:if we want to drop primary key ,we only use the format ‘DROP PRIMARY KEY’
is enough and easily to remember.
--
• SQL FOREIGN KEY 约束
• 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。
• 让我们通过一个例子来解释外键。请看下面两个表:
• "Persons" 表:
Id_P LastName FirstName Address City
1 Adams John Oxford Street London
2 Bush George Fifth Avenue New York
3 Carter Thomas Changan Street Beijing
• "Orders" 表:
Id_O OrderNo Id_P
1 77895 3
2 44678 3
3 22456 1
4 24562 1
• 请注意,"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。
• "Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。
• "Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。
• FOREIGN KEY 约束用于预防破坏表之间连接的动作。
• FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
• SQL FOREIGN KEY Constraint on CREATE TABLE
Test1:在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY:
CREATE TABLE Persons
(
Id_P number NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
ALTER TABLE Persons ADD PRIMARY KEY (ID_P)
CREATE TABLE Orders
(
O_Id number NOT NULL PRIMARY KEY,
OrderNo number NOT NULL,
Id_P number,
constraint fk_test1 FOREIGN KEY(Id_P) REFERENCES persons(Id_P)
);
or
CREATE TABLE Orders
(
O_Id number NOT NULL PRIMARY KEY,
OrderNo number NOT NULL,
Id_P number,
FOREIGN KEY(Id_P) REFERENCES persons(Id_P));
Test2:
CREATE TABLE Persons
(
Id_P number NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
ALTER TABLE Persons ADD PRIMARY KEY (ID_P)
如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束,请使用下面的 SQL:
CREATE TABLE Orders
(
O_Id number NOT NULL PRIMARY KEY,
OrderNo number NOT NULL,
Id_P number,
);
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
Or
ALTER TABLE Orders
ADD CONSTRAINT pittwang
FOREIGN KEY (Id_P)
REFERENCES Persons(ID_P)
Test3:撤销 FOREIGN KEY 约束
If I create foreign like below:
ALTER TABLE Orders
ADD FOREIGN KEY (Id_P)
REFERENCES Persons(Id_P)
I will drop foreign key through statement below:
ALTER TABLE Orders
DROP FOREIGN KEY 系统分配的号码
Or
ALTER TABLE Orders
DROP constraint SYS_C005698;
If I create foreign like below:
ALTER TABLE Orders
ADD CONSTRAINT pittwang
FOREIGN KEY (Id_P)
REFERENCES Persons(ID_P)
I will drop foreign key through statement below:
ALTER TABLE Orders
DROP CONSTRAINT pittwang
--
Create unique key:
Test1:
Create unique using one column.
CREATE TABLE Persons
(
Id_P number NOT NULL UNIQUE,
LastName number(25) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
or
CREATE TABLE Persons
(
Id_P number NOT NULL,
LastName number(25) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT UC_PERSONID UNIQUE (ID_P)
)
Create unique using two columns.
CREATE TABLE Persons
(
Id_P number NOT NULL,
LastName number(25) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT UC_PERSONID UNIQUE (ID_P,LastName)
)
Test2:drop the unique key
CREATE TABLE Persons
(
Id_P number NOT NULL,
LastName number(25) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT UC_PERSONID UNIQUE (ID_P)
)
ALTER TABLE Persons
DROP constraint UC_PERSONID;
Or
CREATE TABLE Persons
(
Id_P number NOT NULL UNIQUE,
LastName number(25) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
ALTER TABLE Persons
DROP CONSTRAINT 系统分配的号码(在constraint里查)
--
SQL CHECK 约束
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
SQL CHECK Constraint on CREATE TABLE
下面的 SQL 在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。
CREATE TABLE Persons
(
Id_P number NOT NULL CHECK (Id_P>0),
LastName number(25) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
CREATE TABLE Persons
(
Id_P number NOT NULL,
LastName number(25) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)
如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束,请使用下面的 SQL:
ALTER TABLE Persons ADD CHECK (Id_P>0)
如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
如需撤销 CHECK 约束,请使用下面的 SQL:
ALTER TABLE Persons
DROP CONSTRAINT chk_Person
--
SQL DEFAULT 约束
• DEFAULT 约束用于向列中插入默认值。
• 如果没有规定其他的值,那么会将默认值添加到所有的新纪录。
• SQL DEFAULT Constraint on CREATE TABLE
• 下面的 SQL 在 "Persons" 表创建时为 "City" 列创建 DEFAULT 约束:
• CREATE TABLE Persons
• (
• Id_P int NOT NULL,
• LastName varchar(255) NOT NULL,
• FirstName varchar(255),
• Address varchar(255),
• City varchar(255) DEFAULT 'Sandnes'
• )
通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderDate date DEFAULT sysdate
)
如果在表已存在的情况下为 "City" 列创建 DEFAULT 约束,请使用下面的 SQL:
撤销 DEFAULT 约束,don’t kown!
--
索引
• 您可以在表中创建索引,以便更加快速高效地查询数据。
• 用户无法看到索引,它们只能被用来加速搜索/查询。
• 注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
• SQL CREATE INDEX 语法
• 在表上创建一个简单的索引。允许使用重复的值:
• CREATE INDEX index_name
• ON table_name (column_name)
• 注释:"column_name" 规定需要索引的列。
• SQL CREATE UNIQUE INDEX 语法
• 在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
• CREATE UNIQUE INDEX index_name
• ON table_name (column_name)
• CREATE INDEX 实例
• 本例会创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列:
• CREATE INDEX PersonIndex
• ON Person (LastName)
• 如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC:
• CREATE INDEX PersonIndex
• ON Person (LastName DESC)
• 假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
• CREATE INDEX PersonIndex
• ON Person (LastName, FirstName)
• SQL TRUNCATE TABLE 语句
• 如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?
• 请使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据):
• TRUNCATE TABLE 表名称
DROP and TRUNCATE are DDL commands, whereas DELETE is a DML command. Therefore DELETE operations can be rolled back (undone), while DROP and TRUNCATE operations cannot be rolled back.
• ALTER TABLE 语句
• ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
• 如需在表中添加列,请使用下列语法:
• ALTER TABLE table_name
• ADD column_name datatype
alter table persons add ww22 varchar2(4); varchar2必须指定字符数
alter table persons add ww22 number;可以不用指定范围
要删除表中的列,请使用下列语法:
• ALTER TABLE table_name
• DROP COLUMN column_name
要改变表中列的数据类型,don’t know!
AUTO INCREMENT 字段
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
INSERT INTO Persons (P_Id,FirstName,LastName)
VALUES (seq_person.nextval,'aLacrs','Monsen')
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。
注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。
SQL CREATE VIEW 语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
SQL CREATE VIEW 实例
可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据。
样本数据库 Northwind 拥有一些被默认安装的视图。视图 "Current Product List" 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No
我们可以查询上面这个视图:
SELECT * FROM [Current Product List]
create table product(
name varchar(10),
price varchar(10),
continued varchar(10)
)
insert into product values('pitt3','10000','Y',3)
create view productList as
select name,price from product where continued='n';
select * from productList;
Northwind 样本数据库的另一个视图会选取 Products 表中所有单位价格高于平均单位价格的产品:
CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
我们可以像这样查询上面这个视图:
SELECT * FROM [Products Above Average Price]
alter table product add ww number;
create view productList2 as
select name,price from product
where ww>=(select avg(ww) from product)
select * from productList2;
另一个来自 Northwind 数据库的视图实例会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 "Product Sales for 1997" 的视图那里选取数据:
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName
我们可以像这样查询上面这个视图:
SELECT * FROM [Category Sales For 1997]
我们也可以向查询添加条件。现在,我们仅仅需要查看 "Beverages" 类的全部销量:
SELECT * FROM [Category Sales For 1997]
WHERE CategoryName='Beverages'
create view productList3 as
select name,ww from product;
create view productList4 as
select distinct name,sum(ww) as CategorySales
from productList3 group by name;
SQL 更新视图
您可以使用下面的语法来更新视图:
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
现在,我们希望向 "Current Product List" 视图添加 "Category" 列。我们将通过下列 SQL 更新视图:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
If I have create a view named pro, I can rebuild it like this:
create or replace view pro as
select name,price,ww from product where ww=1;
SQL 撤销视图
您可以通过 DROP VIEW 命令来删除视图。
SQL DROP VIEW Syntax
DROP VIEW view_name
SQL 日期
假设我们有下面这个 "Orders" 表:
OrderId ProductName OrderDate
1 computer 2008-12-26
2 printer 2008-12-26
3 electrograph 2008-11-12
4 telephone 2008-10-19
现在,我们希望从上表中选取 OrderDate 为 "2008-12-26" 的记录。
我们使用如下 SELECT 语句:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
结果集:
OrderId ProductName OrderDate
1 computer 2008-12-26
3 electrograph 2008-12-26
现在假设 "Orders" 类似这样(请注意 "OrderDate" 列中的时间部分):
OrderId ProductName OrderDate
1 computer 2008-12-26 16:23:55
2 printer 2008-12-26 10:45:26
3 electrograph 2008-11-12 14:12:08
4 telephone 2008-10-19 12:56:10
如果我们使用上面的 SELECT 语句:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
那么我们得不到结果。这是由于该查询不含有时间部分的日期。
提示:如果您希望使查询简单且更易维护,那么请不要在日期中使用时间部分!
--one example
create table orders(
orderid number,
productname varchar2(10),
orderdate date)
insert into orders values(1,'computer',to_date('2008-12-26','yyyy-mm-dd'));
insert into orders values(1,'computer',to_date('2008-12-26','yyyy-mm-dd'));
insert into orders values(1,'computer',to_date('2008-11-12','yyyy-mm-dd'));
select * from orders
insert into orders values(1,'computer','12/JAN/2010');
insert into orders values(1,'computer','02/12/2010');--this statement is wrong!
SELECT to_char(ORDERDATE,'yyyy-mm-dd') FROM ORDERS;
select * from orders where orderdate=to_date('2008-12-26','yyyy-mm-dd');
--the other example
create table o2(
orderid number,
productname varchar2(10),
orderdate date)
insert into o2 values(1,'computer',to_date(sysdate,'yyyy-mm-dd hh24:mi:ss'));--this statement can run ,but is wrong!!!
insert into o2 values(3,'com67',sysdate);--this is right!
insert into o2 values(2,'computer2',to_date('2008-12-26','yyyy-mm-dd'));--can run,but no hour message.
insert into o2 values(1,'computer',to_date('2008-11-12 13:56:21','yyyy-mm-dd hh24:mi:ss'));--good
SELECT to_char(orderdate,'dd-mm-yyyy hh24:mi:ss') from o2;--get date according the defined formate
select * from o2;
NULL 值是遗漏的未知数据。
默认地,表的列可以存放 NULL 值。
本章讲解 IS NULL 和 IS NOT NULL 操作符。
SQL NULL 值
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新纪录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 值的处理方式与其他值不同。
NULL 用作未知的或不适用的值的占位符。
注释:无法比较 NULL 和 0;它们是不等价的。
SQL 的 NULL 值处理
请看下面的 "Persons" 表:
Id LastName FirstName Address City
1 Adams John London
2 Bush George Fifth Avenue New York
3 Carter Thomas Beijing
假如 "Persons" 表中的 "Address" 列是可选的。这意味着如果在 "Address" 列插入一条不带值的记录,"Address" 列会使用 NULL 值保存。
那么我们如何测试 NULL 值呢?
无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。
我们必须使用 IS NULL 和 IS NOT NULL 操作符。
SQL IS NULL
我们如何仅仅选取在 "Address" 列中带有 NULL 值的记录呢?
我们必须使用 IS NULL 操作符:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
结果集:
LastName FirstName Address
Adams John
Carter Thomas
提示:请始终使用 IS NULL 来查找 NULL 值。
SQL IS NOT NULL
我们如何选取在 "Address" 列中不带有 NULL 值的记录呢?
我们必须使用 IS NOT NULL 操作符:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
结果集:
LastName FirstName Address
Bush George Fifth Avenue
请看下面的 "Products" 表:
P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder
1 computer 699 25 15
2 printer 365 36
3 telephone 280 159 57
假如 "UnitsOnOrder" 是可选的,而且可以包含 NULL 值。
我们使用如下 SELECT 语句:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
在上面的例子中,如果有 "UnitsOnOrder" 值是 NULL,那么结果是 NULL。
在这里,我们希望 NULL 值为 0。
Oracle
Oracle 没有 ISNULL() 函数。不过,我们可以使用 NVL() 函数达到相同的结果:
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
SQL 拥有很多可用于计数和计算的内建函数。
内建 SQL 函数的语法是:
SELECT function(列) FROM 表
函数的类型
在 SQL 中,基本的函数类型和种类有若干种。函数的基本类型是:
• Aggregate 函数
• Scalar 函数
合计函数(Aggregate functions)
Aggregate 函数的操作面向一系列的值,并返回一个单一的值。
定义和用法
AVG 函数返回数值列的平均值。NULL 值不包括在计算中。
SQL AVG() 语法
SELECT AVG(column_name) FROM table_name
SQL AVG() 实例
我们拥有下面这个 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
例子 1
现在,我们希望计算 "OrderPrice" 字段的平均值。
我们使用如下 SQL 语句:
SELECT AVG(OrderPrice) AS OrderAverage FROM Orders
结果集类似这样:
OrderAverage
950
例子 2
现在,我们希望找到 OrderPrice 值高于 OrderPrice 平均值的客户。
我们使用如下 SQL 语句:
SELECT Customer FROM Orders
WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)
结果集类似这样:
Customer
Bush
Carter
Adams
COUNT() 函数返回匹配指定条件的行数。
SQL COUNT() 语法
SQL COUNT(column_name) 语法
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):
SELECT COUNT(column_name) FROM table_name
SQL COUNT(*) 语法
COUNT(*) 函数返回表中的记录数:
SELECT COUNT(*) FROM table_name
SQL COUNT(DISTINCT column_name) 语法
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:
SELECT COUNT(DISTINCT column_name) FROM table_name
注释:COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是无法用于 Microsoft Access。
SQL COUNT(column_name) 实例
我们拥有下列 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在,我们希望计算客户 "Carter" 的订单数。
我们使用如下 SQL 语句:
SELECT COUNT(Customer) AS CustomerNilsen FROM Orders
WHERE Customer='Carter'
以上 SQL 语句的结果是 2,因为客户 Carter 共有 2 个订单:
CustomerNilsen
2
SQL COUNT(*) 实例
如果我们省略 WHERE 子句,比如这样:
SELECT COUNT(*) AS NumberOfOrders FROM Orders
结果集类似这样:
NumberOfOrders
6
这是表中的总行数。
SQL COUNT(DISTINCT column_name) 实例
现在,我们希望计算 "Orders" 表中不同客户的数目。
我们使用如下 SQL 语句:
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders
结果集类似这样:
NumberOfCustomers
3
这是 "Orders" 表中不同客户(Bush, Carter 和 Adams)的数目。
FIRST() 函数
FIRST() 函数返回指定的字段中第一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
SQL FIRST() 语法
SELECT FIRST(column_name) FROM table_name
SQL FIRST() 实例
我们拥有下面这个 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在,我们希望查找 "OrderPrice" 列的第一个值。
我们使用如下 SQL 语句:
SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders
结果集类似这样:
FirstOrderPrice
1000
LAST() 函数
LAST() 函数返回指定的字段中最后一个记录的值。
提示:可使用 ORDER BY 语句对记录进行排序。
SQL LAST() 语法
SELECT LAST(column_name) FROM table_name
SQL LAST() 实例
我们拥有下面这个 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在,我们希望查找 "OrderPrice" 列的最后一个值。
我们使用如下 SQL 语句:
SELECT LAST(OrderP rice) AS LastOrderPrice FROM Orders
结果集类似这样:
LastOrderPrice
100
MAX() 函数
MAX 函数返回一列中的最大值。NULL 值不包括在计算中。
SQL MAX() 语法
SELECT MAX(column_name) FROM table_name
注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
SQL MAX() 实例
我们拥有下面这个 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在,我们希望查找 "OrderPrice" 列的最大值。
我们使用如下 SQL 语句:
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
结果集类似这样:
LargestOrderPrice
2000
MIN() 函数
MIN 函数返回一列中的最小值。NULL 值不包括在计算中。
SQL MIN() 语法
SELECT MIN(column_name) FROM table_name
注释:MIN 和 MAX 也可用于文本列,以获得按字母顺序排列的最高或最低值。
SQL MIN() 实例
我们拥有下面这个 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在,我们希望查找 "OrderPrice" 列的最小值。
我们使用如下 SQL 语句:
SELECT MIN(OrderPrice) AS SmallestOrderPrice FROM Orders
结果集类似这样:
SmallestOrderPrice
100
SUM() 函数
SUM 函数返回数值列的总数(总额)。
SQL SUM() 语法
SELECT SUM(column_name) FROM table_name
SQL SUM() 实例
我们拥有下面这个 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在,我们希望查找 "OrderPrice" 字段的总数。
我们使用如下 SQL 语句:
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders
结果集类似这样:
OrderTotal
5700
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。
GROUP BY 语句
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
SQL GROUP BY 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
SQL GROUP BY 实例
我们拥有下面这个 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在,我们希望查找每个客户的总金额(总订单)。
我们想要使用 GROUP BY 语句对客户进行组合。
我们使用下列 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
结果集类似这样:
Customer SUM(OrderPrice)
Bush 2000
Carter 1700
Adams 2000
很棒吧,对不对?
让我们看一下如果省略 GROUP BY 会出现什么情况:
SELECT Customer,SUM(OrderPrice) FROM Orders
结果集类似这样:
Customer SUM(OrderPrice)
Bush 5700
Carter 5700
Bush 5700
Bush 5700
Adams 5700
Carter 5700
上面的结果集不是我们需要的。
那么为什么不能使用上面这条 SELECT 语句呢?解释如下:上面的 SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。"SUM(OrderPrice)" 返回一个单独的值("OrderPrice" 列的总计),而 "Customer" 返回 6 个值(每个值对应 "Orders" 表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUP BY 语句解决了这个问题。
GROUP BY 一个以上的列
我们也可以对一个以上的列应用 GROUP BY 语句,就像这样:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate
HAVING 子句
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
SQL HAVING 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
SQL HAVING 实例
我们拥有下面这个 "Orders" 表:
O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
现在,我们希望查找订单总金额少于 2000 的客户。
我们使用如下 SQL 语句:
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
结果集类似:
Customer SUM(OrderPrice)
Carter 1700
现在我们希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。
我们在 SQL 语句中增加了一个普通的 WHERE 子句:
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
结果集:
Customer SUM(OrderPrice)
Bush 2000
Adams 2000
select upper(productname) from product;
select lower(productname) from product;
select * from product where rownum=1;
select * from product where
rownum<3;--查询出两条记录
select substr(columnName,1,2) from tableName—find two results.
Length()函数
ROUND() 函数
ROUND 函数用于把数值字段舍入为指定的小数位数。
SQL ROUND() 语法
SELECT ROUND(column_name,decimals) FROM table_name
参数 描述
column_name 必需。要舍入的字段。
decimals 必需。规定要返回的小数位数。
SQL ROUND() 实例
我们拥有下面这个 "Products" 表:
Prod_Id ProductName Unit UnitPrice
1 gold 1000 g 32.35
2 silver 1000 g 11.56
3 copper 1000 g 6.85
现在,我们希望把名称和价格舍入为最接近的整数。
我们使用如下 SQL 语句:
SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products
结果集类似这样:
ProductName UnitPrice
gold 32
silver 12
copper 7