1、了解SQL
1.1 数据库基础
1.1.1 数据库 database
保存有组织的数据的容器(通常是一个文件或一组文件)
1.1.2 表 table
某种特定数据类型数据的结构化清单。
数据库中的每个表都有一个名字来标识自己。这个名字是唯一的,即数据库中没有其他表具有相同的名字。但在不同的数据库中完全可以使用相同的表名。
1.1.3 列和数据类型
表由列组成。列存储表中某部分的信息。
列 column
表中的一个字段。所有表都是由一个或多个列组成的。
数据类型
所允许的数据的类型。每个表列都有相应的数据类型,它限制(或允许)该列中存储的数据。
1.1.4 行 row
表中的数据都是按行存储的,所保存的每个记录存储在自己的行内。
表中的一个记录。
1.1.5 主键 primary key
一列(或一组列),其值能够唯一标识表中每一行。
表中的任何列都可以作为主键,只要它满足以下条件:
任意两行都不具有相同的主键值;
每一行都必须具有一个主键值(主键列不允许NULL值);
主键列中的值不允许修改或更新;
主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)。
主键通常定义在表的一列上,但并不是必需这么做,也可以一起使用多个列作为主键。在使用多列作为主键时,上述条件必须应用到所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。
1.2 什么是SQL
SQL是Structured Query Language(结构化查询语言)的缩写,是一种专门用来与数据库沟通的语言。
优点:
(1)SQL不是某个特定数据库供应商专有的语言。几乎所有重要的DBMS都支持SQL,所以学习此语言使你几乎能与所有数据库打交道。
(2)SQL简单易学。
(3)SQL是一种强有力的语言,灵活使用其语言元素,可以进行正常复杂和高级的数据库操作。
2、 检索数据
2.1 SELECT语句
从一个或多个表中检索信息。
为了使用SELECT检索数据,必须至少给出两条信息----想选择什么,以及从什么地方选择。
2.2 检索单个列
输入:
SELECT prod_name FROM Products;
分析:
上述语句利用SELECT 语句从Products表中检索一个名为prod_name的列。
所需的列名写在SELECT关键字之后,FROM关键字指出从哪个表中检索数据。
2.3 检索多个列
从一个表中检索多个列,必须在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。
提示:
在选择多个列时,一定要在列名之后加上逗号,但最后一个列名之后不加。如果最后一个列名之后加了逗号,将出现错误。
输入:
SELECT prod_id, prod_name, prod_price From Products;
分析:
使用SELECT语句从表Products中选择数据,指定3列,列名之间用逗号分隔。
2.4 检索所有列
SELECT语句检索所有列时,在实际列名的位置使用星号(*)通配符可以做到。
输入:
SELECT * FROM Products;
分析:
给定一个通配符(*),则返回表中所有列。列的顺序一般是列在表定义中出现的物理顺序,但并不总是如此。
2.5 检索不同的值
使用DISTINCT关键字,指示数据库只返回不同的值。
输入:
SELECT DISTINCT vend_id FROM Products;
分析:
SELECT DISTINCT vend_id告诉DBMS只返回不同(具有唯一性)的vend_id行。如果使用DISTINCT关键字,它必须直接放在列名的前面。
注意:不能不分使用DISTINCT
DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。例如,指定SELECT DISTINCT vend_id, prod_price,因为指定的两列不完全相同,所以所有的行都会被检索出来。
2.6 限制结果
SELECT语句返回指定表中所有匹配的行,很可能是每一行。如果只想返回第一行或者一定数量的行是可行的,只是各种数据库中的这一SQL实现并不相同。
(1)SQL Server和Access中使用SELECT时,可以使用TOP关键字来限制最多返回多少行
SELECT TOP 5 prod_name FROM Products; -- 只检索前5行数据
(2)DB2
SELECT prod_name FROM Products FETCH FIRST 5 ROWS ONLY;
(3)Oracle基于ROWNUM(行计数器)来计算行
SELECT prod_name FROM Products WHERE ROWNUM <=5;
(4)MySQL、MariaDB、PostgreSQL、SQLite使用LIMIT子句
SELECT prod_name FROM Products LIMIT 5; -- LIMIT 5指示MySQL等DBMS返回不超过5行的数据
SELECT prod_name FROM Products LIMIT 5 OFFSET 5; -- LIMIT 5 OFFSET 5指示MySQL等DBMS返回从第5行起的5行数据。第一个数字是检索的行数,第二个数字是指从哪儿开始。
注意:第0行
第一个被检索的行是第0行,而不是第1行。因此,LIMIT 1 OFFSET 1会检索第2行,而不是第1行。
提示:MySQL、MariaDB、SQLite捷径
MySQL、MariaDB、SQLite支持简化版的LIMIT 4 OFFSET 3语句,即LIMIT 3,4。使用这个语法,逗号之前的值对应OFFSET,逗号之后的值对应LIMIT。
2.7 使用注释
(1)行内注释
输入:
SELECT prod_name -- 注释内容
FROM Products;
分析:
注释使用--(两个连字符)嵌在行内。--之后的文本就是注释
(2)行内注释
输入:
# 注释内容
SELECT prod_name
FROM Products;
分析:
在一行的开始处使用#,这一整行都将作为注释。
(3)多行注释
输入:
/* SELECT prod_id, prod_name
From Products; */
SELECT prod_name
FROM Products;
分析:
注释从/*看是,到*/结束,/*和*/之间的任何内容都是注释。
3、排序检索数据
3.1 排序数据
如果不排序,数据一般将以它在底层中表现的顺序显示,这有可能是数据最初添加到表中的顺序。但是,如果数据随后进行过更新或删除,那么这个顺序将会受到DBMS重用回收存储空间的方式的影响。因此,如果不明确控制的话,则最终的结果不能(也不应该)依赖该排序顺序。
为了明确的排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。
输入:
SELECT prod_name FROM Products ORDER BY prod_name;
分析:
以字母顺序排序
注意:ORDER BY子句的位置
ORDER BY子句是SELECT语句中最后一条子句。
提示:
ORDER BY子句中使用的列将是为显示而选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。
3.2 安多个列排序
要按多个列排序,简单指定列名,列明之间用逗号分开即可。
输入:
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price, prod_name;
在按多个列排序时,排序的顺序完全按规定进行。
3.3 按列位置排序
除了能用列名指出排序顺序外,ORDER BY还支持按相对列位置进行排序。
输入:
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3;
分析:
ORDER BY 2表示按SELECT清单中的第二个列prod_price进行排序。ORDER BY 2, 3表示先按prod_price,再按prod_name进行排序。
3.4 指定排序方向
数据排序默认的是生序排序(从A到Z),还可以使用ORDER BY子句进行降序排序,必须指定DESC关键字。
输入:
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price DESC;
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price DESC, prod_name;
分析:
DESC关键字只应用到直接位于其前面的列名。只对prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序。
警告:在多个列上降序排序
如果想在多个列上进行降序排序,必须对每一列指定DESC关键字。