编者注:ANSI,美国国家标准化组织数据库
能够把 SQL 分为两个部分:数据操做语言 (DML) 和 数据定义语言 (DDL)。spa
SQL (结构化查询语言)是用于执行查询的语法。可是 SQL 语言也包含用于更新、插入和删除记录的语法。code
查询和更新指令构成了 SQL 的 DML 部分:排序
SQL 的数据定义语言 (DDL) 部分使咱们有能力建立或删除表格。咱们也能够定义索引(键),规定表之间的连接,以及施加表间的约束。索引
SQL 中最重要的 DDL 语句:ci
必定要记住,SQL 对大小写不敏感!rem
SELECT 列名称 FROM 表名称 (能够选取多个列,用‘,’隔开) select id,usernname,psaaword from gaoxiangyu.userinfo
以及:字符串
SELECT * FROM 表名称
在表中,可能会包含重复值。这并不成问题,不过,有时您也许但愿仅仅列出不一样(distinct)的值。get
关键词 DISTINCT 用于返回惟一不一样的值。产品
SELECT DISTINCT 列名称 FROM 表名称
select distinct password from gaoxiangyu.userinfo
WHERE 子句用于规定选择的标准。
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
下面的运算符可在 WHERE 子句中使用:
操做符 | 描述 |
---|---|
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
注释:在某些版本的 SQL 中,操做符 <> 能够写为 !=。
若是只但愿选取居住在城市 "Beijing" 中的人,咱们须要向 SELECT 语句添加 WHERE 子句:
SELECT * FROM Persons WHERE City='Beijing'
select *from userinfo where username = "gaoxiangyu"
select *from userinfo where id > 10
select *from userinfo where id > 1 && username = "gaoxiangyu"
AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
若是第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
若是第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
select *from userinfo where id > 1 AND username = "gaoxiangyu"
select *from userinfo where id > 1 or username = "gaoxiangyu"
ORDER BY 语句用于对结果集进行排序。
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
若是您但愿按照降序对记录进行排序,可使用 DESC 关键字。
select id,username from userinfo order by id
SELECT Company, OrderNumber FROM Orders 十、逆序DESCORDER BY Company, OrderNumber
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
INSERT INTO 语句用于向表格中插入新的行。
INSERT INTO 表名称 VALUES (值1, 值2,....)
咱们也能够指定所要插入数据的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
列属性没必要加‘’,values值数字能够不加‘’,但字符必须加
insert into gaoxiangyu.userinfo(id,username,password)values(193,'g','l')
Update 语句用于修改表中的数据。
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
咱们为 lastname 是 "Wilson" 的人添加 firstname:
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
LastName | FirstName | Address | City |
---|---|---|---|
Gates | Bill | Xuanwumen 10 | Beijing |
Wilson | Fred | Champs-Elysees |
咱们会修改地址(address),并添加城市名称(city):
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
DELETE 语句用于删除表中的行。
DELETE FROM 表名称 WHERE 列名称 = 值
TOP 子句用于规定要返回的记录的数目。
对于拥有数千条记录的大型表来讲,TOP 子句是很是有用的。
注释:并不是全部的数据库系统都支持 TOP 子句。
SELECT TOP number|percent column_name(s) FROM table_name
SELECT column_name(s) FROM table_name LIMIT number
SELECT * FROM Persons LIMIT 5
SELECT column_name(s) FROM table_name WHERE ROWNUM <= number
如今,咱们但愿从上面的 "Persons" 表中选取 50% 的记录。
咱们可使用下面的 SELECT 语句:
SELECT * FROM Persons
TOP 50 PERCENT
LIKE 操做符用于在 WHERE 子句中搜索列中的指定模式。
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
在搜索数据库中的数据时,您可使用 SQL 通配符。
在搜索数据库中的数据时,SQL 通配符能够替代一个或多个字符。
SQL 通配符必须与 LIKE 运算符一块儿使用。
在 SQL 中,可以使用如下通配符:
通配符 | 描述 |
---|---|
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或者 [!charlist] |
不在字 |
IN 操做符容许咱们在 WHERE 子句中规定多个值。
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)
select * from userinfo where username in('gaoxiangyu','wudi')
BETWEEN 操做符在 WHERE 子句中使用,做用是选取介于两个值之间的数据范围。
操做符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值能够是数值、文本或者日期。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
select * from userinfo where username between 'gao' and 'wudi'
如需使用上面的例子显示范围以外的人,请使用 NOT 操做符:
SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter'
NOT
SELECT column_name(s) FROM table_name AS alias_name
SELECT column_name AS alias_name FROM table_name
有时为了获得完整的结果,咱们须要从两个或更多的表中获取结果。咱们就须要执行 join。
数据库中的表可经过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是惟一的。在表中,每一个主键的值都是惟一的。这样作的目的是在不重复每一个表中的全部数据的状况下,把表间的数据交叉捆绑在一块儿。
请看 "Persons" 表:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
请注意,"Id_P" 列是 Persons 表中的的主键。这意味着没有两行可以拥有相同的 Id_P。即便两我的的姓名彻底相同,Id_P 也能够区分他们。
接下来请看 "Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
请注意,"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用他们的确切姓名。
请留意,"Id_P" 列把上面的两个表联系了起来。
咱们能够经过引用两个表的方式,从两个表中获取数据:
谁订购了产品,而且他们订购了什么产品?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons, Orders WHERE Persons.Id_P = Orders.Id_P
结果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
除了上面的方法,咱们也可使用关键词 JOIN 来从两个表中获取数据。
若是咱们但愿列出全部人的定购,可使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons ON Persons.Id_P = Orders.Id_P ORDER BY Persons.LastName INNER JOIN Orders
结果集:
LastName | FirstName | OrderNo |
---|---|---|
Adams | John | 22456 |
Adams | John | 24562 |
Carter | Thomas | 77895 |
Carter | Thomas | 44678 |
除了咱们在上面的例子中使用的 INNER JOIN(内链接),咱们还可使用其余几种链接。
下面列出了您可使用的 JOIN 类型,以及它们之间的差别。
select id,username,sum from userinfo inner join useraccount on userinfo.username=useraccount.account_name order by sum
UNION 操做符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有类似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操做符选取不一样的值。若是容许重复的值,请使用 UNION ALL。
SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名老是等于 UNION 中第一个 SELECT 语句中的列名。
E_ID | E_Name |
---|---|
01 | Zhang, Hua |
02 | Wang, Wei |
03 | Carter, Thomas |
04 | Yang, Ming |
E_ID | E_Name |
---|---|
01 | Adams, John |
02 | Bush, George |
03 | Carter, Thomas |
04 | Gates, Bill |
列出全部在中国和美国的不一样的雇员名:
SELECT E_Name FROM Employees_China SELECT E_Name FROM Employees_USA UNION
E_Name |
---|
Zhang, Hua |
Wang, Wei |
Carter, Thomas |
Yang, Ming |
Adams, John |
Bush, George |
Gates, Bill |
注释:这个命令没法列出在中国和美国的全部雇员。在上面的例子中,咱们有两个名字相同的雇员,他们当中只有一我的被列出来了。UNION 命令只会选取不一样的值。
UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出全部的值。
SQL Statement 1 UNION ALL SQL Statement 2
列出在中国和美国的全部的雇员:
SELECT E_Name FROM Employees_China SELECT E_Name FROM Employees_USA UNION ALL
E_Name |
---|
Zhang, Hua |
Wang, Wei |
Carter, Thomas |
Yang, Ming |
Adams, John |
Bush, George |
Carter, Thomas |
Gates, Bill |
SELECT INTO 语句从一个表中选取数据,而后把数据插入另外一个表中。
SELECT INTO 语句经常使用于建立表的备份复件或者用于对记录进行存档。
您能够把全部的列插入新表:
SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename
或者只把但愿的列插入新表:
SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename
下面的例子会制做 "Persons" 表的备份复件:
* Persons_backup FROM Persons SELECTINTO
IN 子句可用于向另外一个数据库中拷贝表:
* Persons 'Backup.mdb' FROM Persons SELECTINTOIN
若是咱们但愿拷贝某些域,能够在 SELECT 语句后列出这些域:
LastName,FirstName Persons_backup FROM Persons SELECTINTO
咱们也能够添加 WHERE 子句。
下面的例子经过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,建立了一个带有两个列的名为 "Persons_backup" 的表:
LastName,Firstname Persons_backup FROM Persons City='Beijing' SELECTINTOWHERE
从一个以上的表中选取数据也是能够作到的。
下面的例子会建立一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:
Persons.LastName,Orders.OrderNo Persons_Order_Backup Persons Orders Persons.Id_P=Orders.Id_P
SELECTINTOFROMINNER JOINON
CREATE DATABASE 用于建立数据库。
CREATE DATABASE database_name
CREATE TABLE 语句用于建立数据库中的表。
CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... )
数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最经常使用的数据类型:
数据类型 | 描述 |
---|---|
|
仅容纳整数。在括号内规定数字的最大位数。 |
|
容纳带有小数的数字。 "size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。 |
char(size) | 容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。 在括号中规定字符串的长度。 |
varchar(size) | 容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。 在括号中规定字符串的最大长度。 |
date(yyyymmdd) | 容纳日期。 |
本例演示如何建立名为 "Person" 的表。
该表包含 5 个列,列名分别是:"Id_P"、"LastName"、"FirstName"、"Address" 以及 "City":
CREATE TABLE Persons ( Id_P int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255) )
Id_P 列的数据类型是 int,包含整数。其他 4 列的数据类型是 varchar,最大长度为 255 个字符。
空的 "Persons" 表相似这样:
Id_P | LastName | FirstName | Address | City |
---|---|---|---|---|
注意属性最后一个后面没!!逗号‘,’
UNIQUE 约束惟一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了惟一性的保证。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
请注意,每一个表能够有多个 UNIQUE 约束,可是每一个表只能有一个 PRIMARY KEY 约束。
下面的 SQL 在 "Persons" 表建立时在 "Id_P" 列建立 UNIQUE 约束:
CREATE TABLE Persons ( Id_P int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), )
UNIQUE (Id_P)
PRIMARY KEY 约束惟一标识数据库表中的每条记录。
主键必须包含惟一的值。
主键列不能包含 NULL 值。
每一个表都应该有一个主键,而且每一个表只能有一个主键。
下面的 SQL 在 "Persons" 表建立时在 "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), )
PRIMARY KEY (Id_P)
CHECK 约束用于限制列中的值的范围。
若是对单个列定义 CHECK 约束,那么该列只容许特定的值。
若是对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
创建索引的目的是加快对表中记录的查找或排序。为表设置索引要付出代价的:一是增长了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(由于索引也要随之变更)。数据库索引就是为了提升表的搜索效率而对某些字段中的值创建的目录 。
在表上建立一个简单的索引。容许使用重复的值:
CREATE INDEX index_name ON table_name (column_name)
ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
如需在表中添加列,请使用下列语法:
ALTER TABLE table_name ADD column_name datatype
要删除表中的列,请使用下列语法:
ALTER TABLE table_name DROP COLUMN column_name
Auto-increment 会在新记录插入表中时生成一个惟一的数字。
咱们一般但愿在每次插入新记录时,自动地建立主键字段的值。
咱们能够在表中建立一个 auto-increment 字段。
下列 SQL 语句把 "Persons" 表中的 "P_Id" 列定义为 auto-increment 主键:
CREATE TABLE Persons ( LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255), ) P_Id int NOT NULL AUTO_INCREMENT,PRIMARY KEY (P_Id)
MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。