SQL In 10 minutes
v5
1 了解SQL
数据库基础
数据库:数据库是以某种有组织的方式存储的数据集合。 表:一种结构化的文件,可以用来存储某种特定类型的数据。某种特定类型数据的结构化清单。 模式:关于数据库和表的布局及特性的信息。 列:表中的一个字段。所有表都有一个或多个列组成的。 数据类型:允许什么类型的数据。每个表列都有相应的数据类型,它限制该列中存储的数据。 数据类型兼容:数据类型及其名称是SQL不兼容的一个主要原因。虽然大多数基本数据类型得到了一致的支持,但许多高级的数据类型却没有。更糟糕的是,偶尔会有相同的数据类型在不同的DBMS中有不同的名称。 行:表中的一条记录。 主键(primary key):一列或几列,其值能够唯一标识表中每一行。 应该总是定义主键:虽然并不总是需要主键,但多数数据库设计者都会保证每个表中有主键,以便于以后 的数据操作和管理。
- 任意两列不具有相同的主键值
- 每一行都必须具有一个主键值(主键列不允许空值NULL)
- 主键列不允许修改或更新
- 主键不能重用(如果某行从表中删除,他的主键不能赋值给以后的新行)
什么是SQL
Structured Query Language结构化查询语言 设计SQL的目的:提供一种从数据库中读写数据的简单有效的方法。 标准SQL由ANSI标准委员会管理,从而称为ANSI SQL。 推荐DBMS:
- MySQL(或派生的MariaDB)
- Microsoft SQL Server Express
2 检索数据
SELECT语句
检索单个列
SELECT prod_name
FROM Products;
多条SQL必须以分号(;)分割 SQL语句不区分大小写,许多开发人员喜欢对SQL关键字使用大写,而对列名和表名使用小写,这样做代码更易于阅读和调试。
SELECT prod_name
FROM Products;
SELECT prod_name FROM Products;
SELECT
prod_name
FROM
Products;
多数SQL开发人员认为,将SQL语句分成多行更容易阅读和调试。
检索多个列
SELECT prod_id, prod_name, prod_price
FROM Products;
检索所有列
SELECT *
FROM Products;
一般而言,除非你确实需要表中的每一列,否则最好别使用*通配符。虽然省事,但检索不需要的列通常会降低检索速度和应用程序的性能。 使用通配符最大的优点是可以检索出未知的列。
检索不同的值
SELECT DISTINCT vend_id
FROM Products;
不能部分使用DISTINCT,该关键字作用于所有列。
限制结果
只检索前5行。 SQLServer
SELECT TOP 5 prod_name
FROM Products;
Oracle:
SELECT prod_name
FROM Products
WHERE ROWNUM <=5;
MySQL
SELECT prod_name
FROM Products
LIMIT 5;
-- 6-10行
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
-- OFFSET从0开始
SELECT prod_name
FROM Products
LIMIT 1, 3; 从1开始3行,与上面同义。
使用注释
-- 推荐两个连字符 单行,或行内
-- --------------------
-- 多行注释
-- --------------------
# 单行
/*
多行,这两种方式有些DBMS不支持
*/
3 排序检索数据
SELECT的ORDER BY子句
排序数据
子句:由一个关键字加上所提供的数据组成。例如SELECT语句的FROM子句。
SELECT prod_name
FROM Products
ORDER BY prod_name;
ORDER BY子句应该放在SELECT语句的最后,否则会出错。 可以通过非选择列进行排序,是完全合法的。
按多个列排序
-- 先对价格排序再对名称排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
按列位置排序
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3; -- 相当于 ORDER BY prod_price, prod_name;
优点是不用重复输入列名,缺点是如果排序的列不在选择列中,则不能使用。
指定排序方向
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price DESC, prod_name;
DESC是降序,ASC是升序,升序是默认不写也行。
区分大小写和排序顺序 A与a相同吗?a位于B之前还是Z之后,其答案取决于数据库的设置方式。ORDER BY做不到,需要DBA的帮助。
4 过滤数据
SELECT语句的WHERE子句指定搜索条件。
使用WHERE子句
数据库表一般包含大量的数据,很少检索表中所有行。只检索所需数据需要指定搜索条件(search condition),搜索条件也成为过滤条件(filter condition)。 WHERE子句在表名之后给出。
SELECT prod_name, prod_price
FROM Products
WHERE prod_price = 3.49;
SQL过滤和应用过滤 客户端应用过滤将会极大的影响应用的性能,此外服务器不得不通过网络发送多余的数据,导致 网络带宽浪费。
WHERE子句操作符
- 大于 小于 等于 不等于<> 大于等于 小于等于
- BETWEEN AND 范围检查
- IS NULL 空值检查
字符串需要使用单引号例如 vend_id != 'DLL01';
5 高级数据过滤
如何组合WHERE子句以建立功能更强、更高级的搜索条件。还将学习NOT和IN操作符。
组合WHERE子句
AND操作符
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' AND prod_price <= 4;
OR操作符
SELECT prod_id, prod_price, prod_name
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01';