一、SQL是什么?
SQL是结构化查询语言Structured Query Language的简称,是一门ANSI的标准计算机语言,用来访问和操作数据库系统。 SQL语句用于取回和更新数据库中的数据。SQL可与数据库程序协同工作。
二、SQL能做什么?
- SQL面向数据库执行查询;(查询)
- 可从数据库取回数据;(取出数据)
- 向数据库中插入新的记录;(增加)
- 更新数据库中的数据;(更新)
- 删除数据库中的数据;(删除)
- 创建新数据库;(建库)
- 在数据库中创建新表(建表)
- 在数据库中创建存储过程(建存储过程);
- 在数据库中创建视图;
- 设置表、存储过程和视图的权限;
简而言之,使用SQL可以对数据库进行建表、建库、建存储过程、查询操作,对数据库中的数据进行增、删、改、查操作以及设置权限等操作。
三、与SQL相关的术语
RDBMS :Relationshop Database Management System 关系型数据管理系统 ,它是SQL的基础,同样也是所有现代数据库系统的基础;
Table :数据库对象,它表示相关数据项的集合,它由列和行组成,用于存储RDBMS的数据。一个数据库通常包含一个或多个表。每张表由一个 名字标识,表种包含数据的记录。
DML :date manipulation language,SQL中处理数据等操作统称为数据操纵语言。它包含SELECT、UPDATE、INSERT、DELETE这四条命令,这些命令用来对数据库里的数据进行增删改查等操作的语言。
DDL :date definition language,数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言。主要的命令有CREATE、ALTER、DROP可以用于CREATE DATABASE - 创建新数据库,ALTER DATABASE - 修改数据库,CREATE TABLE - 创建新表,ALTER TABLE - 变更(改变)数据库表,DROP TABLE - 删除表
,CREATE INDEX - 创建索引(搜索键),DROP INDEX - 删除索引
,等。DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,大多在建立表时使用。
DCL : Data Control Language,数据控制语言,是数据库控制功能, 用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等 。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有
sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL。常用的命令有 COMMIT(提交),SAVEPOINT(保存点),ROLLBACK(回滚),SET TRANSACTION(设置当前事物的特性)。
(DML 、DDL,DCL参照:http://blog.csdn.net/level_level/article/details/4248685
四、SQL语法(SQL语句不区分大小写,即大小写不敏感)
1、常用基本语法:
(1) SELECT 查询语句:主要用于从表中选取数据,查询结果放在一个结果集中。
语法: SELECT 列明 FROM 表名
以及
SELECT * FROM 表名。
例如:从student表中查询所有学生的姓名,SQL语句为:SELECT st_name FROM student;
查询所有学生的信息,SQL语句为:SELECT * FROM student;
(2)SELECT DISTINCT: 用于查询唯一不同的值,去除重复的值。
语法: SELECT DISTINCT 列名 FROM 表名
(3)WHERE 子句:用于条件查询数据,可置于SELECT句中。
语法:SELECT 列名 FROM 表名 WHERE 列 运算符 值
例如:SELECT * FROM stduent
WHERE name='lean'
可在 WHERE 子句中使用的运算符:
操作符
|
描述
|
=
|
等于
|
<>
|
不等于
|
>
|
大于
|
<
|
小于
|
>=
|
大于等于
|
<=
|
小于等于
|
BETWEEN
|
在某个范围内
|
LIKE
|
搜索某种模式
|
注意:WHERE子句中的引号的使用,SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号
(4) AND 和 OR 运算符:AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录;
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录;
例如:
使用AND来显示所有姓为"Carter"并且名为"Thomas"的人:SELECT * FROM student WHERE firstName ='Thomas'
AND
lastName ='Carter'
使用 OR 来显示所有姓为"Carter"或者名为"Thomas"的人:SELECT * FROM student WHERE firstname='Thomas'
OR
lastname='Carter'
也可使用将AND和OR结合起来使用:SELECT*FOM student WHERE(firstName='Thomas'OR firstName='William')AND lastName='carter'
(5) ORDER BY 语句:
用于对结果集进行排序,默认按照升序对指定列结果集进行排序,若按降序排序则使用desc关键字。
例如:根据学生年龄对学生进行升序排序:SELECT name FROM student ORDER BY age
根据学生年龄对学生进行降序排序:SELECT name FROM student ORDER BY age DESC
(6)INSERT INTO 语句: 用于向表格中插入新的行,或者向指定的列插入数据。
语法:插入新的行:INSERT INTO 表名称 VALUES (值1, 值2,....)
向指定列插入数据:INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
例如:INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
(7)Update 语句: 语句用于修改表中的数据
语法:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
例如:更新某一行中的一个列:UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
更新某一行中的若干列:UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing' WHERE LastName = 'Wilson'
(8)DELETE 语句: 用于删除表中的行
语法:DELETE FROM 表名称 WHERE 列名称 = 值
例如:删除某行:DELETE FROM Person WHERE LastName = 'Wilson'
删除所有行:DELETE FROM table_name 或者 DELETE * FROM table_name
2、高级语法
(1)TOP子句:
用于规定要返回的记录的数目。对于拥有上千条记录的大型表来说,TOP子句是非常有用的,然而值得注意的是,并非所有的数据库系统都支持TOP子句。语法以MySQL和oracle的为例。
MySQL语法:SELECT * FROM 表名 LIMIT 数值
Oracle语法:SELECT 列名 FROM 表名 WHERE ROWNUM <= 数值
(2) LIKE 操作符 和通配符:用于在 WHERE 子句中搜索列中的指定模式。
通配符 | 描述 |
---|---|
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或者 [!charlist] | 不在字符列中的任何单一字符 |
语法:SELECT 列名 FROM 表名 WHERE 列名 LIKE 表达式
举例:查询姓名以‘N’开头的学生姓名
SELECT * FROM student WHERE name LIKE'N%'
查询姓名以‘m’结尾的学生的姓名
SELECT * FROM student WHERE name LIKE '%m'
查询姓名中包含‘om’的学生的姓名
SELECT * FROM student WHERE name LIKE'%om%'
查询姓名中不包含‘om’的学生的姓名
SELECT * FROM student WHERE name NOT LIKE'%om%'
查询名字的第一个字符之后是 "eorge" 的人
SELECT * FORM student WHERE name LIKE '_eorge '
查询姓名以 "C" 开头,然后是一个任意字符,然后是 "r",然后是任意字符,然后是 "er":
SELECT * FROM student WHERE name LIKE'C_r_er'
查询姓名以'a','n','m'开头的学生信息
SELECT * FROM student WHERE name LIKE '[a n m ]'
查询姓名不以'a','n','m'开头的信息
SELECT * FROM student WHERE name LIKE '[a n m ]'
(3) IN 操作符:允许在 WHERE 子句中规定多个值。
语法:SELECT 列名 FROM 表名 WHERE 列名 IN (value1,value2,value。。。。
)
举例:从student表中查询姓氏 adams 和 carter的
SELECT * FROM student WHERE firstName IN('adams' ,‘carter ’)
(4) BETWEEN 操作符:在 WHERE 子句中使用,用于选取介于两个值之间的数据范围。
语法:SELECT * FROM 表名 WHERE 列名 BETWEEN value1 AND value2
举例:查询年龄在18-20岁之间的学生信息
SELECT * FROM student WHERE age BETWEEN 18 AND 20
查询年龄不在18-20岁之间的学生信息
SELECT * FROM student WHERE age BETWEEN 18 AND 20
(5) AS 操作符:用于为列名、表名指定别名。
语法:为表指定名: SELECT 列名 FROM 表名 AS 别名
为列指定别名: SELECT 列名 AS 别名 FROM 表名
举例:
有两个表分别是:"stduent" 和 "orders"。分别为它们指定别名 "p" 和 "po"。现在,列出 "John Adams" 的所有定单。可以使用下面的 SELECT 语句:
SELECT po.orderID, p.lastName,p.firstName FROM Persons AS P,Product_Orders po WHERE p.lastName='Adams' AND p.firstName='John'
(6) JOIN 和 KEY:常用语多表查询,连接多个表。语法通过下面的例子说明
student表
Id_s
|
lastName
|
firstName
|
address
|
city
|
1 | Adams | John | Oxford Street | London |
2 | Bush | George | Fifth Avenue | New York |
3 | Carter | Thomas | Changan Street | Beijing |
order表
Id_o
|
orderNo
|
Id_s
|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 |
65
|
普通写法:
SELECT student.lastName,student.firstName,order.orderNo FROM student,order Where student.Id_s =order.Id_s
使用 JOIN :SELECT stduent.lastName,student.firstName,order.Id_o FROM student INNER JOIN order ON student.Id_s=order.Id_s。
(7) INNER JOIN 关键字(与JOIN 相同):在表中存在至少一个匹配,INNER JOIN 关键字返回。
语法:SELECT 列名 FROM 表名1 INNER JOIN 表名2 ON 表名1.列名 = 表名2.列名
"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 |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
列出所有人的定购。
SELECT LastName,FirstName FROM Persons INNER JOIN Orders ON Persons.Id_P=Orders.Id_O
ORDER BY Persons.LastName
(8) LEFT JOIN :从左表(表1)返回所有的行,即使右表(表2)中没有匹配的行
语法: SELECT 列名 FROM 表1 LEFT JOIN 表二 ON 表1.列名=表二.列名。
(注意:在某些数据库中,LEFT JOIN 又称为 LEFT OUT JOIN )
举例:
"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 |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
列出所有的人,以及他们的定购 - 如果有的话
SELECT * FROM Persons LEFT JOIN Orders ON Persons.Id_P=Orders.Id_P ORDER BY Persons .LastName
从左表(表1)返回所有的行,即使右表(表2)中没有匹配的行
(9)RIGHT JOIN :从右表中(表二)返回所有的行,即使左表(表一)中没有匹配的行。
语法: SELECT 列名 FROM 表1 RIGHT JOIN 表二 ON 表1.列名=表二.列名。
(注意:在某些数据库中,LEFT JOIN 又称为 RIGHT OUT JOIN )
举例:
"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 |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
SELECT firstName,lastName ,orderNo FROM Persons RIGHT JOIN Orders ON Persons.Id_P=Orders.Id_P
(9) FULL JOIN :只要其中某个表存在匹配,FULL JOIN 就会返回行。
语法:SELECT 列名 FROM 表名1 FULL JOIN 表名2 ON 表名1.列名=表名2.列名
举例:"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 |
"Orders" 表:
Id_O | OrderNo | Id_P |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 1 |
4 | 24562 | 1 |
5 | 34764 | 65 |
SELECT lastName ,firstName, orderNo FROM Persons FULL JOIN Orders ON Persons.Id_P=Orders.Id_P