转行的辛酸。。。加油!
1.了解SQL
1.1.1数据库
保存有组织的数据的容器
1.1.2表
某种特定类型数据的结构化清单
存储在表中的数据是同一种类型的数据或者清单
表名是唯一的
1.1.3列和数据类型
表由列组成。列存储表中某部分的信息
列(column):表中的一个字段。所有表都是有一个或多个列组成的
数据库中每个列都有相应的数据类型。数据类型定义了列可以存储哪些数据种类。
1.1.4行
表中的数据是按行存储的,所保存的每个记录存储在自己的行内。
1.1.5主键
表中每一行都应有一列(或几列)可以唯一标识自己。
主键(primary key):一列(或一组列),其值能够唯一标识表中每一行
唯一标识表中每行的这个列(或这几列)称为主键,主键用来表示一个特定的行。没有主键,更新或删除表中特定行就极为困难
表中任何列都可以作为主键,只需要满足以下的条件:
- 任意两行都不具有相同的主键值
- 每一行都必须具有一个主键值(主键列不允许NULL)
- 主键列中的值不允许修改或者更新
- 主键值不能重用(如果某行从表中删除,它的主键不能赋值给以后的新行)
主键通常定义在表的一列上,但并不是必须这么做,也可以一起使用多列作为主键。在使用多列作为主键时,上述条件必须应用到所有列,所有列值的组合必须是唯一的(但是单个列的值可以不唯一)。
2.检索数据
2.1SELECT语句
关键字(keyword)
作为SQL组成部分的保留字。关键字不能用作表或列的名字。
2.2检索单个列
SELECT prod_name
FROM Products;
多条SQL语句必须以分好(;)分隔。SQL语句部分大小写,因此SELECT与select是相同的。
2.3检索单个列
检索多个列必须是在SELECT关键字后面给出多个列名,列名之间必须以逗号分隔。
2.4检索所有列
SELECT * FROM Products;
如果给定一个通配符(*),则返回表中所有列。
2.5检索不同的值
使用DISTINCT关键字,顾名思义,指示数据库只返回不同的值
SELECT DISTINCT vend_id FROM Products;
2.6限制结果
SELECT prod_name FROM Products LIMIT 5 OFFSET 5;
指示MYSQL返回从第5行起的5行数据,第一个数字是检索的行数,第二个数字是指从哪里开始。
3.排序检索数据
3.1排序数据
SELECT prod_name FROM Products;
为了明确地排序用SELECT语句检索出的数据,可以使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。
ORDER BY语句应当是SELECT语句中最后一条子句。
3.2按多个列排序
要按多个列排序,简单指定列名,列名之间用逗号分开即可
下面的代码检索3个列,并按其中两个列对结果进行排序----首先按价格,然后按名称排序。
SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price,prod_name;
3.3 按列位置排序
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指定排序方向
降序排序指定DESC关键字
SELECT prod_id,prod_price,prod_name FROM Products ORDER BY prod_price DESC ,prod_name;
DESC关键字只应用到直接位于其前面的列名。例如prod_price列以降序排列,而prod_name列(在每个价格内)仍然按标准的升序排列。
4 过滤数据
4.1使用WHERE 子句
在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出。
SELECT prod_name,prod_price FROM Products WHERE prod_price=3.49;
这条语句从products表中检索两个列,但不返回所有行,只返回prod_price值为3.49的行。
同时使用ORDER BY和WHERE子句时,应该让ORDER BY语句位于WHERE子句之后。
4.2WHERE子句操作符
4.2.1检查单个值
SELECT prod_name ,prod_price FROM Products WHERE prod_price<=10;
4.2.2不匹配检查
SELECT vend_id,prod_name FROM Products WHERE vend_id <> 'DLL01';
SELECT vend_id,prod_name FROM Products WHERE vend_id !='DLL01';
4.2.3 范围值检查
要检查某个范围的值,可以使用BETWEEN操作符
SELECT prod_name,prod_price FROM Products WHERE prod_price BETWEEN 5 AND 10;
在使用BETWEEN时,必须指定两个值—所需范围的低端值和高端值。这两个值必须使用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。
4.2.4空值检查
一个列不包含值时,称其包含空值NULL。
NULL:无值(no value),它与字段包含0、空字符串或仅仅包含空格不同
确定值是否为NULL,使用的WHERE子句为IS NULL子句。
SELECT prod_name FROM Products WHERE prod_price IS NULL;
5.高级数据过滤
5.1组合WHERE子句
SQL允许给出多个WHERE子句,这些子句有两种方式,即以AND子句或OR子句的方式使用。
操作符(operator):
用来联结或改变WHERE子句中的子句的关键字,也称为逻辑操作符(logical operator)
5.1.1AND操作符
AND用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行
SELECT prod_id,prod_price,prod_name FROM Products WHERE vend_id='DLL01' AND prod_price <= 4;
5.1.2OR操作符
OR用在WHERE子句中使用的关键字,用来表示检索匹配任一给定条件的行
5.1.3求值顺序
在处理OR操作符前,优先处理AND操作符。
SELECT prod_name,prod_price FROM Products WHERE (vend_id='DLL01' OR vend_id='BRS01') AND prod_price >= 10;
圆括号相当于明确的分组操作符
5.2IN操作符
In操作符用来指定条件范围,范围中的每个条件都可以进行匹配
SELECT prod_name ,prod_price FROM Products WHERE vend_id IN ('DLL01','BRS01') ORDER BY prod_name;
SELECT prod_name,prod_price FROM Products WHERE vend_id='DLL01' OR 'BRS01' ORDER BY prod_name;
为什么要使用In操作符?
- 在有很多合法选项时,IN操作符的语法更加的清除,更直观
- 在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理
- IN操作符比一组OR操作符执行的更快
- IN的最大的优点是可以包含其他的SELECT语句,更加动态的建立WHERE子句。
5.3NOT操作符
WHERE子句中的NOT操作符有且只有一个功能,那就是否定其后所跟的任何条件
SELECT prod_name FROM Products WHERE NOT vend_id='DLL01' ORDER BY prod_name;
这里的NOT否定跟在其后的条件,因此匹配非DLL01之外的所有东西。
等价于
SELECT prod_name FROM Products WHERE vend_id <> 'DLL01' ORDER BY prod_name;
6.用通配符进行过滤
6.1LIKE操作符
通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索
6.1.1百分号(%)通配符
最常使用的通配符是百分号(%)。在搜索中,%表示任何字符出现任意次数
SELECT prod_id,prod_name FROM Products WHERE prod_name LIKE 'Fish%';
通配符可在搜索模式中的任意位置使用,且可以使用多个通配符。
SLECT prod_name ,prod_price FROM Products WHERE prod_name LIKE '%bean bag%';
%代表搜索模式中给定位置的0个、1个或多个字符。
通配符%
6.1.2下划线(_)通配符
另一个有用的通配符是下划线(_)。只能匹配单个字符,而不是多个字符。
6.1.3方括号([])通配符
方括号([])通配符来指定一个字符集,必须匹配指定位置(通配符的位置)的一个字符
8