SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。 数据库
SQL 能够作什么 测试
SQL语言包括三个部分:数据定义语言(DDL),数据操做语言(DML)及数据控制语言(DCL).net
语法:SELECT 列名 FROM 表名 (SQL 语句对大小写并不敏感)
例子:设计
获取 “LastName” 和 “FirstName” 列内容,SELECT LastName,FirstName FROM Persons对象
语法 SELECT DISTINCT 列名 FROM 表名
例排序
需从 Company“ 列中仅选取惟一不一样的值,SELECT DISTINCT Company FROM Orders
结果:索引
语法:SELECT 列名 FROM 表名 WHERE 列 运算符 值
可在子句中使用的运算符: = <> > < >= <= BETWEEN LIKE
例子ip
但愿选取 居住在“Beijing” 的人,SELECT * FROM Persons WHERE City='Beijing' ci
AND & OR 运算符(在WHERE 子句中把两个或多个条件结合起来)get
使用AND 来显示全部姓为 “Carter” 而且名为“Thomas” 或者“William”的人:
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName ='William') AND LastName='Carter'
以逆字母顺序显示公司名称,并以数字顺序显示顺序号: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 表名 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 FROM 表名WHERE 列名= 值
删除某行
DELETE FROM Person WHERE LastName = 'Wilson'
删除全部行
DELETE FROM table_name
DELETE * FROM table_name
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 Persons
MySQL语法:
SELECT column_name(s) FROM table_name LIMIT number
例 SELECT * FROM Persons LIMIT 5
Oracle语法:
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number
例 SELECT * FROM Persons WHERE ROWNUM <=5
语法 SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
例 选取Persons表中居住在以N开始的城市里的人
SELECT * FROM Persons WHERE City LIKE 'N%'
SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
Persons” 表中选取居住在城市不以“A” 或“L” 或“N” 开头的人:
SELECT * FROM Persons WHERE City LIKE ‘[!ALN]%'
语法:SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
例子:选取姓氏为Adams 和Carter 的人
SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')
语法:SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
注意:不一样的数据库对BETWEEN...AND 操做符的处理方式是有差别,主要体如今边界。
谁订购了产品,而且他们订购了什么产品?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons INNER JOIN Orders ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName
注意:INNER JOIN 关键字在表中至少存在一个匹配时返回行。若是"Persons" 中的行在"Orders" 中没有匹配,就不会列出这些
在表中至少存在一个匹配时,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" 中没有匹配,就不会列出这些
从左表返回全部的行,即便右表中没有匹配的行。
例 前面两张表格中中,列出全部人的定购
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
注意:左表的记录将会所有表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
会从右表(table_name2) 那里返回全部的行,即便在左表(table_name1) 中没有匹配的行 。
例 前面两张表格中中,列出全部人的定购
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
注意:右表的记录将会所有表示出来,而左表只会显示符合搜索条件的记录。左表记录不足的地方均为NULL。
只要其中某个表存在匹配,FULL JOIN 关键字就会返回。
例 前面两张表格中中,列出全部人的定购
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON 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 语句必须拥有相同数量的列。列也必须拥有类似的数据类型。同时,每条SELECT 语句中列的顺序必须相同。
UNION 语法:SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2
UNION 操做符默认选取不一样的值。若是容许重复值,请使用UNION ALL
语法:CREATE DATABASE database_name
语法: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 NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
DEFAULT
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
主键必须包含惟一的值
主键列不能包含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)
)
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_PersonID
一个表中的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_PerOrders
下面的 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_Person
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 DEFAULT
在表上建立一个简单的索引。容许使用重复的
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)
以MySQL为例,撤销索引语法
ALTER TABLE table_name DROP INDEX index_name
DROP 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
表中某个列是可选的,那么咱们能够在不向该列添加值的状况下插入新记录或更新已有记录。这意味着该字段将以NULL 值保存没法比较NULL 和0;它们是不等价的没法使用比较运算符来测试 NULL 值,好比=, <, 或者<>。必须使用 IS NULL 和IS NOT NULL 操做符例SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NULL SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NOT NULL