SQL学习-数据库语言
2020-02-28 10:44:09 0 举报
AI智能生成
SQL教程
作者其他创作
大纲/内容
4.SQL函数
5.SQL总结
1.SQL简介
什么是SQL<br>
SQL 指结构化查询语言
SQL 使我们有能力访问数据库
SQL 是一种 ANSI 的标准计算机语言(ANSI,美国国家标准化组织)
SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。<br>
SQL能做什么
SQL 面向数据库执行查询
SQL 可从数据库取回数据
SQL 可在数据库中插入新的记录
SQL 可更新数据库中的数据
SQL 可从数据库删除记录
SQL 可创建新数据库
SQL 可在数据库中创建新表
SQL 可在数据库中创建存储过程
SQL 可在数据库中创建视图
SQL 可以设置表、存储过程和视图的权限
RDBMS<br>
RDBMS 指的是关系型数据库管理系统<br>
RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础
MS SQL Server<br>
IBM DB2
Oracle
MySQL
Microsoft Access
RDBMS 中的数据存储在被称为表(tables)的数据库对象中<br>
表是相关的数据项的集合,它由列和行组成
数据库表
重要事项
SQL对大小写不敏感
分号是在数据库系统中分隔每条 SQL 语句的标准方法<br>
如果使用 MS Access 和 SQL Server 2000,则不必在每条 SQL 语句之后使用分号,<br>
2.SQL基础教程
SQL分类<br>
数据操作语言 (DML)
SELECT - 从数据库表中获取数据
UPDATE - 更新数据库表中的数据<br>
DELETE - 从数据库表中删除数据
INSERT INTO - 向数据库表中插入数据
数据定义语言 (DDL)
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
SQL SELECT 语句
用法:SELECT 语句用于从表中选取数据,结果被存储在一个结果表中(称为结果集)
SQL SELECT 语法
SELECT 列名称 FROM 表名称
SELECT * FROM 表名称<br>
SQL SELECT 实例<br>
样例表
<br>
如需获取名为 "LastName" 和 "FirstName" 的列的内容(从名为 "Persons" 的数据库表)
SELECT LastName,FirstName FROM Persons<br>
结果
现在我们希望从 "Persons" 表中选取所有的列
SELECT * FROM Persons<br>
结果
SQL SELECT DISTINCT 语句
用法:关键词 DISTINCT 用于返回唯一不同的值<br>
SQL SELECT DISTINCT 语法
SELECT DISTINCT 列名称 FROM 表名称<br>
SQL SELECT DISTINCT 实例
样例表
如果要从 "Company" 列中选取所有的值,我们需要使用 SELECT 语句<br>
SELECT Company FROM Orders<br>
如需从 Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句<br>
SELECT DISTINCT Company FROM Orders
SQL WHERE 子句
用法:WHERE 子句用于规定选择的标准<br>
SQL WHERE 子句语法
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值<br>
引号的使用
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)
如果是数值,请不要使用引号<br>
运算符
SQL WHERE 子句实例
样例表
<br>
如果只希望选取居住在城市 "Beijing" 中的人,我们需要向 SELECT 语句添加 WHERE 子句<br>
SELECT * FROM Persons WHERE City='Beijing'
<br>
SQL AND & OR 运算符
用法:AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录<br>
SQL AND & OR 运算符实例
样例表
<br>
AND 运算符实例<br>
使用 AND 来显示所有姓为 "Carter" 并且名为 "Thomas" 的人
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
OR 运算符实例
使用 OR 来显示所有姓为 "Carter" 或者名为 "Thomas" 的人<br>
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'<br>
结合 AND 和 OR 运算符
使用AND 和OR来显示姓为"Carter" 并且名为 "Thomas" 或者名为"William"的人<br>
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William')<br>AND LastName='Carter'<br>
SQL ORDER BY 子句<br>
用法:ORDER BY 语句用于对结果集进行排序
ORDER BY 语句用于根据指定的列对结果集进行排序
ORDER BY 语句默认按照升序对记录进行排序<br>
如果希望按照降序对记录进行排序,可以使用 DESC 关键字<br>
SQL ORDER BY 子句实例<br>
样例表
<br>
以字母顺序显示公司名称
SELECT Company, OrderNumber FROM Orders ORDER BY Company
以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber)<br>
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber<br>
以逆字母顺序显示公司名称<br>
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
以逆字母顺序显示公司名称,并以数字顺序显示顺序号<br>
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
SQL INSERT INTO 语句<br>
用法:INSERT INTO 语句用于向表格中插入新的行
SQL INSERT INTO 语句语法
INSERT INTO 表名称 VALUES (值1, 值2,....)<br>
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)<br>
SQL INSERT INTO 语句实例
样例表
插入新的行
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')<br>
在指定的列中插入数据
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
SQL UPDATE 语句
用法:Update 语句用于修改表中的数据
SQL UPDATE 语句语法
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值<br>
SQL UPDATE 语句实例
样例表
更新某一行中的一个列<br>
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' <br>
更新某一行中的若干列<br>
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'<br>WHERE LastName = 'Wilson'<br>
SQL DELETE 语句<br>
用法:DELETE 语句用于删除表中的行
SQL DELETE 语句语法
DELETE FROM 表名称 WHERE 列名称 = 值
SQL DELETE 语句实例
样例表
删除某行
DELETE FROM Person WHERE LastName = 'Wilson'
删除所有行<br>
DELETE FROM table_name<br>
DELETE * FROM table_name
3.SQL高级教程<br>
SQL TOP 子句<br>
作用:TOP 子句用于规定要返回的记录的数目。对于拥有数千条记录的大型表来说,TOP 子句是非常有用的<br>
并非所有的数据库系统都支持 TOP 子句
SQL TOP 子句语法
SELECT TOP number|percent column_name(s)FROM table_name
MySQL 语法<br>
SELECT column_name(s)<br>FROM table_name<br>LIMIT number
Oracle 语法<br>
SELECT column_name(s)<br>FROM table_name<br>WHERE ROWNUM <= number
SQL TOP 实例<br>
样例表
从上面的 "Persons" 表中选取头两条记录
SELECT TOP 2 * FROM Persons<br>
从上面的 "Persons" 表中选取 50% 的记录
SELECT TOP 50 PERCENT * FROM Persons
SQL LIKE 操作符
作用:LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式
SQL LIKE 操作符语法
SELECT column_name(s)<br>FROM table_name<br>WHERE column_name LIKE pattern<br>
SQL LIKE 操作符实例
样例表
从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人<br>
SELECT * FROM Persons<br>WHERE City LIKE 'N%'
"%" 可用于定义通配符(模式中缺少的字母)
从 "Persons" 表中选取居住在以 "g" 结尾的城市里的人
SELECT * FROM Persons<br>WHERE City LIKE '%g'
从 "Persons" 表中选取居住在包含 "lon" 的城市里的人
SELECT * FROM Persons<br>WHERE City LIKE '%lon%'
从 "Persons" 表中选取居住在不包含 "lon" 的城市里的人
SELECT * FROM Persons<br>WHERE City NOT LIKE '%lon%'<br>
SQL 通配符
作用:在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。<br>SQL 通配符必须与 LIKE 运算符一起使用。在 SQL 中,可使用以下通配符:<br>
通配符列表
SQL 通配符实例
样例表
SQL 通配符 %实例<br>
从上面的 "Persons" 表中选取居住在以 "Ne" 开始的城市里的人
SELECT * FROM Persons<br>WHERE City LIKE 'Ne%'
从 "Persons" 表中选取居住在包含 "lond" 的城市里的人
SELECT * FROM Persons<br>WHERE City LIKE '%lond%'
SQL 通配符 _ 实例
从上面的 "Persons" 表中选取名字的第一个字符之后是 "eorge" 的人
SELECT * FROM Persons<br>WHERE FirstName LIKE '_eorge'
从 "Persons" 表中选取的这条记录的姓氏以 "C" 开头,然后是一个任意字符,然后是 "r",然后是任意字符,然后是 "er"
SELECT * FROM Persons<br>WHERE LastName LIKE 'C_r_er'
SQL 通配符[charlist]实例
从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人<br>
SELECT * FROM Persons<br>WHERE City LIKE '[ALN]%'
从上面的 "Persons" 表中选取居住的城市不以 "A" 或 "L" 或 "N" 开头的人
SELECT * FROM Persons<br>WHERE City LIKE '[!ALN]%'
SQL IN 操作符
作用:IN 操作符允许我们在 WHERE 子句中规定多个值
SQL IN 语法
SELECT column_name(s)<br>FROM table_name<br>WHERE column_name IN (value1,value2,...)<br>
SELECT column_name(s)<br>FROM table_name<br>WHERE column_name IN (value1,value2,...)<br>
SQL IN 实例
样例表<br>
从上表中选取姓氏为 Adams 和 Carter 的人<br>
SELECT * FROM Persons<br>WHERE LastName IN ('Adams','Carter')
SQL BETWEEN 操作符
作用:操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期<br>
SQL BETWEEN 语法
SELECT column_name(s)<br>FROM table_name<br>WHERE column_name<br>BETWEEN value1 AND value2<br>
SQL BETWEEN 操作符实例
样例表<br>
<br>
如需以字母顺序显示介于 "Adams"(包括)和 "Carter"(不包括)之间的人<br>
SELECT * FROM Persons<br>WHERE LastName<br>BETWEEN 'Adams' AND 'Carter'
如需使用上面的例子显示范围之外的人,请使用 NOT 操作符
SELECT * FROM Persons<br>WHERE LastName<br>NOT BETWEEN 'Adams' AND 'Carter'
SQL Alias(别名)
作用:通过使用 SQL,可以为列名称和表名称指定别名(Alias)
SQL Alias 语法
表的 SQL Alias 语法
SELECT column_name(s)<br>FROM table_name<br>AS alias_name
列的 SQL Alias 语法
SELECT column_name AS alias_name<br>FROM table_name
SQL Alias 实例<br>
Alias 实例: 使用表名称别名<br>
有两个表分别是:"Persons" 和 "Product_Orders"。我们分别为它们指定别名 "p" 和 "po"。<br>现在,我们希望列出 "John Adams" 的所有定单
我们可以使用下面的 SELECT 语句
SELECT po.OrderID, p.LastName, p.FirstName<br>FROM Persons AS p, Product_Orders AS po<br>WHERE p.LastName='Adams' AND p.FirstName='John'
不使用别名的 SELECT 语句
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName<br>FROM Persons, Product_Orders<br>WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
Alias 实例: 使用一个列名别名<br>
样表
使用一个列名别名<br>
SELECT LastName AS Family, FirstName AS Name<br>FROM Persons<br>
SQL JOIN
作用:SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据
Join 和 Key<br>
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。<br>在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起<br>
JOIN类型
SQL INNER JOIN 关键字
作用: 关键字: 如果表中有至少一个匹配,则返回行
INNER JOIN 关键字语法
SELECT column_name(s)<br>FROM table_name1<br>INNER JOIN table_name2 <br>ON table_name1.column_name=table_name2.column_name<br>
内连接(INNER JOIN)实例
样例表
谁订购了产品,并且他们订购了什么产品<br>
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo<br>FROM Persons, Orders<br>WHERE Persons.Id_P = Orders.Id_P <br>
列出所有人的定购(使用 Join)<br>
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo<br>FROM Persons<br>INNER JOIN Orders<br>ON Persons.Id_P = Orders.Id_P<br>ORDER BY Persons.LastName
结果
SQL LEFT JOIN 关键字<br>
作用:LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行
LEFT JOIN 关键字语法
SELECT column_name(s)<br>FROM table_name1<br>LEFT JOIN table_name2 <br>ON table_name1.column_name=table_name2.column_name
在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN
左连接(LEFT JOIN)实例
样例表
列出所有的人,以及他们的定购 - 如果有的话<br>
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo<br>FROM Persons<br>LEFT JOIN Orders<br>ON Persons.Id_P=Orders.Id_P<br>ORDER BY Persons.LastName<br>
SQL RIGHT JOIN 关键字
作用:RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行
RIGHT JOIN 关键字语法<br>
SELECT column_name(s)<br>FROM table_name1<br>RIGHT JOIN table_name2 <br>ON table_name1.column_name=table_name2.column_name<br>
在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN
右连接(RIGHT JOIN)实例<br>
样例表
<br>
列出所有的定单,以及定购它们的人 - 如果有的话
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo<br>FROM Persons<br>RIGHT JOIN Orders<br>ON Persons.Id_P=Orders.Id_P<br>ORDER BY Persons.LastName
SQL FULL JOIN 关键字<br>
作用:只要其中某个表存在匹配,FULL JOIN 关键字就会返回行<br>
FULL JOIN 关键字语法<br>
SELECT column_name(s)<br>FROM table_name1<br>FULL JOIN table_name2 <br>ON table_name1.column_name=table_name2.column_name<br>
在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN
全连接(FULL JOIN)实例<br>
样例表
列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人<br>
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo<br>FROM Persons<br>FULL JOIN Orders<br>ON Persons.Id_P=Orders.Id_P<br>ORDER BY Persons.LastName<br>
SQL UNION 和 UNION ALL 操作符
作用:UNION 操作符用于合并两个或多个 SELECT 语句的结果集<br>UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。<br>同时,每条 SELECT 语句中的列的顺序必须相同<br>
样例表
SQL UNION 语法
SELECT column_name(s) FROM table_name1<br>UNION<br>SELECT column_name(s) FROM table_name2
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL
UNION 命令实例
列出所有在中国和美国的不同的雇员名
SELECT E_Name FROM Employees_China<br>UNION<br>SELECT E_Name FROM Employees_USA
SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1<br>UNION ALL<br>SELECT column_name(s) FROM table_name2
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名
UNION ALL 命令实例<br>
列出在中国和美国的所有的雇员<br>
SELECT E_Name FROM Employees_China<br>UNION ALL<br>SELECT E_Name FROM Employees_USA
SQL SELECT INTO 语句<br>
作用:SQL SELECT INTO 语句可用于创建表的备份复件,<br>SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中<br>
SQL SELECT INTO 语法<br>
把所有的列插入新表
SELECT *<br>INTO new_table_name [IN externaldatabase] <br>FROM old_tablename
只把希望的列插入新表<br>
SELECT column_name(s)<br>INTO new_table_name [IN externaldatabase] <br>FROM old_tablename
SQL SELECT INTO 实例<br>
制作备份复件
制作 "Persons" 表的备份复件
SELECT *<br>INTO Persons_backup<br>FROM Persons
IN 子句可用于向另一个数据库中拷贝表
SELECT *<br>INTO Persons IN 'Backup.mdb'<br>FROM Persons
如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域
SELECT LastName,FirstName<br>INTO Persons_backup<br>FROM Persons
带有 WHERE 子句
从 "Persons" 表中提取居住在 "Beijing" 的人的信息,<br>创建了一个带有两个列的名为 "Persons_backup" 的表<br>
SELECT LastName,Firstname<br>INTO Persons_backup<br>FROM Persons<br>WHERE City='Beijing'<br>
被连接的表
创建一个名为 "Persons_Order_Backup" 的新表,<br>其中包含了从 Persons 和 Orders 两个表中取得的信息<br>
SELECT Persons.LastName,Orders.OrderNo<br>INTO Persons_Order_Backup<br>FROM Persons<br>INNER JOIN Orders<br>ON Persons.Id_P=Orders.Id_P
SQL CREATE DATABASE 语句
作用:CREATE DATABASE 用于创建数据库
SQL CREATE DATABASE 语法<br>
CREATE DATABASE database_name
SQL CREATE DATABASE 实例
创建一个名为 "my_db" 的数据库
CREATE DATABASE my_db
SQL CREATE TABLE 语句
作用:CREATE TABLE 语句用于创建数据库中的表
SQL CREATE TABLE 语法
CREATE TABLE 表名称<br>(<br>列名称1 数据类型,<br>列名称2 数据类型,<br>列名称3 数据类型,<br>....<br>)<br>
数据类型(data_type)规定了列可容纳何种数据类型。<br>下面的表格包含了SQL中最常用的数据类型<br>
SQL CREATE TABLE 实例
本例演示如何创建名为 "Person" 的表。该表包含 5 个列,<br>列名分别是:"Id_P"、"LastName"、"FirstName"、"Address" 以及 "City"<br>
CREATE TABLE Persons<br>(<br>Id_P int,<br>LastName varchar(255),<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255)<br>)
SQL 约束 (Constraints)
作用:约束用于限制加入表的数据的类型。<br>可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)<br>
SQL 约束 (Constraints)类型
SQL NOT NULL 约束<br>
用法:NOT NULL 约束强制列不接受 NULL 值<br>这意味着,如果不向字段添加值,就无法插入新记录或者更新记录<br>
SQL NOT NULL 约束实例<br>
强制 "Id_P" 列和 "LastName" 列不接受 NULL 值
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255)<br>)
SQL UNIQUE 约束
用法:UNIQUE 约束唯一标识数据库表中的每条记录。<br>UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。<br>PRIMARY KEY 拥有自动定义的 UNIQUE 约束。<br>请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束
CREATE TABLE(单列)<br>
MySQL
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255),<br>UNIQUE (Id_P)<br>)<br>
SQL Server /<br> Oracle /<br> MS Access<br>
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL UNIQUE,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255)<br>)
CREATE TABLE(多列)<br>
MySQL / <br>SQL Server / <br>Oracle /<br> MS Access<br>
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255),<br>CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)<br>)<br>
ALTER TABLE(单列)<br>
MySQL / <br>SQL Server / <br>Oracle /<br> MS Access<br>
ALTER TABLE Persons<br>ADD UNIQUE (Id_P)<br>
ALTER TABLE(多列)
MySQL / <br>SQL Server / <br>Oracle /<br> MS Access<br>
ALTER TABLE Persons<br>ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) <br>
撤销 UNIQUE 约束
MySQL<br>
ALTER TABLE Persons<br>DROP INDEX uc_PersonID
SQL Server / <br>Oracle /<br> MS Access<br>
ALTER TABLE Persons<br>DROP CONSTRAINT uc_PersonID
SQL PRIMARY KEY 约束
作用:PRIMARY KEY 约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。<br>主键列不能包含 NULL 值。每个表都应该有一个主键,并且每个表只能有一个主键
CREATE TABLE(单列)<br>
MySQL
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255),<br>PRIMARY KEY (Id_P)<br>)<br>
SQL Server / <br>Oracle /<br> MS Access<br>
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL PRIMARY KEY,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255)<br>)
CREATE TABLE(多列)<br>
MySQL / <br>SQL Server / <br>Oracle /<br> MS Access<br>
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255),<br>CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)<br>)<br>
ALTER TABLE(单列)<br>
MySQL / <br>SQL Server / <br>Oracle /<br> MS Access<br>
ALTER TABLE Persons<br>ADD PRIMARY KEY (Id_P)
ALTER TABLE(多列)<br>
MySQL / <br>SQL Server / <br>Oracle /<br> MS Access<br>
ALTER TABLE Persons<br>ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
撤销 PRIMARY KEY 约束<br>
MySQL
ALTER TABLE Persons<br>DROP PRIMARY KEY
SQL Server /<br> Oracle / <br>MS Access<br>
ALTER TABLE Persons<br>DROP CONSTRAINT pk_PersonID
SQL FOREIGN KEY 约束
作用:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY,通过一个例子来解释外键<br>
请注意,"Orders" 中的 "Id_P" 列指向 "Persons" 表中的 "Id_P" 列。<br>"Persons" 表中的 "Id_P" 列是 "Persons" 表中的 PRIMARY KEY。<br>"Orders" 表中的 "Id_P" 列是 "Orders" 表中的 FOREIGN KEY。<br>FOREIGN KEY 约束用于预防破坏表之间连接的动作。<br>FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一<br>
样表
<br>
SQL FOREIGN KEY 约束实例
CREATE TABLE(单列)<br>
MySQL<br>
CREATE TABLE Orders<br>(<br>Id_O int NOT NULL,<br>OrderNo int NOT NULL,<br>Id_P int,<br>PRIMARY KEY (Id_O),<br>FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)<br>)<br>
SQL Server / <br>Oracle / <br>MS Access:<br>
CREATE TABLE Orders<br>(<br>Id_O int NOT NULL PRIMARY KEY,<br>OrderNo int NOT NULL,<br>Id_P int FOREIGN KEY REFERENCES Persons(Id_P)<br>)
CREATE TABLE(多列)
MySQL /<br> SQL Server /<br> Oracle / <br>MS Access<br>
CREATE TABLE Orders<br>(<br>Id_O int NOT NULL,<br>OrderNo int NOT NULL,<br>Id_P int,<br>PRIMARY KEY (Id_O),<br>CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)<br>REFERENCES Persons(Id_P)<br>)<br>
ALTER TABLE(单列)<br>
MySQL /<br> SQL Server /<br> Oracle / <br>MS Access<br>
ALTER TABLE Orders<br>ADD FOREIGN KEY (Id_P)<br>REFERENCES Persons(Id_P)<br>
ALTER TABLE(多列)
MySQL /<br> SQL Server /<br> Oracle / <br>MS Access<br>
ALTER TABLE Orders<br>ADD CONSTRAINT fk_PerOrders<br>FOREIGN KEY (Id_P)<br>REFERENCES Persons(Id_P)<br>
撤销 FOREIGN KEY 约束
MySQL<br>
ALTER TABLE Orders<br>DROP FOREIGN KEY fk_PerOrders<br>
SQL Server / <br>Oracle / <br>MS Access:<br>
ALTER TABLE Orders<br>DROP CONSTRAINT fk_PerOrders
SQL CHECK 约束
作用:CHECK 约束用于限制列中的值的范围。<br> 如果对单个列定义 CHECK 约束,那么该列只允许特定的值。<br> 如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
SQL CHECK 约束实例
CREATE TABLE(单列)
MySQL
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255),<br>CHECK (Id_P>0)<br>)
SQL Server / <br>Oracle / <br>MS Access:
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL CHECK (Id_P>0),<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255)<br>)
CREATE TABLE(多列)
MySQL /<br>SQL Server /<br>Oracle / <br>MS Access
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255),<br>CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')<br>)<br>
ALTER TABLE(单列)
MySQL /<br>SQL Server /<br>Oracle / <br>MS Access
ALTER TABLE Persons<br>ADD CHECK (Id_P>0)
ALTER TABLE(多列)
MySQL /<br>SQL Server /<br>Oracle / <br>MS Access
ALTER TABLE Persons<br>ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
撤销 CHECK 约束<br>
MySQL
ALTER TABLE Persons<br>DROP CONSTRAINT chk_Person<br>
SQL Server / <br>Oracle / <br>MS Access:
ALTER TABLE Persons<br>DROP CHECK chk_Person
SQL DEFAULT 约束<br>
作用:DEFAULT 约束用于向列中插入默认值。<br>如果没有规定其他的值,那么会将默认值添加到所有的新记录。
SQL DEFAULT 约束实例
CREATE TABLE(单列)
MySQL /<br>SQL Server /<br>Oracle / <br>MS Access
CREATE TABLE Persons<br>(<br>Id_P int NOT NULL,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255) DEFAULT 'Sandnes'<br>)
子主题<br>
GETDATE() 函数
CREATE TABLE Orders<br>(<br>Id_O int NOT NULL,<br>OrderNo int NOT NULL,<br>Id_P int,<br>OrderDate date DEFAULT GETDATE()<br>)<br>
ALTER TABLE(单列)
MySQL
ALTER TABLE Persons<br>ALTER City SET DEFAULT 'SANDNES'<br>
SQL Server / <br>Oracle / <br>MS Access:
ALTER TABLE Persons<br>ALTER COLUMN City SET DEFAULT 'SANDNES'
撤销 DEFAULT 约束
MySQL
ALTER TABLE Persons<br>ALTER City DROP DEFAULT<br>
SQL Server / <br>Oracle / <br>MS Access:
ALTER TABLE Persons<br>ALTER COLUMN City DROP DEFAULT
SQL CREATE INDEX 语句<br>
索引:您可以在表中创建索引,以便更加快速高效地查询数据。<br>用户无法看到索引,它们只能被用来加速搜索/查询。
注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。<br>因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。<br>
作用:CREATE INDEX 语句用于在表中创建索引。<br>在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。
SQL CREATE INDEX 语法
在表上创建一个简单的索引。允许使用重复的值<br>
CREATE INDEX index_name<br>ON table_name (column_name)
SQL CREATE UNIQUE INDEX 语法
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值
CREATE UNIQUE INDEX index_name<br>ON table_name (column_name)
CREATE INDEX 实例
创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列
CREATE INDEX PersonIndex<br>ON Person (LastName)
希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC
CREATE INDEX PersonIndex<br>ON Person (LastName DESC)
希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开
CREATE INDEX PersonIndex<br>ON Person (LastName, FirstName)
SQL 撤销索引、表以及数据库
作用:通过使用 DROP 语句,可以轻松地删除索引、表和数据库。
SQL DROP INDEX 语句
用于 Microsoft SQLJet (以及 Microsoft Access) 的语法
DROP INDEX index_name ON table_name
用于 MS SQL Server 的语法<br>
DROP INDEX table_name.index_name
用于 IBM DB2 和 Oracle 语法
DROP INDEX index_name
用于 MySQL 的语法
ALTER TABLE table_name DROP INDEX index_name
SQL DROP TABLE 语句
DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除)
DROP TABLE 表名称
SQL DROP DATABASE 语句
DROP DATABASE 语句用于删除数据库
DROP DATABASE 数据库名称
SQL TRUNCATE TABLE 语句
需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?<br>请使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据)
TRUNCATE TABLE 表名称<br>
SQL ALTER TABLE 语句<br>
作用:ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
SQL ALTER TABLE 语法
如需在表中添加列,请使用下列语法:
ALTER TABLE table_name<br>ADD column_name datatype
要删除表中的列,请使用下列语法:<br>
ALTER TABLE table_name <br>DROP COLUMN column_name
某些数据库系统不允许这种在数据库表中删除列的方式 <br>(DROP COLUMN column_name)。<br>要改变表中列的数据类型,请使用下列语法:<br>
ALTER TABLE table_name<br>ALTER COLUMN column_name datatype<br>
SQL ALTER TABLE 实例
样表
在表 "Persons" 中添加一个名为 "Birthday" 的新列
ALTER TABLE Persons<br>ADD Birthday date
改变数据类型实例
改变 "Persons" 表中 "Birthday" 列的数据类型
ALTER TABLE Persons<br>ALTER COLUMN Birthday year
DROP COLUMN 实例
删除 "Person" 表中的 "Birthday" 列:
ALTER TABLE Person<br>DROP COLUMN Birthday
SQL AUTO INCREMENT 字段
作用:Auto-increment 会在新记录插入表中时生成一个唯一的数字
AUTO INCREMENT 字段
通常希望在每次插入新记录时,自动地创建主键字段的值<br>可以在表中创建一个 auto-increment 字段<br>
MySQL 的语法
AUTO_INCREMENT 的开始值是 1,每条新记录递增 1<br>
CREATE TABLE Persons<br>(<br>P_Id int NOT NULL AUTO_INCREMENT,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255),<br>PRIMARY KEY (P_Id)<br>)
AUTO_INCREMENT 序列以其他的值起始
ALTER TABLE Persons AUTO_INCREMENT=100
要在 "Persons" 表中插入新记录,不必为 "P_Id" 列规定值<br>(会自动添加一个唯一的值)<br>
INSERT INTO Persons (FirstName,LastName)<br>VALUES ('Bill','Gates')
SQL Server 的语法
IDENTITY 的开始值是 1,每条新记录递增 1
CREATE TABLE Persons<br>(<br>P_Id int PRIMARY KEY IDENTITY,<br>LastName varchar(255) NOT NULL,<br>FirstName varchar(255),<br>Address varchar(255),<br>City varchar(255)<br>)
规定 "P_Id" 列以 20 起始且递增 10<br>
请把 identity 改为 IDENTITY(20,10)
要在 "Persons" 表中插入新记录,不必为 "P_Id" 列规定值<br>(会自动添加一个唯一的值)
INSERT INTO Persons (FirstName,LastName)<br>VALUES ('Bill','Gates')
SQL VIEW(视图)
什么是视图?
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。<br>视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。<br>我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。<br>注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。<br>
SQL CREATE VIEW 语法
CREATE VIEW view_name AS<br>SELECT column_name(s)<br>FROM table_name<br>WHERE condition
注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。
SQL CREATE VIEW 实例
可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。<br>通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据<br>
视图 "Current Product List" 会从 Products 表列出所有正在使用的产品。<br>
CREATE VIEW [Current Product List] AS<br>SELECT ProductID,ProductName<br>FROM Products<br>WHERE Discontinued=No
查询上述视图
SELECT * FROM [Current Product List]
Northwind 样本数据库的另一个视图会选取 Products <br>表中所有单位价格高于平均单位价格的产品<br>
CREATE VIEW [Products Above Average Price] AS<br>SELECT ProductName,UnitPrice<br>FROM Products<br>WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)
查询上述视图
SELECT * FROM [Products Above Average Price]
仅仅需要查看 "Beverages" 类的全部销量:
SELECT * FROM [Category Sales For 1997]<br>WHERE CategoryName='Beverages'
SQL 更新视图
下面的语法来更新视图<br>
SQL CREATE OR REPLACE VIEW Syntax<br>CREATE OR REPLACE VIEW view_name AS<br>SELECT column_name(s)<br>FROM table_name<br>WHERE condition
向 "Current Product List" 视图添加 "Category" 列。
CREATE VIEW [Current Product List] AS<br>SELECT ProductID,ProductName,Category<br>FROM Products<br>WHERE Discontinued=No
SQL 撤销视图
SQL DROP VIEW Syntax<br>DROP VIEW view_name
SQL Date 函数
SQL 日期
MySQL Date 函数
SQL Server Date 函数
SQL Date 数据类型<br>
MySQL 使用下列数据类型在数据库中存储日期或日期/时间值:<br>DATE - 格式 YYYY-MM-DD<br>DATETIME - 格式: YYYY-MM-DD HH:MM:SS<br>TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS<br>YEAR - 格式 YYYY 或 YY<br>
SQL Server 使用下列数据类型在数据库中存储日期或日期/时间值:<br>DATE - 格式 YYYY-MM-DD<br>DATETIME - 格式: YYYY-MM-DD HH:MM:SS<br>SMALLDATETIME - 格式: YYYY-MM-DD HH:MM:SS<br>TIMESTAMP - 格式: 唯一的数字
SQL 日期处理
样表(日期)
从上表中选取 OrderDate 为 "2008-12-26" 的记录<br>
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
样表(时间)
从上表中选取 OrderDate 为 "2008-12-26" 的记录
SELECT * FROM Orders WHERE OrderDate='2008-12-26'
那么我们得不到结果。这是由于该查询不含有时间部分的日期
提示:如果您希望使查询简单且更易维护,那么请不要在日期中使用时间部分!
SQL NULL 值
NULL值说明
作用:NULL 值是遗漏的未知数据。默认地,表的列可以存放 NULL 值
如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下<br>插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存<br>NULL 值的处理方式与其他值不同,NULL 用作未知的或不适用的值的占位符。<br>注释:无法比较 NULL 和 0;它们是不等价的。<br>
SQL 的 NULL 值处理
样表
假如 "Persons" 表中的 "Address" 列是可选的。这意味着如果在 "Address" 列插入一条不带值的记录,"Address" 列会使用 NULL 值保存。<br>那么我们如何测试 NULL 值呢?无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。我们必须使用 IS NULL 和 IS NOT NULL 操作符。
SQL IS NULL
选取在 "Address" 列中带有 NULL 值
SELECT LastName,FirstName,Address FROM Persons<br>WHERE Address IS NULL
<br>
选取在 "Address" 列中不带有 NULL 值
SELECT LastName,FirstName,Address FROM Persons<br>WHERE Address IS NOT NULL
SQL NULL 函数
SQL ISNULL()、NVL()、<br>IFNULL() 和 COALESCE() 函数<br>
样表
假如 "UnitsOnOrder" 是可选的,而且可以包含 NULL 值
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)<br>FROM Products
在上面的例子中,如果有 "UnitsOnOrder" 值是 NULL,那么结果是 NULL。<br>微软的 ISNULL() 函数用于规定如何处理 NULL 值。<br>NVL(), IFNULL() 和 COALESCE() 函数也可以达到相同的结果。<br>在这里,我们希望 NULL 值为 0。<br>下面,如果 "UnitsOnOrder" 是 NULL,则不利于计算,因此如果值是 NULL 则 ISNULL() 返回 0。<br>
SQL Server / MS Access
SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))<br>FROM Products<br>
Oracle<br>
SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))<br>FROM Products
MySQL
在 MySQL 中,我们可以使用 IFNULL() 函数
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))<br>FROM Products
或者我们可以使用 COALESCE() 函数<br>
SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))<br>FROM Products
SQL 数据类型
Microsoft Access 数据类型<br>
MySQL 数据类型
Text 类型
Number 类型
Date 类型
SQL Server 数据类型
Character 字符串
Unicode 字符串
Binary 类型
Number 类型
Date 类型
其他数据类型
SQL 服务器 - RDBMS
DBMS - 数据库管理系统(Database Management System)<br>数据库管理系统是一种可以访问数据库中数据的计算机程序。<br>DBMS 使我们有能力在数据库中提取、修改或者存贮信息。<br>不同的 DBMS 提供不同的函数供查询、提交以及修改数据
RDBMS - 关系数据库管理系统(Relational Database Management System)<br>关系数据库管理系统 (RDBMS) 也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。<br>20 世纪 70 年代初,IBM 公司发明了 RDBMS。<br>RDBMS 是 SQL 的基础,也是所有现代数据库系统诸如 Oracle、SQL Server、IBM DB2、Sybase、MySQL 以及 Microsoft Access 的基础。
0 条评论
下一页
为你推荐
查看更多