Oracle

  • SQL SELECT TOP, LIMIT, ROWNUM子句

MySQL 语法

1
2
3
4
SELECT column_name(s) FROM table_name LIMIT number;

实例
SELECT * FROM Persons LIMIT 5;

Oracle 语法

1
2
3
4
5
6
7
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;
实例
SELECT *
FROM Persons
WHERE ROWNUM <=5;
  • IN操作符

IN操作符允许您在WHERE子句中规定多个值。

1
2
选取name为"Google"或"菜鸟教程"的所有网站:
SELECT * FROM Websites WHERE name IN ('Google','菜鸟教程');
  • BETWEEN操作符
1
2
选取 alexa 介于 1 和 20 之间的所有网站:
SELECT * FROM Websites WHERE alexa BETWEEN 1 AND 20;
  • INSERT INTO SELECT 语句

从一个表复制数据,然后把数据插入到一个已存在的表中。

1
INSERT INTO Websites (name, country) SELECT app_name, country FROM apps;
  • 约束
1
2
3
4
5
6
NOT NULL   	- 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOTNULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。
DEFAULT - 规定没有给列赋值时的默认值

简写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 CREATE TABLE table_name(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);

如:
CREATE TABLE Persons(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes',
PRIMARY KEY (Id_P) //PRIMARY KEY约束
);

CREATE TABLE Persons(
Id_P int NOT NULL PRIMARY KEY, //PRIMARY KEY约束
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

完整写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 列级约束:
CREATE TABLE 表名(
column_name1 data_type(size) uq_表名_列名 unique,
column_name2 data_type(size) nn_表名_列名 not null,
column_name3 data_type(size) ck_表名_列名 check(条件),
column_name4 data_type(size) pk_表名_列名 primary key,
....
);

表级约束:
CREATE TABLE 表名(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
column_name4 data_type(size),
constraint uq_表名_列名 unique(列名),
constraint ck_表名_列名 check(条件), 条件是表中列的限制条件。
constraint pk_表名_列名 primary key(列名),
CONSTRAINT fk_表名_列名 FOREIGN KEY(P_Id) REFERENCES Persons(P_Id)
);

先表后约束:
ALTER TABLE Persons MODIFY Age int NOT NULL;
ALTER TABLE Persons MODIFY City DEFAULT 'SANDNES';
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName);
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName);
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes');
ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) REFERENCES Persons(P_Id);

删除约束:
ALTER TABLE Persons MODIFY Age int NULL;
ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT;
ALTER TABLE Persons DROP CONSTRAINT uc_PersonID;
ALTER TABLE Persons DROP CONSTRAINT pk_PersonID;
ALTER TABLE Persons DROP CONSTRAINT chk_Person;
ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders;
  • 序列
1
2
3
4
5
CREATE SEQUENCE seq_person MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10
上面的代码创建一个名为seq_person的sequence对象,它以1起始且以1递增。该对象缓存10个值以提高性能。cache规定了为了提高访问速度要存储多少个序列值。

要在"Persons"表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):
INSERT INTO Persons (ID,FirstName,LastName) VALUES (seq_person.nextval,'Lars','Monsen');
  • HAVING子句
1
2
3
SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM access_log
INNER JOIN Websites ON access_log.site_id=Websites.id)
GROUP BY Websites.name HAVING SUM(access_log.count) > 200;
  • UCASE()函数

此函数把字段的值转换为大写。

1
SELECT UCASE(name) AS site_title, url FROM Websites;
  • LCASE()函数

此函数把字段的值转换为小写。

1
SELECT LCASE(name) AS site_title, url FROM Websites;
  • LEN()函数

此函数返回文本字段中值的长度。

1
SELECT name, LENGTH(url) as LengthOfURL FROM Websites;
  • NOW()函数

此函数返回当前系统的日期和时间。

1
SELECT name, url, Now() AS date FROM Websites;