一、SQL 简介
1. 什么是 SQL?
SQL 指结构化查询语言
SQL 使我们有能力访问数据库
SQL 是一种 ANSI 的标准计算机语言
2. SQL 能做什么?
SQL 面向数据库执行查询
SQL 可从数据库取回数据
SQL 可在数据库中插入新的记录
SQL 可更新数据库中的数据
SQL 可从数据库删除记录
SQL 可创建新数据库
SQL 可在数据库中创建新表
SQL 可在数据库中创建存储过程
SQL 可在数据库中创建视图
SQL 可以设置表、存储过程和视图的权限
3. 注意事项
SQL 对大小写不敏感!
每条 SQL 命令的末端使用分号[;]结束
4. 查询、更新和定义指令
SQL 查询和更新指令-----------------
SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据 SQL 的数据定义指令----------------- CREATE DATABASE - 创建新数据库 ALTER DATABASE - 修改数据库 CREATE TABLE - 创建新表 ALTER TABLE - 变更(改变)数据库表 DROP TABLE - 删除表 CREATE INDEX - 创建索引(搜索键) DROP INDEX - 删除索引
二、SQL Select 语句
SELECT 语句用于从表中选取数据。
结果被存储在一个结果表中(称为结果集)。
1. SELECT 简单语法
SELECT 列名称 FROM 表名称
以及:
SELECT * FROM 表名称
注:SQL 语句对大小写不敏感。SELECT 等效于 select。
SQL SELECT 实例
SELECT id,name,title FROM posts
或
SELECT * FROM posts
注:星号(*)是选取所有列的快捷方式。
2. SELECT DISTINCT 语句
DISTINCT 用于返回唯一不同的值(按某一列去重)。
语法:
SELECT DISTINCT 列名称 FROM 表名称
如:
SELECT DISTINCT title FROM posts
3. WHERE 子句
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
语法:
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
下面的运算符可在 WHERE 子句中使用:
操作符 | 描述 |
---|---|
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
如下:
SELECT 语句添加 WHERE 子句:
SELECT * FROM posts WHERE title='test title'
注意,单引号的使用。
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
文本值:
这是正确的:
SELECT * FROM posts WHERE title='test title'
这是错误的:
SELECT * FROM posts WHERE title=test title
数值:
这是正确的:
SELECT * FROM posts WHERE Year>1965
这是错误的:
SELECT * FROM posts WHERE Year>'1965'
4. AND & OR 运算符
AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。
AND 运算符实例 如下:
SELECT * FROM posts WHERE title='test title' AND name='admin'
OR 运算符实例
SELECT * FROM posts WHERE title='test title' OR name='admin'
结合 AND 和 OR 运算符
SELECT * FROM posts WHERE (title='test title' OR FirstName='admin') AND status='publish'
5. ORDER BY 子句
ORDER BY 语句用于对结果集进行排序
ORDER BY 语句默认按照升序对记录进行排序(ASC)
如果希望按降序排序,可以使用 DESC 关键字
实例如下:
SELECT * FROM posts ORDER BY title
或
SELECT * FROM posts ORDER BY title DESC
多个排序条件如下:
SELECT title,name FROM posts ORDER BY title DESC, name ASC
注意:在以上的结果中第一列 title 有相等时。第二个排序条件才会起作用,并对相同的 title 再按 name 排序。
6. Limit 子句
Limit 子句是用于规定要返回的记录的数目
SELECT * FROM posts LIMIT 10
或
SELECT * FROM posts LIMIT 1,10
7. LIKE 通配符
通配符 | 描述 |
---|---|
% | 替代一个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist]或者[!charlist] | 不在字符列中的任何单一字符 |
1. LIKE 操作符(替代一个或多个字符)
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
实例如下:
SELECT * FROM posts WHERE title LIKE 'test%'
提示:”%” 可用于定义通配符(模式中缺少的字母)。
或:
SELECT * FROM posts WHERE title LIKE '%test%'
NOT 关键字 (不包含 某些关键字)
如下:
SELECT * FROM posts WHERE title NOT LIKE '%test%'
2. _ 通配符(仅替代一个字符)
SELECT * FROM posts WHERE title LIKE '___t'
3. [charlist] 通配符(字符列中的任何单一字符)
SELECT * FROM posts WHERE title LIKE '[ALN]%'
不以 “A” 或 “L” 或 “N” 开头的 title
SELECT * FROM posts WHERE title LIKE '[!ALN]%'
8. IN 操作符
IN 操作符允许我们在 WHERE 子句中规定多个值。
实例:
SELECT * FROM posts WHERE name IN ('admin','john')
9. BETWEEN … AND … 操作符
操作符 BETWEEN … AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
SELECT * FROM posts WHERE name BETWEEN 'Adams' AND 'Carter'
范围之外的人,请使用 NOT 操作符
SELECT * FROM posts WHERE name NOT BETWEEN 'Adams' AND 'Carter'
10. AS (Alias 别名)
可以为列名称和表名称指定别名(Alias)。
SELECT name AS n, title AS t FROM posts
11. JOIN
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
JOIN: 如果表中有至少一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
1. LEFT JOIN 关键字
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
SELECT id, brand, sa.state_name AS state FROM shopping AS shop LEFT JOIN state_alias AS sa ON (sa.state_abbr = shop.state)
12. SQL 函数
函数语法:
SELECT function(列) FROM 表
SQL 拥有很多可用于计数和计算的内建函数。
函数 | 描述 |
---|---|
AVG(column) | 返回某列的平均值 |
COUNT(column) | 返回某列的行数(不包括NULL值) |
FIRST(column) | 返回在指定的列中第一个记录的值 |
LAST(column) | 返回在指定的域中最后一个记录的值 |
MAX(column) | 返回某列的最高值 |
MIN(column) | 返回某列的最低值 |
SUM(column) | 返回某列的总和 |
ROUND(column,decimals) | 把数值字段舍入为指定的小数位数 |
NOW() | 返回当前的日期和时间 |
FORMAT(Now(),’YYYY-MM-DD’) | 用于对字段的显示进行格式化 |
13. GROUP BY 语句
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句。
GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。
我们拥有下面这个 “Orders” 表:
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
现在,我们希望查找每个客户的总金额(总订单)。
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
结果集类似这样:
Customer | SUM(OrderPrice) |
---|---|
Bush | 2000 |
Carter | 1700 |
Adams | 2000 |
让我们看一下如果省略 GROUP BY 会出现什么情况:
Customer | SUM(OrderPrice) |
---|---|
Bush | 5700 |
Carter | 5700 |
Bush | 5700 |
Bush | 5700 |
Adams | 5700 |
Carter | 5700 |
其它实例:
select state,count(state) from shopping GROUP BY state