SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL 可以做什么
- SQL 面向数据库执行查询
- SQL 可从数据库取回数据
- SQL 可在数据库中插入新的记录
- SQL 可更新数据库中的数据
- SQL 可从数据库删除记录
- SQL 可创建新数据库
- SQL 可在数据库中创建新表
- SQL 可在数据库中创建存储过程
- SQL 可以设置表、存储过程和视图的权限
SQL语言包括三个部分:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)
- 数据定义语言Data Definition Language(DDL),用来建立数据库、数据对象和定义其列。例如:CREATE、DROP、ALTER等语句。
- 数据操作语言Data Manipulation Language(DML),用来插入、修改、删除、查询,可以修改数据库中的数据。例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句、SELECT(查询)
- 数据控制语言Data Controlling Language(DCL),用来控制数据库组件的存取许可、存取权限等。例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。
数据操作语言DML
SELECT 语句 (用于从表中选取数据)
语法:SELECT 列名 FROM 表名 (SQL 语句对大小写并不敏感)
例子:获取 “LastName” 和 “FirstName” 列内容,SELECT LastName,FirstName FROM Persons
SELECT DISTINCT语句(关键词 DISTINCT 用于返回唯一不同的值)
语法 SELECT DISTINCT 列名 FROM 表名
例 需从 Company“ 列中仅选取唯一不同的值,SELECT DISTINCT Company FROM Orders 结果:
SQL WHERE 子句(有条件地从表中选取数据)
语法:SELECT 列名 FROM 表名 WHERE 列 运算符 值
可在子句中使用的运算符: = <> > < >= <= BETWEEN LIKE 例子希望选取 居住在“Beijing” 的人,SELECT * FROM Persons WHERE City='Beijing'
AND & OR 运算符(在WHERE 子句中把两个或多个条件结合起来)
使用AND 来显示所有姓为 “Carter” 并且名为“Thomas” 或者“William”的人:
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName ='William') AND LastName='Carter'
ORDER BY 子句(根据指定列对结果集进行排序。默认升序)
以逆字母顺序显示公司名称,并以数字顺序显示顺序号:SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
INSERT INTO语句(向表中插入新行)
语法: INSERT INTO 表名VALUES (值1, 值2,....)
例 1 插入新的行
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')例 2 指定的列中插入数据
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
Update 语句(用于修改表中的数据)
语法:UPDATE 表名 SET 列名 = 新值 WHERE 列名 = 某值
例1:更新某一行中的一个列UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'例2:更新某一行中的若干列
修改地址(address),并添加城市(city)UPDATE Person SET Address = ‘Zhongshan 23’, City = ‘Nanjing’ WHERE LastName = 'Wilson'
DELETE 语句(用于删除表中的行)
语法:DELETE FROM 表名WHERE 列名= 值
删除某行
DELETE FROM Person WHERE LastName = 'Wilson' 删除所有行DELETE FROM table_name DELETE * FROM table_name
TOP 子句(规定要返回的记录数)不同的数据库,语法不同
SQL Server语法:
SELECT TOP number|percent column_name(s) FROM tabel_name 例1 从表中选取头2条记录 SELECT TOP 2 * FROM Persons 例2 从表中选取50%的记录 SELECT TOP 50 PERCENT * FROM PersonsMySQL语法:
SELECT column_name(s) FROM table_name LIMIT number例 SELECT * FROM Persons LIMIT 5Oracle语法:SELECT column_name(s) FROM table_name WHERE ROWNUM <= number 例 SELECT * FROM Persons WHERE ROWNUM <=5
操作符
LIKE 操作符(在WHERE 子句中搜索列中的指定模式)
语法 SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
例 选取Persons表中居住在以N开始的城市里的人SELECT * FROM Persons WHERE City LIKE 'N%'SQL 通配符(通配符必须与LIKE 运算符一起使用)
- % :替代一个或多个字符
- _ :仅替代一个字符
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
- [charlist]:字符列中的任何单一字符“Persons” 表中选取居住在城市以“A” 或“L” 或“N” 开头的人: SELECT * FROM Persons WHERE City LIKE '[ALN]%'
- [^charlist] [!charlist]:不在字符列中的任何单一字符
Persons” 表中选取居住在城市不以“A” 或“L” 或“N” 开头的人:
SELECT * FROM Persons WHERE City LIKE ‘[!ALN]%'
IN 操作符(允许在WHERE 子句中规定多个值)
语法:SELECT column_name(s)
FROM table_name WHERE column_name IN (value1,value2,...)例子:选取姓氏为Adams 和Carter 的人
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
BETWEEN 操作符(在WHERE 子句中使用,作用是选取介于两个值之间的数据)
语法:SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
- 例:以字母顺序显示介于"Adams"(包括)和"Carter"之间的人SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
- 例:范围之外的人,可使用NOT 操作符SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'
注意:不同的数据库对BETWEEN...AND 操作符的处理方式是有差异,主要体现在边界。
Join 和Key(根据两个或多个表中列之间的关系,从这些表中查询数)
谁订购了产品,并且他们订购了什么产品?SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_PSELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName
INNER JOIN (或者JOIN):内连接。 在表中至少存在一个匹配时,INNER JOIN 关键字返回行例 前面两张表格中中,列出所有人的定购SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P
注意:INNER JOIN 关键字在表中至少存在一个匹配时返回行。如果"Persons" 中的行在"Orders" 中没有匹配,就不会列出这些
INNER JOIN (或者JOIN):内连接。
在表中至少存在一个匹配时,INNER JOIN 关键字返回行例 前面两张表格中中,列出所有人的定购SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P注意:INNER JOIN 关键字在表中至少存在一个匹配时返回行。如果"Persons" 中的行在"Orders" 中没有匹配,就不会列出这些
LEFT JOIN(left outer join):左外连接 。
从左表返回所有的行,即使右表中没有匹配的行。
例 前面两张表格中中,列出所有人的定购SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsLEFT JOIN OrdersON Persons.Id_P=Orders.Id_P注意:左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
RIGHT JOIN (RIGHT OUTER JOIN):右外连接。
会从右表(table_name2) 那里返回所有的行,即使在左表(table_name1) 中没有匹配的行 。
例 前面两张表格中中,列出所有人的定购SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsRIGHT JOIN OrdersON Persons.Id_P=Orders.Id_P注意:右表的记录将会全部表示出来,而左表只会显示符合搜索条件的记录。左表记录不足的地方均为NULL。
FULL JOIN(FULL OUTER JOIN) 。
只要其中某个表存在匹配,FULL JOIN 关键字就会返回。
例 前面两张表格中中,列出所有人的定购SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsFULL JOIN OrdersON Persons.Id_P=Orders.Id_P注意:FULL JOIN 关键字会从左表(Persons) 和右表(Orders) 那里返回所有的行。如果"Persons" 表中的行在表"Orders" 中没有匹配,或者"Orders" 表中的行在表"Persons" 中没有匹配,这些行同样会列出。
“Orders” 表已存在的情况下为“Id_P” 列创建FOREIGN KEY 约束
ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) 撤销 FOREIGN KEY 约束以MySQL 为例 ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders操作符
UNION 操作符(用于合并两个或多个SELECT 语句的结果
注:UNION 内部的SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条SELECT 语句中列的顺序必须相同。
UNION 语法:SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2UNION 操作符默认选取不同的值。如果允许重复值,请使用UNION ALL
CREATE DATABASE(创建数据库)
语法:CREATE DATABASE database_nameCREATE TABLE (创建数据库中的表)
语法:CRATE TABLE 表名(列名1 数据类型, 列名2 数据类型, 列名3 数据类型, .... )CREATE TABLE Persons
(Id_P int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) )约束用于限制加入表的 数据的类型,
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。NOT NULLUNIQUEPRIMARY KEYFOREIGN KEYCHECKDEFAULTNOT NULL(约束强制列不接受 NULL 值。即如果不向字段添加值,就无法插入新记录或者更新记录)
CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) )UNIQUE (约束唯一标识数据库表中的每条记录)
CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) )PRIMARY KEY 约束唯一标识数据库表中的每条记录
主键必须包含唯一的值主键列不能包含NULL 值每个表都应该有一个主键,并且每个表只能有一个主键以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) )为多个列定义PRIMARY KEY 约束(联合主键)
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) )如果在表已存在的情况下为“Id_P” 列创建PRIMARY KEY 约束
ALTER TABLE Persons ADD PRIMARY KEY (Id_P)注:如果使用ALTER TABLE 语句添加主键,必须把主键列声明为不包含NULL 值(在表首次创建时撤销 PRIMARY KEY 约束
MySql语法 ALTER TABLE Persons DROP PRIMARY KEY SQL Server / Oracle / MS Access语法: ALTER TABLE Persons DROP CONSTRAINT pk_PersonIDFOREIGN KEY 外键约束
一个表中的FOREIGN KEY 指向另一个表中的PRIMARY KEY,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)“Orders” 表已存在的情况下为“Id_P” 列创建FOREIGN KEY 约束
ALTER TABLE Orders ADD FOREIGN KEY (Id_P) REFERENCES Persons(Id_P) 撤销 FOREIGN KEY 约束以MySQL 为例 ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrdersCHECK 约束 (限制列中值的范)
下面的 SQL 在"Persons" 表创建时为"Id_P" 列创建CHECK 约束。CHECK 约束规定"Id_P" 列必须只包含大于0 的整数。以MySql为例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))表已存在的情况下为"Id_P" 列创建CHECK 约束
ALTER TABLE Persons ADD CHECK (Id_P>0)撤销 CHECK 约束
ALTER TABLE Persons DROP CONSTRAINT chk_PersonDEFAULT 约束(用于向列中插入默认值)
CREATE TABLE Persons (Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) DEFAULT 'Sandnes' )在表已存在的情况下为“City” 列创建DEFAULT 约束以MySql为例ALTER TABLE Persons ALTER City SET DEFAULT 'SANDNES' 撤销 DEFAULT 约束以MySql为例ALTER TABLE Persons ALTER City DROP DEFAULTCREATE INDEX(用于在表中创建索)
在表上创建一个简单的索引。允许使用重复的CREATE INDEX index_name ON table_name (column_name)在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值
CREATE UNIQUE INDEX index_name ON table_name (column_name)例降序索引某个列中的值
CREATE INDEX PersonIndex ON Person (LastName DESC)例索引不止一个列
CREATE INDEX PersonIndex ON Person (LastName, FirstName)DROP(撤销索引、表以及数据库)
以MySQL为例,撤销索引语法ALTER TABLE table_name DROP INDEX index_nameDROP TABLE用于删除表(表的结构、属性以及索引也会被删除)
DROP TABLE 表名DROP DATABASE用于删除数据
DROP DATABASE 数据库名TRUNCATE TABLE 命令(仅仅删除表格中的数据):
TRUNCATE TABLE 表名 ALTER TABLE(在已有的表中添加、修改或删除列DROP) 需在表中添加列,可使用下列语法ALTER TABLE table_name ADD column_name datatype删除表中的列,可使用下列语法
ALTER TABLE table_name DROP COLUMN column_name