SQL进阶语法笔记

  • 通配符
  • IN
  • BETWEEN
  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL OUTER JOIN
  • UNION
  • SELECT INTO
  • INSERT INTO SELECT
  • CREATE DATABASE
  • CREATE TABLE
  • 约束
  • CREATE INDEX索引

Websites表格数据:

id name url alexa country
1 Google https://www.google.cm/ 1 USA
2 淘宝 https://www.taobao.com/ 13 CN
3 菜鸟教程 http://www.runoob.com/ 4689 CN
4 微博 http://weibo.com/ 20 CN
5 Facebook https://www.facebook.com/ 3 USA
6 stackoverflow http://stackoverflow.com/ 0 IND

通配符

选取 name 以一个任意字符开始,然后是 “oogle” 的所有客户:

SELECT * FROM Websites
WHERE name LIKE '_oogle';

选取 name 以 “G”、“F” 或 “s” 开始的所有网站:

SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';

选取 name 以 A 到 H 字母开头的网站:

SELECT * FROM Websites
WHERE name REGEXP '^[A-H]';

选取 name 不以 A 到 H 字母开头的网站

SELECT * FROM Websites
WHERE name REGEXP '^[^A-H]';

IN

选取 name 为 “Google” 或 “菜鸟教程” 的所有网站:

SELECT * FROM Websites
WHERE name IN ('Google','菜鸟教程');

BETWEEN

选取 alexa 介于 1 和 20 之间的所有网站:

SELECT * FROM Websites
WHERE name BETWEEN 1 AND 20;

INNER JOIN

INNER JOIN 关键字在表中存在至少一个匹配时返回行。

“access_log”表格记录了网站的访问数据:

aid site_id count date
1 1 45 2016-05-10
2 3 100 2016-05-13
3 1 230 2016-05-14
4 2 10 2016-05-14
5 5 205 2016-05-14
6 4 13 2016-05-15
7 3 220 2016-05-15
8 5 545 2016-05-16
9 3 201 2016-05-17
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;

执行结果:
SQL进阶语法笔记_第1张图片

LEFT JOIN

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

上例的写法:

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;

执行结果:
SQL进阶语法笔记_第2张图片

RIGHT JOIN

和 LEFT JOIN 同理。

FULL OUTER JOIN

FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行。

UNION

SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;

执行结果:
SQL进阶语法笔记_第3张图片

SELECT INTO

只复制中国的网站插入到新表中:

SELECT * 
INTO WebsitesBackup2016
FROM Websites 
WHERE country='CN';

复制多个表中的数据插入到新表中:

SELECT Websites.name, access_log.count, access_log.date 
INTO WebsitesBackup2016
FROM Websites 
LEFT JOIN access_log
ON Websites.id=access_log.site_id;

INSERT INTO SELECT

复制 “apps” 中的数据插入到 “Websites” 中:

INSERT INTO Websites(name,country)
SELECT app.name,country FROM apps;

CREATE DATABASE

CREATE DATABASE my_db;

CREATE TABLE

CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

约束

1. 强制 “P_Id” 列和 “LastName” 列不接受 NULL 值:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

2. UNIQUE 约束唯一标识数据库表中的每条记录

1)在 “Persons” 表创建时在 “P_Id” 列上创建 UNIQUE 约束:

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)
)
)

2)当表已被创建时,如需在 “P_Id” 列创建 UNIQUE 约束,请使用下面的 SQL:

ALTER TABLE Persons
ADD UNIQUE (P_Id)

3)如需撤销 UNIQUE 约束,请使用下面的 SQL:

ALTER TABLE Persons
DROP INDEX uc_PersonID

3. PRIMARY KEY 约束唯一标识数据库表中的每条记录。

主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。

1) 在 “Persons” 表创建时在 “P_Id” 列上创建 PRIMARY KEY 约束:

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)
)

2)当表已被创建时,如需在 “P_Id” 列创建 PRIMARY KEY 约束,请使用下面的 SQL:

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

3)如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:

ALTER TABLE Persons
DROP PRIMARY KEY

4. FOREIGN KEY 约束指向另一个表中的 UNIQUE KEY(唯一约束的键)。

“Persons” 表:
SQL进阶语法笔记_第4张图片
“Orders” 表:
SQL进阶语法笔记_第5张图片

“Orders” 表中的 “P_Id” 列是 “Orders” 表中的 FOREIGN KEY。

FOREIGN KEY 约束用于预防破坏表之间连接的行为。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

在 “Orders” 表创建时在 “P_Id” 列上创建 FOREIGN 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)
)

当 “Orders” 表已被创建时,如需在 “P_Id” 列创建 FOREIGN KEY 约束,请使用下面的 SQL:

ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)

如需撤销 FOREIGN KEY 约束,请使用下面的 SQL:

ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

5. CHECK约束用于限制列中的值的范围。

在 “Persons” 表创建时在 “P_Id” 列上创建 CHECK 约束。CHECK 约束规定 “P_Id” 列必须只包含大于 0 的整数。

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)
)

当表已被创建时,如需在 “P_Id” 列创建 CHECK 约束,请使用下面的 SQL:

ALTER TABLE Persons
ADD CHECK (P_Id>0)

如需撤销 CHECK 约束,请使用下面的 SQL:

ALTER TABLE Persons
DROP CONSTRAINT chk_Person

6. DEFAULT 约束用于向列中插入默认值。
在 “Persons” 表创建时在 “City” 列上创建 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'
)

当表已被创建时,如需在 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:

ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'

如需撤销 DEFAULT 约束,请使用下面的 SQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT

CREATE INDEX索引

CREATE INDEX 语句用于在表中创建索引。
在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

在 “Persons” 表的 “LastName” 列上创建一个名为 “PIndex” 的索引:

CREATE INDEX PIndex
ON Persons (LastName)

如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:

CREATE INDEX PIndex
ON Persons (LastName, FirstName)

你可能感兴趣的:(sql学习)