数据库
基础教程
SQL语法
-
数据库表
- 一个数据库通常包含一个或多个表。每个表有一个名字标识(“客户”或“订单”)。表包含带有数据的记录(行)。
-
SQL语句
-
数据库的大部分工作由SQL语句完成
-
对大小写不敏感
-
-
分号
- 某些数据库系统要求在每条语句末端使用分号
- 分号可以在对服务器相同请求中执行一条以上的语句
- MS Access和SQL Server 2000,不必在语句之后使用分号,但是某些数据库软件要求使用分号
-
SQL DML(数据库操作语言)和DDL(数据定义语言)
-
SQL(简化查询语言)是用于执行查询的语法,但SQL语言也用于跟新,插入和删除记录的语法
-
SQL
- SELSECT—从数据库表中获取数据
- UPDATE—跟新数据库表中的数据
- DELETE—聪明和数据库表中删除数据
- INSERT INTO—向数据库表中插入数据
-
DDL
- 是我们有能力创建和删除表格。也可以定义索引键,规定表之间链接,以及施加表之间的约束
- CREATE DATABASE—创建新数据库
- ALTER DATABASE—修改数据库
- CREATE DABLE—创建新表
- ALTER TABLE----变更(改变数据库表)
- DROP TABLE—删除表
- CREATE INDEX—创建索引(搜索键)
- DROP INCEX—删除索引
-
SQL SELECT
-
SELECT
-
SELSCT 列名称 FROM 表名称
- SELECT Lastname,Firstname FROM Persons
- 获取名为“lastername”和“firstname”的列的内容(从名为“persons”的数据库表)
-
-
SELSCT *
-
SELSCT * FROM 表名称
- SELSCT * FROM Persons
- 获取Persons表中所有的列的内容
-
SQL DISTINCT
- 关键词 DISTINCT 用于返回唯一不同的值
- SELECT DISTINCT 列名称 FROM 表名称
- 有无关键词的区别
WHERE
- 有条件的从表中选取数值
- SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
- 注意:某些版本中,<> 可以写为 !=
- 只希望选取在 “Beijing” 的人 :SELSCT * FROM Persons WHERE City=’Beijing‘
- 引号的使用:单引号来环绕文本值(大部分数据库系统也接受双引号),数值不用引号
AND & OR 运算符
- 用于基于一个以上的条件对记录进行过滤
- AND 和 OR 可以在where 子语句中把一个以上条件结合起来,如果前后条件都成立,AND运算符显示一条记录,如果只有一个条件成立,OR运算符显示一条记录
- AND运算符实例
- OR运算符实例
- AND 和 OR 结合(注意小括号)
ORDER BY 语句
-
作用
- 用于根据指定的列队结果集进行排序
- 默认按照升序对记录进行排序
- 降序可以使用DESC
-
原始表
-
SELECT Compay ,Ordermunber FROM Order order by Compay --------以字母顺序显示公司名称
-
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber------以字母顺序显示公司名称,以数字顺序显示顺序号
-
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC----------以逆字母顺序显示公司名称
-
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC---------以逆字母顺序显示公司名称,以数字顺序显示顺序号
- 注意:以上的结果中有两个相等的公司名称。只有这一次,二列是以升序排序的,一列值为null时,情况也是这样的
INSERT INRO
-
作用
- 向表格中插入新的列
-
语法
-
INSERT INTO 表名称 VALUES (值1,值2,…)
-
INSERT INTO 表名称(列1,列2,…)VALUES (值1,值2,…)
-
插入新的行
- INSERT INTO Persons VALUES (‘Gates’, ‘Bill’, ‘Xuanwumen 10’, ‘Beijing’)
-
在指定的列中插入信息
- INSERT INTO Persons (LastName, Address) VALUES (‘Wilson’, ‘Champs-Elysees’)
-
UP DATE
-
作用
- 用于修改表中的数据
-
语法
- UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
-
更新某行某列
- UPDATE Person SET FirstName = ‘Fred’ WHERE LastName = ‘Wilson’
-
更新某行某好几列
- UPDATE Person SET Address = ‘Zhongshan 23’, City = ‘Nanjing’ WHERE LastName = ‘Wilson’
DELETE
-
作用
- 用于删除表中的行
-
语法
-
DELETE FROM 表名称 WHERE 列名称 = 值(删除某行)
-
DELETE FROM 表名称 (或DELETE * FROM 表名称)----------删除所有行(清空/重置表)
-
高级教程
TOP子句
-
作用
- 规定要返回的记录数
- 并非所有数据库系统都支持TOP子句
-
MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的
-
MYSQL 语法
- SELECT 列名 FROM 表名 LIMIT 数量
-
ORACLE 语法
- ESELECT 列名 FROM 表名 WHERE ROUNUM( 行) <= number(数量)
-
-
SQL SERVER 语法
- SELECT TOP number(数量) | percent column_name(s) (列名) FROM table_name( 表名)
- “ | ”:表示“或者”
-
实例
- 原始的表
- SQL TOP 选取头两条数据: SELECT TOP2 * FROM Persons
- SQL TOP PERECENT 选取50%数据 : SELSECT TOP 50 PERCENT * FROM Persons
LINk 操作符
-
作用
-
用于在 WHERE 子句中搜索列中的指定模式
-
语法
- SELECT 列名
FROM 表名
WHERE 列名 LINk pattern(模式)
- SELECT 列名
-
实例
- 原始表
- 选取City表中以N开头的字符的行: SELECT * FROM Persons WHERE City LINK ‘N%’
- 选取以g结尾的: SELECT * FROM Persons WHERE City LINK ‘%g’
- 选取 City 属性中包含“ lon ” 字符的行: SELECT * FROM Person WHERE City LINK ‘%lon%’
- 选取不包含 “lon” 字符的数据 :SELECT * FROM Persons WHERE City NOT LINK ‘%lon%’
-
通配符
-
作用
- 搜索数据时,可以替代一个或多个字符
- 必须与LINK运算符一起使用
-
包括
- %:代表零个或多个字符
- _ :只代表一个字符
- [charlist] : 代表列中任何单一字符
- [^charlist] 或 [!charlist]:不在字符列中的任何单一字符
-
实例
-
原始表
-
%通配符
- 在Persons表中寻找以“N”开头的数据
- 寻找有“lond”字符的数据
-
_ 通配符
- 在表中选取第一个字符之后是“eorge”的数据: SELECT * FROM Persons WHERE FirstName LINk ‘_eorge’
- 在Persons表中选取以C开头,期间有任意字符的人:SELECT * FROM Persons WHERE LastName LINk ‘C_r_er’
-
charlist通配符
- 在City表中选取任意以‘A’‘L’‘N’开头的数据:SELECT * FROM Persons WHERE City LINK ’ [ALN]% ’
- 在City表中选取任意不以‘A’‘L’‘N’开头的数据:SELECT * FROM Persons WHERE City LINK ’ [!ALN]% ’ 或 ‘[^ALN]%’
-
IN 操作符
-
作用
- 允许在WHERE子句中规定多个值
-
语法
- SELECT 列明 FROM 表名 WHERE 列名 IN (数据1,2,3…)
-
实例
- 原始表
- 在 LastName 列中选取数值为’Adams’和’Carter’的数据:SELECT * FROM Persons WHERE LastName (’ Adams ‘,’ Carter ')
BETWEEN操作符
-
作用
- 在WHERE子句中使用,选取介于两个值之间的范围
-
语法
- SELECT 列名
FROM 表名
WHERE 列名
BETWEEN 值1 AND 值2
- SELECT 列名
-
实例
-
原始表
-
以字母顺序显示介于’Adams’(包括)和’Carter’(不包括)之间的人:
SELECT * FROM Persons WHERE LastName BETWEEN ‘Adams’ AND ‘Arter’- 注意:不同的数据库在使用此操作符是有差异的有些事开区间,有些是闭区间,有些是左闭右开,有些是左开右闭
-
使用上面的例子显示范围之外的数据:CELECT * FROM Persons WHERE LastName NOT BETWEEN ‘Adams’ AND ‘Arter’
-
ALias(别名)
-
作用
- 可以为列名称和表名称指定别名
-
语法
-
列名称
- SELECT 列名 AS 别名 FROM 表名
-
表名称
- SELECT 列名 FROM 表名 AS 别名
-
-
实例
-
表名称别名
- 分别为两个表指定别名并列出表中数据:
SELECT po.orderID , p.LasterName , p.FirstName
FROM Person AS p , Project_orders AS po
WHERE p.LastName = ‘Asams’ AND p.FirstName = ‘John’
- 分别为两个表指定别名并列出表中数据:
-
列名称别名
- 原始表
- SELECT LastName AS Family , FirstName AS Name FROM Persons
-
JOIN
-
作用
- 用于两个或多个表中的列之间的关系,从这些表中查询数据
-
JOIN 和 KEY
- 有时为了得到完整的结果,我们需要从两个或者更多的表中获取数据,
- 数据库中可通过键将数据连通起来。主键(Primary key)是一个列,在这个列中的每一行都是唯一的。在表中,每个主键的值都是唯一的。目的是在不重复每一个表中所有书局的情况下,把矫健的数据交叉捆绑在一起
- 一个表中没有相同的两个主键名称
-
引用两个表
- 原始数据
- 谁订购了产品,并订购了什么产品:
SELECT Persons.LastName , Persons.FirstName , Orders.OrderNo
FROM Persons , Orders
WHERE Persons.Id_p = Orders.Id_p
-
JOIN
- SELECT Persons.LastName , Persons.FirstName , Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_p = Orders.Id_p
ORDER BY Persons.LastName
- SELECT Persons.LastName , Persons.FirstName , Orders.OrderNo
-
不同的SQL JOIN
-
INNER JOIN----内连接
-
语法
-
SELECT 列名
FROM 表名
INNER JOIN 表名2
ON 表名.列名 = 表名2.列名2- 注意 : INNER JOIN 与 JOIN 是相同的
-
-
实例
- 原始数据
- 希望列出所有人的订购
-
-
JOIN----至少有一个匹配,则返回行
-
LEFT JOIN----即使右表中没有匹配,也从左表返回所有的行
-
语法
-
关键字会从左表中返回,即使在右表中没有匹配的行
-
SELECT 列名
FROM 表名
LEFT JOIN 表名2
ON 表名1.列名1 = 表名2.列名2- 注意: 在某些数据库中 LIEFT JOIN 被称为 LEFT OUTER JOIN
-
-
实例
- 原始数据
-
列出所有的人,以及他们的订购(如果有的话):
SELECT Persons.LastName , Person.FirstName , Order.OrderNo
FROM Persons LEFT JOIN Orders
ON Persons.Id_p = Order.Id_p
ORDER BY Persons.LastName
-
-
RIGHT JOIN----即使左表中没有匹配,也从右表中返回所有的行
-
将 LEFT JOIN 中所有 LEFT 换成 RIGHT 即可
-
实例
- 列出所有的订单,以及订购的人(如果存在的话):
SELECT Persons.LastName , Persons.FirstName , Orders.OrderNo
FROM Persons RIGHT JOIN Orders
ON Persons.Id_p = Order.Id_p
ORDER BY Persons.FirstName
- 列出所有的订单,以及订购的人(如果存在的话):
-
-
FULL JOIN ----只要有一个表中有匹配,就返回行
-
语法
-
SELECT 列名 (s)
FROM 表名1 NULL JOIN 表名2
ON 表名1.列名1 = 表名2.列名2- 注意:有些数据库中 FULL JOIN 又被称为FULL OUTER JOIN
-
-
实例
-
原始数据
-
列出所有的人,所有的订单 ,以及订购者(如果存在的话):
SELECT Persons.LastName , Persons.FirstName , Orders.OrderNo
FROM Persons FULL JOIN Orders
ON Persons.Id_p = Order.Id_p
ORDER BY Persons.LastName- 注意:不管事左表还是右表,只要任意一表中存在数据,就会被列出
-
-
-
SQL UNION 和 UNION ALL 操作符
-
作用
- 用于并和两个或者多个 SELECT 语句的结果集
- 注意:UNION 内部的 SELECT 语句必须拥有相同数据量的列,列也必须拥有相同数量的数据类型。同时每条SELECT 语句中的列的顺序必须相同
-
语法
-
SQL UNION 语法
-
SELECT 列名(s) FROM 表名1
UNION
SELECT 列名2(s)FROM 表名2- UNION 操作符默认选取不同的值 ,如果允许值重复 使用 SELECT ALL
-
-
SQL UNION ALL 语法
-
SELECT 列名(s) FROM 表名
UNION ALL
SELECT 列名2(s)FROM 表名2- UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 中的列名
-
-
-
实例
- 原始数据
- UNION,列出所有在中国和美国不同的雇员名:
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA - UNION ALL , 列出美国和中国的所有的雇员:
SELECT E_Name FROM Employes_China
UNION ALL
SELECT E_Name FROM Employes_USA
SQL SElECT INTO 语句
-
作用
- 可用于创建表的备份复件
- 从一个表中选取数据,然后把数据插入另一个表中
- 常用于创建表的备份复件或对记录进行存档
-
语法
-
把所有的列表插入新表
- SELECT * INTO new_table_name(新表名) IN externaldatabase
FROM old_table_name(旧表名)
- SELECT * INTO new_table_name(新表名) IN externaldatabase
-
只把希望的列表插入新表
- SELECT column_name(s) (列名)
INTO new_table_name (新表名) IN exernaldatabase
FROM old_table_name(旧表名)
- SELECT column_name(s) (列名)
-
-
实例
-
制作备份复件
- 制作 Persons 表的备份复件:
SELECT * INTO Persons_backup
FROM Persons - IN 子句向另一个数据库中拷贝表:
SELECT * INTO Persons [ IN ‘Backup.mdb’]
FROM Persons - 拷贝某些域:
SELECT LastName ,FirstName
INTO Persons_backup
FROM Persons
- 制作 Persons 表的备份复件:
-
可带有 WHERE 子句
-
通过“Persons”表中住在“Beijin”的人的信息,并将数据存入新建立的有两个列的新表“Persons_backup”
- SELECT LastName , FirstName
INTO Persons_backup
FORM Persons
WHERE City = ‘Beijing’
- SELECT LastName , FirstName
-
-
被连接的表
-
创建一个名为“ 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
- SELECT Persons.LastName , Orders.OrderNo
-
-
SQL CREATE DATABASE 语句
-
作用
- 用于创建数据库
-
语法
- CREATE DATABASE database_name(新数据库名)
-
实例
-
创建一个名为 “ my_db ” 的数据库:
CRESTE DATABASE my_db- 可以用:
CEREATE TABLE
来添加数据库表
- 可以用:
-
CREATE TABLE 语句
-
用法
- 用于创建数据库中的表
-
语法
-
CREATE TABLE 表名称
(
列表1,数据类型
列表2,数据类型
…
) -
数据类型
-
仅容纳整数。在括号内规定数字的最大位
- integer(size)
int (size)
smallint(size)
tinyint(size)
- integer(size)
-
容纳带有小数的数字。
size–规定最大位数 , d—规定小数点优则的最大位数- decimal(size,d)
numerice(size,d)
- decimal(size,d)
-
然固定长度的字符串(可以容纳字母、数字、特殊字符)。在括号中规定字符长度
- char(size)
-
容纳可变长度的字符串(可容纳字母、数字、特殊字符)。括号中规定字符串的最大长度
- varchar(size)
-
容纳日期
- date(yyyymmdd)
-
-
-
实例
-
创建名为“persons”的表。包含五个列“Id_p”“LastName”“FirstName”“Address”“City”
- CREATE Table Persons
(
Id_p varchar(255) ,
LastName varchar(255) ,
FirstNmae varchar(255) ,
City varchar(255) ,
)
- CREATE Table Persons
-
SQL 约束
-
作用
- 用于限制加入表的数据的类型
- 创建表时规定约束(通过CREATE TABLE 语句),或在创建表之后也可以(通过 ALTER TABLE 语句)
-
约束种类
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGH KEY
- CHECK
- DEFAULT
-
NOT NULL
-
作用
- 强制约束列不接受NULL值
- 强制约束字段始终包含值。如果不向字段添加值,就无法插入新纪录或更新记录
-
实例
-
强制“Id_p”“LastName”列不接受NULL值
- CREATE TABLE Persons
(
Id_p int NOT NULL ,
LastName varchar(255) NOT NULL ,
FirstName varchar(255) NOT BULL ,
Adress varchar(255) NOT NULL ,
City varchar(255) NOT NULL ,
)
- CREATE TABLE Persons
-
-
-
UNIQUE
-
作用
- 唯一标识数据库中的每条记录
- UNIQUE 和 PRINMARY KEY 约束均为列或列集合提供了唯一性的保证
- PRIMARY KEY 拥有自动定义的 UNIQUE 约束
- 注意!!:每个表可以有多个UNIQUE约束 但只能有一个PRIMARY KEY 约束
-
语法
-
SQL UNIQUE Concentrate on CREATE TABLE
-
SQL 在“Persons”表创建时在“Id_p”创建UNIQUE 约束
-
MYSQL
- CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT ALL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (Id_p),
)
- CREATE TABLE Persons
-
SQL Server / Qracle / 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)
)
- CREATE TABLE Persons
-
-
如果需要命名 UNIQUE 约束 , 以及为多个列定义 UNIQUE 约束
-
MySQL / SQL Server / Oracle / MS Access:
- REATE 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)
)
- REATE TABLE Persons
-
-
-
SQL UNIQUE Constraint on ALTER TABLE
-
表已经被创建,如需在 “Id_p” 列创建 UNIQUE 约束
-
MySQL / SQL Server / Oracle / MS Access:
- ALTER TABLE Persons
ADD UNIQUE ( Id_p )
- ALTER TABLE Persons
-
-
如需重命名 UNIQUE 约束 ,并定义多个UNIQUE 约束
-
MySQL / SQL Server / Oracle / MS Access:
- ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID INIQUE (Id_p , LastName)
- ALTER TABLE Persons
-
-
-
撤销 UNIQUE 约束
-
MYSQl
- ALTER TABLE Persons
DROP INDEX uc_PersonID
- ALTER TABLE Persons
-
SQL Server / Oracle / MS Access:
- ALTER TABLE Persons
DROP CONSTRAINT uc_PersonID
- ALTER TABLE Persons
-
-
-
-
PRIMARY KEY 约束
-
作用
- 唯一标识数据库表中的每条记录
- 主键必须包含唯一的值
- 逐渐不能包含NULL值
- 每一个表都应该有一个主键,并且只有一个主键
-
PRIMARY KEY Constraint on CREATE TABLE
-
在 Persons 表创建时在“Id_P” 列创建PRIMARY KEY 约束
-
MySQL
- CREATE TABLR 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 TABLR Persons
-
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)
)
- CREATE TABLE Persons
-
-
命名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 pk_PersonID PRIMARY KEY (Id_P,LastName)
)
- CREATE TABLE Persons
-
-
-
PRIMARY KEY Constraint on ALTER TABLE
-
如果表在已存在的情况下对 “Id_P” 创建约束
-
MySQL / SQL Server / Oracle / MS Access:
- ALTER TABLE Persons
ADD PRIMARY KEY (Id_p)
- ALTER TABLE Persons
-
-
如果需要命名约束,以及需要定义多个列的约束
-
MySQL / SQL Server / Oracle / MS Access:
-
ALTER TABLE Persons
ADD CONSTERAINT pk_ PeronID PRIMARY KET ( Id_p , LastName)- 注意!!:如果使用ALTER TABLE 添加主键,则逐渐必须在创建时就为不包含NULL值(NOT NULL)
-
-
-
-
撤销PRIMARY KEY 约束
-
MySQL
- ALTER TABLE Persons
DROP PRIMARY KEY
- ALTER TABLE Persons
-
SQL Server / Oracle / MS Access
- ALTER TABLE Persons
DROP PRIMARY KEY (主键名称)
- ALTER TABLE Persons
-
-
-
FOREIGN KEY 约束
-
作用
- 一个表中的 FORRIGN KEY 指向另一个表中的 PRIMARY KEY
-
实例
-
原始数据
- 注意!!:“Orders”中的Id_p列指向“Persons”中的Id_p列
- Persons中的Id_p是此表中的PRIMARY KEY
- Orders 表中的Id_p是此表中的FORDIGN KEY
- FOREIGN KEY 用于预防破坏表之间的连接动作。也能防止非法数据插入外键列因为它必须是它指向的那个表中的值之一
-
FOREIGN KEY Constraint on CRESTE TABLE
-
在创建表时,为某列创建约束
-
MySQL
- CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_p int ,
PRIMAY KEY (Id_0)
GROEIGN KEY (Id_p) REFERENCES Persons(Id_p)
)
- CREATE TABLE Orders
-
SQL Server / Oracle / MS Access:
- CREATE TABLE Orders
(
Id_O int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
)
- CREATE TABLE Orders
-
-
命名约束,并为多个列创建约束
-
MySQL / SQL Server / Oracle / MS Access
- CREATE TABLE Orders
(
Id_O int NOT NULL
OderNO int NOT NULL
Id_p int
CONSTRATINT fk_PerOders FOREIGN KEY(Id_p)
REFERENCES Persons(Id_p)
)
- CREATE TABLE Orders
-
-
-
FOREIGN KEY Constraint on ALTER TABLE
-
在表已经创建的情况下为某列创建约束
-
MySQL / SQL Server / Oracle / MS Access:
- ALTER TABLE
(
ADD FOREIGN KEY (Id_p)
REFERENCES Persons(Id_p)
)
- ALTER TABLE
-
-
命名约束,并为多个列创建约束
-
MySQL / SQL Server / Oracle / MS Access:
- ALTER TABLE
(
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_p)
REFERENCES Persons(Id_p)
)
- ALTER TABLE
-
-
-
撤销约束
-
MySQL
- ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders
- ALTER TABLE Orders
-
SQL Server / Oracle / MS Access:
- ALTER TABLE Orders
DROP CONSTRAINT fk_PerOrders
- ALTER TABLE Orders
-
-
-
-
CHECH 约束
-
作用
- 用于限制列中的值的范围
- 对单个列定义约束,那么这个列只允许特定的值(白名单)
- 如果对一个表定义约束,那么约束会在特定的列中对值进行限制
-
CHECK Consteaint on CREATE TABLE
-
在创建表时对某列创建CHECK约束,规定此列只包含大于0的整数
-
MySQL
- CREATE TABLE Persons
(
Id_p int NUT NULL
LastName varchar(255) NUT NULL,
FirstName varchar(255) NUT NULL,
Address varchar(255) ,
City varchar(255),
CHECK ( Id_p > 0 )
)
- CREATE TABLE Persons
-
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)
)
- CREATE TABLE Persons
-
-
如果需要命名约束,以及为多个列定义约束
-
MySQL / SQL Server / Oracle / MS Access:
- CREATE TABLE
(
Id_p int NOT NULL ,
LastName varchar(255) NOT NULL ,
FirstName varchar(255) ,
Address varcgar(255) ,
City varchar,
CONSTRAINT chk_Person CHECK (Id_p > 0
AND City = ’ Sandnes’)
)
- CREATE TABLE
-
-
-
CHECK constraint on ALTER TABLE
-
在表已经存在的情况下为某列创捷 CHECK 约束
-
MySQL / SQL Server / Oracle / MS Access:
- ALTER TABLE Persons
ADD CHECK (Id_p > 0)
- ALTER TABLE Persons
-
-
命名约束并为多个列定义约束
-
MySQL / SQL Server / Oracle / MS Access:
- ALTER TABLE Persons
ADD CONSTRAINT chk_Persons CHECK (Id_p > 0 , City = ‘Sandes’)
- ALTER TABLE Persons
-
-
-
撤销约束
-
SQL Server / Oracle / MS Access:
- ALTER TABLE Persons
DROP CONSTRAINT chk_Person
- ALTER TABLE Persons
-
MySQL
- ALTER TABLE Persons
DROP CHECK chk_Person
- ALTER TABLE Persons
-
-
-
DEFAULT 约束
-
作用
- 用于向列中插入默认值
- 若没有规定其他值会将默认值添加到所有的新纪录
-
DEFAULT conatraint on CREATE TABLE
-
在表创建时为某列创捷DEFAULT 约束
-
My SQL / SQL Server / Oracle / MS Access:
- CREATE TABLE Persons
(
Id_p int NOY NULL,
FirstName varchar(255) NOT NULL ,
LastName varchar(255) ,
Address varchar(255) ,
City varchar (255) , DEFRAULT ‘Sandes’
)
- CREATE TABLE Persons
-
-
通过使用 类似 GETDATE()这样的函数值 , DEFAULT 也可以用于插入系统值
- CREATE TABLE Orders
(
Id_p int NOT NULL ,
OrderNo int NOT NULL,
Id_p int ,
OrderDate date DEFAULT GETDATE()
)
- CREATE TABLE Orders
-
-
DEFAULT conatraint on ALTER TABLE
-
在表已经存在的情况下为某列创建约束
-
Mysql
- ALTER TABLE Persons
ALter City SET DEFAULT ’ SANDNES ’
- ALTER TABLE Persons
-
SQL Server / Oracle / MS Access:
- ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT ‘SANDNES’
- ALTER TABLE Persons
-
-
-
撤销约束
-
MySQL
- ALTER TABLE Persons
ALTER City DROP DEFAULT
- ALTER TABLE Persons
-
SQL Server / Oracle / MS Access:
- ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT
- ALTER TABLE Persons
-
-
CREATE INDEX 语句
-
作用
- 用于在表中创建索引
- 在不读取整个表的情况下,索引数据库应用程序可以更快的查找数据
-
索引
-
可以在表中创建索引以便更阿吉快速高效的查询数据
-
用户无法看到索引,只能用来加速查找/查询
-
注释:
- 更新一个包含索引的表需要比更新一个没有索引的表更多的时间,因为所有本身也需要更新。
因此理想的做法是仅在常常被搜索的列(以及表)上创建索引
- 更新一个包含索引的表需要比更新一个没有索引的表更多的时间,因为所有本身也需要更新。
-
-
语法
-
在表上创建一个简单的索引。允许使用重复的值
- CREATE INDEX index_name
ON table_name ( column _name ) - 注释:colummn_ name 规定需要索引的列
- CREATE INDEX index_name
-
在表上创建一个唯一的索引。意味着两个行不能拥有相同的索引值
- CREATE UNIQUE INDEX index_name
ON table_name (column_name )
- CREATE UNIQUE INDEX index_name
-
-
实例
-
创建一个“Index‘_Pers” , 在Persons 表的LastName列
- CREATE INDEX Index_Pers
ON Persons(LastName)
- CREATE INDEX Index_Pers
-
降序索引某个列表的值,在列名后加DESC
- CREATE INDEX Index_Pers
ON Persons (LastName DESC)
- CREATE INDEX Index_Pers
-
索引不止一个列,列出列的名称用都很高隔开
- CREATE INdDEX Index_Pres
ON Persons (LastName , FirstName)
- CREATE INdDEX Index_Pres
-
DROP 删除表 ,索引 , 数据库
-
作用
- 删除表 ,索引 , 数据库
-
语法
-
删除表格中的索引
-
用于 Microsoft SQLJet (以及 Microsoft Access) 的语法:
- DROP INDEX index_name ON Table_name
-
用于 MS SQL Server 的语法:
- DROP INDEX table_name.index_name
-
用于 IBM DB2 和 Oracle 语法:
- DROP INdEX index_name
-
MySQL
- ALTER TABLE table_name DROP INDEX index_name
-
-
删除表格
- DROP TABLE table_name
-
删除表中的数据,但不删除表本身(清空/重置表格)
- TRUNCATE TABLE table_name
-
ALTER TABLE 语句
-
作用
- 用于在已有的表中添加、修改、删除列
-
语法
-
在表中添加列
- ALTER TABLE table_name(表名)
ADD column_name(列名) datatype(数据类型)
- ALTER TABLE table_name(表名)
-
在表中删除列
- ALTER TABLE table_name
DROP COLUMN column_name - 注意!!:某些数据库不允许这种在数据库表中删除列的方式(DROP COLUMN column_name)
- ALTER TABLE table_name
-
改变表中的数据类型
- ALTER TABLE table_name
ALTER COLUMN column_name(列名)
- ALTER TABLE table_name
-
-
实例
-
原始数据
-
在Persons中添加一个birthday的新列
- ALTER TABLE Persons
ADD birthday date - date类型可以存储时间
- ALTER TABLE Persons
-
改变Persons中birthday的数据类型
- ALTER TABLE Persons
ALTER COLUNM Birthday year - year 存放两位或是四位格式的年份
- ALTER TABLE Persons
-
删除birthday 列
- ALTER TABLE Persons
DROP COLUNM Birthday
- ALTER TABLE Persons
-
AUTO INCREMENT 字段
-
作用
- 在新纪录插入表中时生成一个唯一的数字
- 我们通常希望在每次插入新纪录时,自动的创建主键字段的值,可以在表中创建一个auto_increment 字段
-
语法
-
把 Persons 中的 ID_p 列定义为 auto_increment 主键
-
CELECT TABLE Persons
(
P_ID int NOT NULL AUTO_INCREMENT,
LastName Verchar(255) NOT NULL,
FirstName Verchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_ID)
)-
MYSQL 使用 AUTO_INCREMENT 来实现auto-increment 任务
-
默认的,其开始值是1,每条记录递增1
-
要是其一其他的只起始
- ALTER TABLE table_name AUTO_INCREMENT =100(起始数字)
-
-
SQL VIEW (视图)
-
作用
- 视图中的字段来自数据库中多个表的数据,可以添加SQL函数以及 where、join 语句,也可以提交数据,就像来自于某一个单一的表
-
语法
-
CREATE VIEW view_name(视图名) AS
SELECT column_name(s)
FROM table_name
WHERE condition- s视图重视显示最近的数据,每当用户查询视图时,数据库引擎通过使用SQL 语句来重建数据
-
-
实例
-
样本数据库Northwind 拥有一些被默认安装的视图,视图[Current Product List],会从Products表中列出所有正在使用的产品
- CREATE VIEW [Current Product List] AS
SELECT PeoductID ,PriductName
FROM Products
WHERE Ddicontinued=No - 查询上面创建的视图:
SELECT * FROM [Current Product List]
- CREATE VIEW [Current Product List] AS
-
另一个样本数据库会选取 Products 表中所有单位加个高于平均单位的产品
-
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName -
查询上面的视图:
SELECT * FROM [ Product Sales for 1997 ]
-
-
更新视图
-
可以添加查询条件,如仅需查看“Becerages”的全部销量
- SELECT * FROM [ Category Sales for 1997]
WHERE CategoryName = ‘Beverages’
- SELECT * FROM [ Category Sales for 1997]
-
-
CREATE OR REPLACE VIEW view_name
AS
SELECT colunm_name(s)(列名(可多选))
FROM table_name(表名)
WGERE condition(条件)
- 撤销视图
- DROP VIEW view_name(视图名)
DATE
-
作用
- 显示日期
- 当我们处理日期时,最难的任务恐怕是确保所插入的日期的格式,与数据库中日期列的格式相匹配。
只要数据包含的只是日期部分,运行查询就不会出问题。但是,如果涉及时间,情况就有点复杂了。
在讨论日期查询的复杂性之前,我们先来看看最重要的内建日期处理函数。
-
数据类型
- ySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
YEAR - 格式 YYYY 或 YY
- ySQL 使用下列数据类型在数据库中存储日期或日期/时间值:
NULL
-
SQL IS NULL
-
仅仅选取在列中带有NULL的记录
- SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL
- SELECT LastName,FirstName,Address FROM Persons
-
-
SQL IS NOT NULL
-
在列中选取不带有NULL 值的记录
- SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
- SELECT LastName,FirstName,Address FROM Persons
-
-
MySQL中也有类似 IS NULL() 的函数
-
IF NULL()
- SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
- SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
-
COALESCE()
- SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products
- SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))
-
SQl函数
总结
快速参考
-
AND / OR
- SELECT colunm_name(s)
FROM table_name
WEHERE condition
AND|OR condition
- SELECT colunm_name(s)
-
ALTER TABLE (add column)
- ALTER TABLE table_name
ADD column_name datetype
- ALTER TABLE table_name
-
ALTER TABLE(drop column)
- ALTER TABLE table_name
DROP COLUMN column_name
- ALTER TABLE table_name
-
AS(alias for column)(列的别名)
- SELECT column_name AS column_alias
FROM table_name
- SELECT column_name AS column_alias
-
AS(alisa for table)
- ESLECT table_name AS table_alias
-
BETWEEN
- SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN valuel1 AND value2
- SELECT column_name(s)
-
CREATE DATABASE
- CREAT DATABASE database_name
-
CREATE INDEX
- CREATE INDEX index_name
ON table_name(column_name)
- CREATE INDEX index_name
-
CREATE UNIQUE INDEX
- CREATE UNIQUE INDEX index_name
ON table_name(column_name)
- CREATE UNIQUE INDEX index_name
-
CREATE VIEW
- CREATE VIEW view_name
AS
SELECT column_name(s)
FROM table_name
EHERE condition
- CREATE VIEW view_name
-
DELETE FROM
-
DELETE FROM table_name
(NOTE:Deletes the entire table!!)
OR
DELETE FROM table_name
WHERE condition数据库中的delete 与drop的区别, 从下面的例子开始:
delete : delete from 表名 where 条件
drop : alter table 表名 drop 字段
drop table 表有的同学从从上面的例子,可以看出来, delete 删除的是 数据,drop删除的是表;这个没错, 但是, delete 和 drop 还有其他的区别,如下:
delete:
1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。
2、delete可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录。
3、delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。
drop:
1、drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。2、drop语句删除表结构及所有数据,并将表所占用的空间全部释放。
3、drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。
所以:
1、在速度上,一般来说,drop> delete。
2、在使用drop时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。
3、如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;如果和事务有关,或者想触发trigger,还是用delete
4、如果想删除表,当然用drop;
-
-
DROP DATABASE
- DROP DATABASE database_name
-
DROP UNDEX
- DROP INDEX table_name.index_name
-
DROP TABLE
- DROP TABLE table_name
-
GROUP BY
- SELECT column_name1,SUM(Solumn_name2)
FROM table_name
GROUP BY column_name1
- SELECT column_name1,SUM(Solumn_name2)
-
HAVING
- SELECT column_name(s) SUM ( column_name2)
FROM table_name
FROUP BY column_name1
HAVING SUM(column_name2) condition value
- SELECT column_name(s) SUM ( column_name2)
-
IN
- SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,…)
内容来源
- SELECT column_name(s)
素材来源:
W3schools
1774

被折叠的 条评论
为什么被折叠?



