1.SELECT TOP
规定返回记录数目
mysql
SELECT column_name(s)
FROM table_name
LIMIT number;
oracle
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;
2.like
在 WHERE 子句中搜索列中的指定模式
SELECT * FROM Websites WHERE name LIKE 'G%';
SELECT * FROM Websites WHERE name LIKE '%oo%';
SELECT * FROM Websites WHERE name NOT LIKE '%oo%';
3.通配符

4.in
在where中规定多个值
SELECT column_name(s) FROM table_name
WHERE column_name IN (value1,value2,...);
SELECT * FROM Websites
WHERE name IN ('Google','baidu');
5.between
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
SELECT column_name(s) FROM table_name
WHERE column_name BETWEEN value1 AND value2;
数值
SELECT * FROM Websites
WHERE alexa BETWEEN 1 AND 20;
SELECT * FROM Websites
WHERE alexa NOT BETWEEN 1 AND 20;
文本
SELECT * FROM Websites
WHERE name BETWEEN 'A' AND 'H';
日期
SELECT * FROM access_log
WHERE date BETWEEN '2016-05-10' AND '2016-05-14';
6.别名
通过使用 SQL,可以为表名称或列名称指定别名。
创建别名是为了让列名称的可读性更强。
在下面的情况下,使用别名很有用:
- 在查询中涉及超过一个表
- 在查询中使用了函数
- 列名称很长或者可读性差
- 需要把两个列或者多个列结合在一起
表
SELECT column_name(s) FROM table_name AS alias_name;
列
SELECT column_name AS alias_name FROM table_name;
SELECT name AS n, country AS c FROM Websites;
组合列
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info FROM Websites;
连表查询
使用别名
SELECT w.name, w.url, a.count, a.date
FROM Websites AS w, access_log AS a
WHERE a.site_id=w.id and w.name="菜鸟教程";
正常语句
SELECT Websites.name, Websites.url, access_log.count, access_log.date
FROM Websites, access_log
WHERE Websites.id=access_log.site_id and Websites.name="菜鸟教程";
7. join
把来自两个或多个表的行结合起来。
7.1 inner join
INNER JOIN 关键字在表中存在至少一个匹配时返回行
INNER JOIN 与 JOIN 是相同的

SELECT column_name(s) FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
SELECT Websites.name, access_log.count, access_log.date FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count;
在使用 join 时,on 和 where 条件的区别如下:
- on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
- where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉
7.2 left join
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

SELECT column_name(s) FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
SELECT Websites.name, access_log.count, access_log.date FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;
7.3 right join
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

7.4 full outer join(mysql 不支持)
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行。
SELECT column_name(s) FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
SELECT Websites.name, access_log.count, access_log.date FROM Websites
FULL OUTER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;
8. union
合并两个或多个 SELECT 语句的结果。
去重
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
不去重
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
9. insert into select
SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
复制所有的列
INSERT INTO table2
SELECT * FROM table1;
只复制希望的列
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;
10. constraints
SQL 约束用于规定表中的数据规则。
如果存在违反约束的数据行为,行为会被约束终止。
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
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,
....
);
10.1 not null
NOT NULL 约束强制列不接受 NULL 值。
NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
#下面的 SQL 强制 "ID" 列、 "LastName" 列以及 "FirstName" 列不接受 NULL 值:
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);
#在一个已创建的表的 "Age" 字段中添加 NOT NULL 约束如下所示:
ALTER TABLE Persons
MODIFY Age int NOT NULL;
#删除NOT NULL 约束
ALTER TABLE Persons
MODIFY Age int NULL;
10.2 unique
UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。
每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)
#如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
#ALTER TABLE 时的 SQL UNIQUE 约束
ALTER TABLE Persons
ADD UNIQUE (P_Id)
#或
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
#撤销 UNIQUE 约束
ALTER TABLE Persons
DROP INDEX uc_PersonID
10.3 primary key
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
#命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
#ALTER TABLE 时的 SQL PRIMARY KEY 约束
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
#命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
#撤销 PRIMARY KEY 约束
ALTER TABLE Persons
DROP PRIMARY KEY
10.4 foreign key
一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
#ALTER TABLE 时的 SQL FOREIGN KEY 约束
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
#命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
#撤销 FOREIGN KEY 约束
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

10.5 check
CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (P_Id>0)
)
#命名 CHECK 约束,并定义多个列的 CHECK 约束
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
)
#ALTER TABLE 时的 SQL CHECK 约束
ALTER TABLE Persons
ADD CHECK (P_Id>0)
#命名 CHECK 约束,并定义多个列的 CHECK 约束
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
#撤销 CHECK 约束
ALTER TABLE Persons
DROP CHECK chk_Person
10.6 default
DEFAULT 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
#使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
OrderDate date DEFAULT GETDATE()
)
#ALTER TABLE 时的 SQL DEFAULT 约束
ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
#撤销 DEFAULT 约束
ALTER TABLE Persons
ALTER City DROP DEFAULT
11. index
CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
注释:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。
#SQL CREATE INDEX
CREATE INDEX index_name
ON table_name (column_name)
#SQL CREATE UNIQUE INDEX
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
#撤销索引
ALTER TABLE table_name
DROP INDEX index_name
12.auto_increment
Auto_increment 会在新记录插入表中时生成一个唯一的数字。
CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (ID)
)
变更开始值
ALTER TABLE Persons AUTO_INCREMENT=100
13.view
没懂
14.日期
getdate():返回当前日期
datepart():返回日期时间


SELECT DATEPART(yyyy,OrderDate) AS OrderYear,
DATEPART(mm,OrderDate) AS OrderMonth,
DATEPART(dd,OrderDate) AS OrderDay,
FROM Orders
WHERE OrderId=1

DATEADD():函数在日期中添加或减去指定的时间间隔。
SELECT OrderId,DATEADD(day,45,OrderDate) AS OrderPayDate
FROM Orders

DATEDIFF():返回两个日期之间的天数
SELECT DATEDIFF(day,'2008-06-05','2008-08-05') AS DiffDate

CONVERT() 函数是把日期转换为新数据类型的通用函数。
CONVERT() 函数可以用不同的格式显示日期/时间数据。
CONVERT(data_type(length),expression,style)
15.null
#选取所有带null的记录
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
#选取所有不带null的记录
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
16. 数据类型

网友评论