SQL语言(3)

来源:互联网 发布:程序员平均薪资 编辑:程序博客网 时间:2024/05/01 21:31

(1)SQL LEFT JOIN 关键字讲解

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

语法:SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。

"Persons" 表:

Id_PLastNameFirstNameAddressCity1AdamsJohnOxford StreetLondon2BushGeorgeFifth AvenueNew York3CarterThomasChangan StreetBeijing"Orders" 表:

Id_OOrderNoId_P177895324467833224561424562153476465实例:列出所有的人,以及他们的定购 - 如果有的话。

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.
Id_P ORDER BY Persons.LastName
LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678BushGeorge(2)SQL RIGHT JOIN 关键字讲解
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
语法:
SELECT column_name(s)FROM table_name1RIGHT JOIN table_name2 ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。

"Persons" 表:

Id_PLastNameFirstNameAddressCity1AdamsJohnOxford StreetLondon2BushGeorgeFifth AvenueNew York3CarterThomasChangan StreetBeijing

"Orders" 表:

Id_OOrderNoId_P177895324467833224561424562153476465实例:列出所有的定单,以及定购它们的人 - 如果有的话。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsRIGHT JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678  34764(3)SQL FULL JOIN 关键字讲解

只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。

语法:

SELECT column_name(s)FROM table_name1FULL JOIN table_name2 ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。

"Persons" 表:

Id_PLastNameFirstNameAddressCity1AdamsJohnOxford StreetLondon2BushGeorgeFifth AvenueNew York3CarterThomasChangan StreetBeijing

"Orders" 表:

Id_OOrderNoId_P177895324467833224561424562153476465

实例:现在,列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsFULL JOIN OrdersON Persons.Id_P=Orders.Id_PORDER BY Persons.LastName
LastNameFirstNameOrderNoAdamsJohn22456AdamsJohn24562CarterThomas77895CarterThomas44678BushGeorge   34764

FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。

(4)SQL UNION 和 UNION ALL 操作符讲解

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION语法:

SELECT column_name(s) FROM table_name1UNIONSELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法:
SELECT column_name(s) FROM table_name1UNION ALLSELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

Employees_China:

E_IDE_Name01Zhang, Hua02Wang, Wei03Carter, Thomas04Yang, Ming
Employees_USA:
E_IDE_Name01Adams, John02Bush, George03Carter, Thomas04Gates, Bill

实例:

列出所有在中国和美国的不同的雇员名:

SELECT E_Name FROM Employees_ChinaUNIONSELECT E_Name FROM Employees_USA
结果
E_NameZhang, HuaWang, WeiCarter, ThomasYang, MingAdams, JohnBush, GeorgeGates, Bill

注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。

UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。

实例:

列出在中国和美国的所有的雇员:

SELECT E_Name FROM Employees_ChinaUNION ALLSELECT E_Name FROM Employees_USA
结果
E_NameZhang, HuaWang, WeiCarter, ThomasYang, MingAdams, JohnBush, GeorgeCarter, ThomasGates, Bill(5)SQL SELECT INTO 语句讲解

SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。

SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。

语法:

把所有的列插入新表:

SELECT *INTO new_table_name [IN externaldatabase] FROM old_tablename

或者只把希望的列插入新表:

SELECT column_name(s)INTO new_table_name [IN externaldatabase] FROM old_tablename
实例:
a.制作 "Persons" 表的备份复件:
SELECT *INTO Persons_backup FROM Persons
b.IN 子句可用于向另一个数据库中拷贝表:
SELECT *INTO Persons IN 'Backup.mdb'FROM Persons
c.如果希望拷贝某些域,可以在 SELECT 语句后列出这些域:
SELECT LastName,FirstName INTO Persons_backup FROM Persons
d.通过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建了一个带有两个列的名为 "Persons_backup" 的表:
SELECT LastName,Firstname INTO Persons_backup FROM Persons WHERE City='Beijing'
e.创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:
SELECT Persons.LastName,Orders.OrderNo INTO Persons_Order_Backup FROM Persons INNER JOIN Orders ON Persons.Id_P=
Orders.Id_P
(6)SQL CREATE DATABASE 语句讲解
CREATE DATABASE 用于创建数据库。
语法:
CREATE DATABASE database_name
实例:
创建一个名为 "my_db" 的数据库。
CREATE DATABASE my_db
(7)SQL CREATE TABLE 语句
讲解
语法:
CREATE TABLE 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....)
数据类型(data_type)规定了列可容纳何种数据类型。
数据类型描述
  • integer(size)
  • int(size)
  • smallint(size)
  • tinyint(size)
仅容纳整数。在括号内规定数字的最大位数。
  • decimal(size,d)
  • numeric(size,d)

容纳带有小数的数字。

"size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。

char(size)

容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。

在括号中规定字符串的长度。

varchar(size)

容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。

在括号中规定字符串的最大长度。

date(yyyymmdd)容纳日期。实例实例:

如何创建名为 "Person" 的表。

该表包含 5 个列,列名分别是:"Id_P"、"LastName"、"FirstName"、"Address" 以及 "City":

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

Id_P 列的数据类型是 int,包含整数。其余 4 列的数据类型是 varchar,最大长度为 255 个字符。

空的 "Persons" 表类似这样:

Id_PLastNameFirstNameAddressCity    (8)SQL 约束 (Constraints)

约束用于限制加入表的数据的类型。

可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。

(9)SQL NOT NULL 约束讲解

NOT NULL 约束强制列不接受 NULL 值。

NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

下面的 SQL 语句强制 "Id_P" 列和 "LastName" 列不接受 NULL 值:

CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
(10)SQL UNIQUE 约束讲解

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

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

实例:

a.在 "Persons" 表创建时在 "Id_P" 列创建 UNIQUE 约束:

MySQL:

CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),UNIQUE (Id_P))
SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL UNIQUE,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))

如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

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 UNIQUE (Id_P,LastName))
b.当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD UNIQUE (Id_P)

如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE PersonsADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
c.如需撤销 UNIQUE 约束,请使用下面的 SQL:
MySQL:
ALTER TABLE PersonsDROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT uc_PersonID
(10)SQL PRIMARY KEY 约束

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

主键必须包含唯一的值。

主键列不能包含 NULL 值。

每个表都应该有一个主键,并且每个表只能有一个主键。

实例:

a.在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束。

MySQL:

CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),PRIMARY KEY (Id_P))
SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL PRIMARY KEY,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
b.如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束。
MySQL / SQL Server / Oracle / MS Access:
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))
c.如果在表已存在的情况下为 "Id_P" 列创建 PRIMARY KEY 约束。
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD PRIMARY KEY (Id_P)
d.如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束。
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

注释:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。

e.撤销 PRIMARY KEY 约束。

MySQL:

ALTER TABLE PersonsDROP PRIMARY KEY
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT pk_PersonID
(11)SQL FOREIGN KEY 约束讲解
一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY。

"Persons" 表:

Id_PLastNameFirstNameAddressCity1AdamsJohnOxford StreetLondon2BushGeorgeFifth AvenueNew York3CarterThomasChangan StreetBeijing

"Orders" 表:

Id_OOrderNoId_P1778953244678332245614245621

请注意,"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。

"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。

"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。

FOREIGN KEY 约束用于预防破坏表之间连接的动作。

FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

实例:
a.在 "Orders" 表创建时为 "Id_P" 列创建 FOREIGN KEY。
MySQL:
CREATE TABLE Orders(O_Id int NOT NULL,OrderNo int NOT NULL,Id_P int,PRIMARY KEY (O_Id),FOREIGN KEY (Id_P) REFERENCES Persons(Id_P))
SQL Server / Oracle / MS Access:
CREATE TABLE Orders(O_Id int NOT NULL PRIMARY KEY,OrderNo int NOT NULL,Id_P int FOREIGN KEY REFERENCES Persons(Id_P))
b.如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束。
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Orders(O_Id int NOT NULL,OrderNo int NOT NULL,Id_P int,PRIMARY KEY (O_Id),CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)REFERENCES Persons(Id_P))
c.如果在 "Orders" 表已存在的情况下为 "Id_P" 列创建 FOREIGN KEY 约束。
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE OrdersADD FOREIGN KEY (Id_P)REFERENCES Persons(Id_P)
d.如果需要命名 FOREIGN KEY 约束,以及为多个列定义 FOREIGN KEY 约束。
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE OrdersADD CONSTRAINT fk_PerOrdersFOREIGN KEY (Id_P)REFERENCES Persons(Id_P)
e.撤销 FOREIGN KEY 约束。
MySQL:
ALTER TABLE OrdersDROP FOREIGN KEY fk_PerOrders
SQL Server / Oracle / MS Access:
ALTER TABLE OrdersDROP CONSTRAINT fk_PerOrders
(12)SQL CHECK 约束讲解

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

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

实例:

a.在 "Persons" 表创建时为 "Id_P" 列创建 CHECK 约束。CHECK 约束规定 "Id_P" 列必须只包含大于 0 的整数。

My SQL:

CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CHECK (Id_P>0))
SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL CHECK (Id_P>0),LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))
b.如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束。
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes'))
c.如果在表已存在的情况下为 "Id_P" 列创建 CHECK 约束。
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CHECK (Id_P>0)
d.如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束。
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
e.撤销 CHECK 约束。

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

SQL Server / Oracle / MS Access:

ALTER TABLE PersonsDROP CONSTRAINT chk_Person
MySQL:
ALTER TABLE PersonsDROP CHECK chk_Person
(13)SQL DEFAULT 约束讲解

DEFAULT 约束用于向列中插入默认值。

如果没有规定其他的值,那么会将默认值添加到所有的新记录。

实例:

a.在 "Persons" 表创建时为 "City" 列创建 DEFAULT 约束。

My SQL / SQL Server / Oracle / MS Access:

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,OrderNo int NOT NULL,Id_P int,OrderDate date DEFAULT GETDATE())
b.如果在表已存在的情况下为 "City" 列创建 DEFAULT 约束。
MySQL:
ALTER TABLE PersonsALTER City SET DEFAULT 'SANDNES'
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsALTER COLUMN City SET DEFAULT 'SANDNES'
c.撤销 DEFAULT 约束。
MySQL:
ALTER TABLE PersonsALTER City DROP DEFAULT
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsALTER COLUMN City DROP DEFAULT







 























原创粉丝点击