SQL 教程 (W3c)

toc and abstract.

简单入门,也有一些left join等,还有函数


http://w3school.com.cn/sql/index.asp

2017.9.26 星期二 15:13

一 基础教程

1.1 教程

SQL 是用于访问和处理数据库的标准的计算机语言。
在本教程中,您将学到如何使用 SQL 访问和处理数据系统中的数据,这类数据库包括:Oracle, Sybase, SQL Server, DB2, Access 等等。

1.2 简介

1 SQL 是用于访问和处理数据库的标准的计算机语言。

什么是 SQL?

SQL 指结构化查询语言
SQL 使我们有能力访问数据库
SQL 是一种 ANSI 的标准计算机语言

编者注:ANSI,美国国家标准化组织

2 SQL 是一种标准 - 但是…

SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。
SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。

不幸地是,存在着很多不同版本的 SQL 语言,但是为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。
注释:除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展!

3 在您的网站中使用 SQL

您需要以下要素:

1. RDBMS 数据库程序(比如 MS Access,SQL Server, MySQL)  
2. 服务器端脚本语言(比如 PHP 或 ASP)  
3. SQL  
4. HTML / CSS 

RDBMS

RDBMS 指的是关系型数据库管理系统。

RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如 MS SQL Server, IBM DB2, Oracle, MySQL 以及 Microsoft Access。

RDBMS 中的数据存储在被称为表(tables)的数据库对象中。

表是相关的数据项的集合,它由列和行组成。

1.3 语法

1 数据库表

2 SQL 语句

SELECT LastName FROM Persons

3 重要事项

SQL 对大小写不敏感!

4 SQL 语句后面的分号?

  1. 某些数据库系统要求在每条 SQL 命令的末端使用分号。
  2. 分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的语句。
  3. 如果您使用的是 MS Access 和 SQL Server 2000,则不必在每条 SQL 语句之后使用分号,不过某些数据库软件要求必须使用分号。

5 SQL DML 和 DDL

1.数据操作语言 (DML):查询和更新
SELECT - 从数据库表中获取数据  
UPDATE - 更新数据库表中的数据  
DELETE - 从数据库表中删除数据  
INSERT INTO - 向数据库表中插入数据  
2. 数据定义语言 (DDL):创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
CREATE DATABASE - 创建新数据库  
ALTER DATABASE - 修改数据库  
CREATE TABLE - 创建新表  
ALTER TABLE - 变更(改变)数据库表   
DROP TABLE - 删除表  
CREATE INDEX - 创建索引(搜索键)  
DROP INDEX - 删除索引  

1.4 select

SELECT LastName,FirstName FROM Persons
SELECT * FROM Persons

在结果集(result-set)中导航

由 SQL 查询程序获得的结果被存放在一个结果集中。大多数数据库软件系统都允许使用编程函数在结果集中进行导航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record 等等。

类似这些编程函数不在本教程讲解之列。如需学习通过函数调用访问数据的知识,请访问我们的 ADO 教程 和 PHP 教程。

1.5 distinct

SELECT DISTINCT Company FROM Orders 

1.6 where

SELECT * FROM Persons WHERE City='Beijing'
  • 在某些版本的 SQL 中,操作符 <> 可以写为 !=。
  • 引号的使用:
    SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

1.7 AND & OR

SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter'

1.8 Order By (DESC、ASCs)

SELECT Company, OrderNumber FROM Orders ORDER BY Company
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

1.9 insert

//插入新的行
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
//指定的列中插入数据
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')

1.0 update

//更新某一行中的一个列
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' 
//更新某一行中的若干列
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'

1.1 delete

DELETE FROM Person WHERE LastName = 'Wilson' 
//删除所有行:不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
DELETE FROM table_name
DELETE * FROM table_name

二 高级教程

top,like,通配符,in,between,aliases,join/inner join/left join/right join/full join,union,select into,create db,create table,constraints,not null,unique,primary key,foreign key,check,default,create index,drop,alter,increment,view,date,nulls,isnull(),数据类型,服务器

1 Top (-/PERCENT)

SELECT TOP 2 * FROM Persons
SELECT TOP 50 PERCENT * FROM Persons
  • MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的

    //Mysql
    SELECT * FROM Persons LIMIT 5
    //Oracle
    SELECT * FROM Persons WHERE ROWNUM <= 5
    

2 Like

SELECT * FROM Persons WHERE City LIKE 'N%'
SELECT * FROM Persons WHERE City LIKE '%g'
SELECT * FROM Persons WHERE City LIKE '%lon%'
SELECT * FROM Persons WHERE City NOT LIKE '%lon%'

3 通配符

% _ [charlist] [^charlist]或者[!charlist]

SELECT * FROM Persons WHERE City LIKE 'Ne%'

SELECT * FROM Persons WHERE FirstName LIKE '_eorge'
SELECT * FROM Persons WHERE LastName LIKE 'C_r_er'

SELECT * FROM Persons WHERE City LIKE '[ALN]%'
SELECT * FROM Persons WHERE City LIKE '[!ALN]%'

4 In

SELECT * FROM Persons WHERE LastName IN ('Adams','Carter')

5 Between

SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter'

重要事项:不同的数据库对 BETWEEN…AND 操作符的处理方式是有差异的。某些数据库会列出介于 “Adams” 和 “Carter” 之间的人,但不包括 “Adams” 和 “Carter” ;某些数据库会列出介于 “Adams” 和 “Carter” 之间并包括 “Adams” 和 “Carter” 的人;而另一些数据库会列出介于 “Adams” 和 “Carter” 之间的人,包括 “Adams” ,但不包括 “Carter” 。
所以,请检查你的数据库是如何处理 BETWEEN….AND 操作符的!

6 Aliases

SELECT po.OrderID, p.LastName, p.FirstName FROM Persons AS p, Product_Orders AS po WHERE p.LastName='Adams' AND p.FirstName='John'
//使用一个列名别名:结果列名更改了
SELECT LastName AS Family, FirstName AS Name FROM Persons

7 Join: 根据两个或多个表中的列之间的关系,从这些表中查询数据。

SELECT Persons.LastName, Persons.FirstName, rders.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

不同的 SQL JOIN

  • INNER JOIN(内连接): 如果表中有至少一个匹配,则返回行
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行

    注释:INNER JOIN 与 JOIN 是相同的。

8 Inner Join

9 Left Join

10 Right Join

11 Full Join

12 union (all): 合并两个或多个 SELECT 语句的结果集。

  • 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
  • 注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
  • UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

    SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA
    SELECT E_Name FROM Employees_China UNION ALL SELECT E_Name FROM Employees_USA
    

13 select into: 用于创建表的备份复件

SELECT * INTO Persons_backup FROM Persons
//IN 子句可用于向另一个数据库中拷贝表:
SELECT * INTO Persons IN 'Backup.mdb' FROM Persons
//如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:
SELECT LastName,FirstName INTO Persons_backup FROM Persons
//也可以添加 WHERE 子句。
SELECT LastName,Firstname INTO Persons_backup FROM Persons WHERE City='Beijing'
//从一个以上的表中选取数据也是可以做到的。
SELECT Persons.LastName,Orders.OrderNo INTO Persons_Order_Backup FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_P

14 create db

CREATE DATABASE my_db

15 create table

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

16 约束 (Constraints):用于限制加入表的数据的类型。

16.1 NOT NULL

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

16.2 UNIQUE

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

16.3 PRIMARY KEY

16.4 FOREIGN KEY

16.5 CHECK

16.6 DEFAULT

17 create index

18 drop

19 alter

20 alter

21 increment

22 view

23 date

24 nulls

25 isnull()

26 数据类型

Microsoft Access、MySQL 以及 SQL Server 所使用的数据类型和范围。
参考链接:http://w3school.com.cn/sql/sql_datatypes.asp

1.Microsoft Access 数据类型

Text Memo Byte Integer Long Single Double Currency AutoNumber Date/Time Yes/No Ole-Object Hyperlink Lookup Wizard

2.MySQL 数据类型

在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。

  • text: CHAR(size) VARCHAR(size) TINYTEXT TEXT BLOB MEDIUMTEXT MEDIUMBLOB LONGTEXT LONGBLOB ENUM(x,y,z,etc.) SET
  • number: TINYINT(size) SMALLINT(size) MEDIUMINT(size) INT(size) BIGINT(size) FLOAT(size,d) DOUBLE(size,d) DECIMAL(size,d)
  • date: DATE() DATETIME() TIME() YEAR()

3.SQL Server 数据类型

  • Character 字符串:
  • Unicode 字符串:
  • Binary 类型:
  • Number 类型:
  • Date 类型:
  • 其他数据类型:

    27 服务器

    现代的 SQL 服务器构建在 RDBMS 之上。
  • DBMS - 数据库管理系统(Database Management System)

    数据库管理系统是一种可以访问数据库中数据的计算机程序。

    DBMS 使我们有能力在数据库中提取、修改或者存贮信息。

    不同的 DBMS 提供不同的函数供查询、提交以及修改数据。

  • RDBMS - 关系数据库管理系统(Relational Database Management System)

    关系数据库管理系统 (RDBMS) 也是一种数据库管理系统,其数据库是根据数据间的关系来组织和访问数据的。

    20 世纪 70 年代初,IBM 公司发明了 RDBMS。

    RDBMS 是 SQL 的基础,也是所有现代数据库系统诸如 Oracle、SQL Server、IBM DB2、Sybase、MySQL 以及 Microsoft Access 的基础。

三 函数

functions-,avg,count,first,last,max,min,sum,group by-,having-,ucase,lcase,mid,round,now,format

1 functions

  • 合计函数(Aggregate functions): 的操作面向一系列的值,并返回一个单一的值。

    注释:如果在 SELECT 语句的项目列表中的众多其它表达式中使用 SELECT 语句,则这个 SELECT 必须使用 GROUP BY 语句!

  • Scalar 函数: 的操作面向某个单一的值,并返回基于输入值的一个单一的值。

2 avg

SELECT AVG(OrderPrice) AS OrderAverage FROM Orders
SELECT Customer FROM Orders WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)

3 count

SELECT COUNT(Customer) AS CustomerNilsen FROM Orders WHERE Customer='Carter'
//总行数
SELECT COUNT(*) AS NumberOfOrders FROM Orders
//表中不同客户的数目
SELECT COUNT(DISTINCT Customer) AS NumberOfCustomers FROM Orders

4 first

SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders

5 last

6 max

7 min

8 sum

9 group by-

用于结合合计函数,根据一个或多个列对结果集进行分组。

//不使用的话,都5700
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
//也可以对一个以上的列应用 GROUP BY 语句
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate

10 having-

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer HAVING SUM(OrderPrice)<2000
SELECT Customer,SUM(OrderPrice) FROM Orders WHERE Customer='Bush' OR Customer='Adams' GROUP BY Customer HAVING SUM(OrderPrice)>1500

11 ucase

12 lcase

13 mid

14 len

15 round

16 now

17 format

四 总结

1 快速参考

2 教程总结

五 测验

2017.9.26 二 18:14

章节 学习情况 截止日期 后期安排
noted md * 简明日志
coded 看了的部分都 coded
高级、函数 看了半块 2017.9.26 2 抽空、neededThenWork
knowledge is no pay,reward is kindness
0%