SQL

(全部内容大部分来自http://www.w3school.com.cn)

一、什么是 SQL?

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

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

二、SQL 能作什么?

  • SQL 面向数据库执行查询
  • SQL 可从数据库取回数据
  • SQL 可在数据库中插入新的记录
  • SQL 可更新数据库中的数据
  • SQL 可从数据库删除记录
  • SQL 可建立新数据库
  • SQL 可在数据库中建立新表
  • SQL 可在数据库中建立存储过程
  • SQL 可在数据库中建立视图
  • SQL 能够设置表、存储过程和视图的权限

 

 

三、SQL DML 和 DDL

能够把 SQL 分为两个部分:数据操做语言 (DML) 和 数据定义语言 (DDL)。spa

SQL (结构化查询语言)是用于执行查询的语法。可是 SQL 语言也包含用于更新、插入和删除记录的语法。code

查询和更新指令构成了 SQL 的 DML 部分:排序

  • SELECT - 从数据库表中获取数据
  • UPDATE - 更新数据库表中的数据
  • DELETE - 从数据库表中删除数据
  • INSERT INTO - 向数据库表中插入数据

SQL 的数据定义语言 (DDL) 部分使咱们有能力建立或删除表格。咱们也能够定义索引(键),规定表之间的连接,以及施加表间的约束。索引

SQL 中最重要的 DDL 语句:ci

  • CREATE DATABASE - 建立新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 建立新表
  • ALTER TABLE - 变动(改变)数据库表
  • DROP TABLE - 删除表
  • CREATE INDEX - 建立索引(搜索键)
  • DROP INDEX - 删除索引

四、重要事项

必定要记住,SQL 对大小写不敏感!rem

 

五、SQL SELECT 语法

SELECT 列名称 FROM 表名称    (能够选取多个列,用‘,’隔开)  select id,usernname,psaaword from gaoxiangyu.userinfo

以及:字符串

SELECT * FROM 表名称

六、SQL SELECT DISTINCT 语句

在表中,可能会包含重复值。这并不成问题,不过,有时您也许但愿仅仅列出不一样(distinct)的值。get

关键词 DISTINCT 用于返回惟一不一样的值。产品

语法:

SELECT DISTINCT 列名称 FROM 表名称

select distinct password from gaoxiangyu.userinfo

WHERE 子句用于规定选择的标准。

七、WHERE 子句

如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。

语法

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

下面的运算符可在 WHERE 子句中使用:

操做符 描述
= 等于
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式

注释:在某些版本的 SQL 中,操做符 <> 能够写为 !=。

使用 WHERE 子句

若是只但愿选取居住在城市 "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 运算符

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 语句用于根据指定的列对结果集进行排序。

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 语句用于向表格中插入新的行。

语法

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 语句用于修改表中的数据。

语法:

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'

结果:

1三、DELETE 语句

DELETE 语句用于删除表中的行。

语法

DELETE FROM 表名称 WHERE 列名称 = 值

1四、TOP 子句

TOP 子句用于规定要返回的记录的数目。

对于拥有数千条记录的大型表来讲,TOP 子句是很是有用的。

注释:并不是全部的数据库系统都支持 TOP 子句。

SQL Server 的语法:

SELECT TOP number|percent column_name(s)
FROM table_name

MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的

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

SQL TOP PERCENT 实例

如今,咱们但愿从上面的 "Persons" 表中选取 50% 的记录。

咱们可使用下面的 SELECT 语句:

SELECT  * FROM Persons

TOP 50 PERCENT

1五、LIKE 操做符

LIKE 操做符用于在 WHERE 子句中搜索列中的指定模式。

SQL LIKE 操做符语法

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern

在搜索数据库中的数据时,您可使用 SQL 通配符。

1六、SQL 通配符

在搜索数据库中的数据时,SQL 通配符能够替代一个或多个字符。

SQL 通配符必须与 LIKE 运算符一块儿使用。

在 SQL 中,可以使用如下通配符:

通配符 描述
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符

[^charlist]

或者

[!charlist]

不在字
 
  

1七、IN 操做符

IN 操做符容许咱们在 WHERE 子句中规定多个值。

SQL IN 语法

SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...)
select * from userinfo where username in('gaoxiangyu','wudi')

BETWEEN 操做符在 WHERE 子句中使用,做用是选取介于两个值之间的数据范围。

1八、BETWEEN 操做符

操做符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值能够是数值、文本或者日期。

SQL BETWEEN 语法

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

1九、SQL Alias

表的 SQL Alias 语法

SELECT column_name(s)
FROM table_name
AS alias_name

列的 SQL Alias 语法

SELECT column_name AS alias_name
FROM table_name

 

20、Join 和 Key

有时为了获得完整的结果,咱们须要从两个或更多的表中获取结果。咱们就须要执行 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

SQL JOIN - 使用 Join

除了上面的方法,咱们也可使用关键词 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

不一样的 SQL JOIN

除了咱们在上面的例子中使用的 INNER JOIN(内链接),咱们还可使用其余几种链接。

下面列出了您可使用的 JOIN 类型,以及它们之间的差别。

  • JOIN: 若是表中有至少一个匹配,则返回行
  • LEFT JOIN: 即便右表中没有匹配,也从左表返回全部的行
  • RIGHT JOIN: 即便左表中没有匹配,也从右表返回全部的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行
select id,username,sum from userinfo inner join useraccount on userinfo.username=useraccount.account_name order by sum


SQL UNION 操做符

UNION 操做符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有类似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操做符选取不一样的值。若是容许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名老是等于 UNION 中第一个 SELECT 语句中的列名。

下面的例子中使用的原始表:

Employees_China:

E_ID E_Name
01 Zhang, Hua
02 Wang, Wei
03 Carter, Thomas
04 Yang, Ming

Employees_USA:

E_ID E_Name
01 Adams, John
02 Bush, George
03 Carter, Thomas
04 Gates, Bill

2一、使用 UNION 命令

实例

列出全部在中国和美国的不一样的雇员名:

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 ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出全部的值。

SQL Statement 1
UNION ALL
SQL Statement 2

使用 UNION ALL 命令

实例:

列出在中国和美国的全部的雇员:

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

 

2二、SELECT INTO 语句

SELECT INTO 语句从一个表中选取数据,而后把数据插入另外一个表中。

SELECT INTO 语句经常使用于建立表的备份复件或者用于对记录进行存档。

SQL 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

SQL SELECT INTO 实例 - 制做备份复件

下面的例子会制做 "Persons" 表的备份复件:

 *
 Persons_backup
FROM Persons
SELECTINTO

IN 子句可用于向另外一个数据库中拷贝表:

 *
 Persons  'Backup.mdb'
FROM Persons
SELECTINTOIN

若是咱们但愿拷贝某些域,能够在 SELECT 语句后列出这些域:

 LastName,FirstName
 Persons_backup
FROM Persons
SELECTINTO

SQL SELECT INTO 实例 - 带有 WHERE 子句

咱们也能够添加 WHERE 子句。

下面的例子经过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,建立了一个带有两个列的名为 "Persons_backup" 的表:

 LastName,Firstname
 Persons_backup
FROM Persons
 City='Beijing'
SELECTINTOWHERE

SQL SELECT INTO 实例 - 被链接的表

从一个以上的表中选取数据也是能够作到的。

下面的例子会建立一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:

 Persons.LastName,Orders.OrderNo
 Persons_Order_Backup
 Persons
 Orders
 Persons.Id_P=Orders.Id_P

SELECTINTOFROMINNER JOINON

2三、CREATE DATABASE 语句

CREATE DATABASE 用于建立数据库。

SQL CREATE DATABASE 语法

CREATE DATABASE database_name


2四、CREATE TABLE 语句

CREATE TABLE 语句用于建立数据库中的表。

SQL CREATE TABLE 语法

CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)

数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最经常使用的数据类型:

数据类型 描述
  • integer(size)
  • int(size)
  • smallint(size)
  • tinyint(size)
仅容纳整数。在括号内规定数字的最大位数。
  • decimal(size,d)
  • numeric(size,d)

容纳带有小数的数字。

"size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。

char(size)

容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。

在括号中规定字符串的长度。

varchar(size)

容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。

在括号中规定字符串的最大长度。

date(yyyymmdd) 容纳日期。

SQL CREATE TABLE 实例

本例演示如何建立名为 "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
         

注意属性最后一个后面没!!逗号‘,’

 

SQL UNIQUE 约束

UNIQUE 约束惟一标识数据库表中的每条记录。

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了惟一性的保证。

PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

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

2四、SQL UNIQUE Constraint on CREATE TABLE

下面的 SQL 在 "Persons" 表建立时在 "Id_P" 列建立 UNIQUE 约束:

MySQL:

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)

SQL PRIMARY KEY 约束

PRIMARY KEY 约束惟一标识数据库表中的每条记录。

主键必须包含惟一的值。

主键列不能包含 NULL 值。

每一个表都应该有一个主键,而且每一个表只能有一个主键。

SQL PRIMARY KEY Constraint on CREATE TABLE

下面的 SQL 在 "Persons" 表建立时在 "Id_P" 列建立 PRIMARY KEY 约束:

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)

SQL CHECK 约束

CHECK 约束用于限制列中的值的范围。

若是对单个列定义 CHECK 约束,那么该列只容许特定的值。

若是对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

 

创建索引的目的是加快对表中记录的查找或排序。为表设置索引要付出代价的:一是增长了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(由于索引也要随之变更)。数据库索引就是为了提升表的搜索效率而对某些字段中的值创建的目录 。

SQL CREATE INDEX 语法

在表上建立一个简单的索引。容许使用重复的值:

CREATE INDEX index_name
ON table_name (column_name)

2五、ALTER TABLE 语句

ALTER TABLE 语句用于在已有的表中添加、修改或删除列。

SQL ALTER TABLE 语法

如需在表中添加列,请使用下列语法:

ALTER TABLE table_name
ADD column_name datatype

要删除表中的列,请使用下列语法:

ALTER TABLE table_name 
DROP COLUMN column_name


Auto-increment 会在新记录插入表中时生成一个惟一的数字。

2六、AUTO INCREMENT 字段

咱们一般但愿在每次插入新记录时,自动地建立主键字段的值。

咱们能够在表中建立一个 auto-increment 字段。

用于 MySQL 的语法

下列 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 任务。

相关文章
相关标签/搜索