SQL必知必会学习笔记(1~6)
第一课 了解SQL
1.1数据库基础
数据库:保存有组织的数据的容器(通常是一个文件或一组文件)。
表:某种特定类型数据的结构化清单
列:表中的一个字段。所有表都是由一个或多个列组成的。
数据类型:所允许的数据的类型。每个表都有相应的数据类型,它限制(或允许)该列中存储的数据。
行:表中的一个记录。
主键:一列(或一组列),其值能够唯一标识表中的每一行。
表中的任何列都可以作为主键,只要满足:
任意两行都不具有相同主键值;
每一行都必须有一个主键值;
主键列中的值不允许修改或更新;
主键值不能重用(如果某行从表中删除,他的主键不能赋给以后的新行)。
可以一起使用多个列作为主键,使用多列作为主键时,上述条件必须应用到所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。
1.2什么是SQL
SQL是Structured Query Language(结构化查询语言)的缩写,是一种专门用来与数据库沟通的语言。
第二课 检索数据
2.1SELECT语句
关键字(keyword):作为SQL组成部分的保留字。关键字不能用作表或列的名字。
2.2检索单个列
例:SELECT prod_name
From Products;
利用SELECT语句从Products表中检索名为prod_name的列。
如果没有明确排序查询结果,返回的数据没有特定的顺序。
2.3检索多个列
列名间加逗号
例:
SELECT prod_name, prod_id
From Products;
2.4检索所有列
使用通配符 * 代表检索所有
2.5检索不同的值
使用DISTINCT关键字,它指示数据库只返回不同的值
例:SELECT DISTINCT vend_id
FROM Products;
如果使用DISTINCT关键字,必须直接放到列名前面。
DISTINCT作用于所有列,若指令多列只有多个列的值完全相同才不会被检索,若不完全相同,则会被检索出来。
2.6限制结果
SQL server和Access中:使用TOP关键字来限制最多返回多少行
例:
SELECT TOP 5 prod_name
FROM Products;
DB2中:
例:
SELECT prod_name
FROM Products
FETCH FIRST 5 ROWS ONLY;
Oracle:需要基于ROWNUM(行计数器)来计算行
例:
SELECT prod_name
FROM Products
WHERE ROWNUM <= 5;
MySQL、MariaDB、PostgreSQL、SQLite:使用LIMIT子句
例:
SELECT prod_name
FROM Products
LIMIT 5;
为了得到后面的5行数据,需要指定从哪里开始以及检索行数,
例:
SELECT prod_name
FROM Products
LIMIT 5 OFFSET 5;
LIMIT 5 OFFSET 5指示MySQL等DBMS返回从第五行起的五行数据。第一个数字是检索的行数,第二个数字是指从哪开始。
注意:第一个被检索的是第0行,而不是第1行,即LIMIT 1 OFFSET 1将会从第二行开始检索。
例:LIMIT 4 OFFSET 3 可以进行简化为 LIMIT 3, 4 前面的值对应OFFSET,逗号后面的值对应LIMIT。
2.7使用注释
–(两个连字符)行内注释
# 行内注释(很少得到支持),一行的开始处使用#,一整行都将作为注释
/* */ 多行注释
第三课 排序检索数据
3.1排序数据
为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句,ORDER BY子句取一个或多个列的名字,据此对输出进行排序。。
例:
SELECT prod_name
FROM Products
ORDER BY prod_name;
**注意:**在指定ORDER BY子句时,必须保证它是SELECT语句中最后一条子句。
可以使用非检索列进行排序。
3.2按多个列排序
例:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY prod_price, prod_name;
按规定顺序进行排序,即如果prod_price相等时,再对prod_name进行排序。
3.3按列位置进行排序
例:
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2, 3;
按非选择列排序时,可以混合使用实际列名和相对列位置。
3.4指定排序方向
默认升序 ASC
降序 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只应用于直接位于其前面的列名。若想在多个列上进行降序升序,必须对每一列指定DESC关键字。
提示:区分大小写和排序顺序
在字典(dictionary)排序顺序中,A被视为和a相同,这是大多数数据库管理系统的默认行为。
第四课 过滤数据
4.1使用WHERE语句
只检索所需数据需要指定搜索条件,搜索条件也称为过滤条件。
例:
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子句操作符
操作符 | 说明 |
---|---|
= | 等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
!< | 不小于 |
> | 大于 |
>= | 大于等于 |
!> | 不大于 |
BETWEEN | 在两个指定值之间(包括开始值和结束值) |
IS NULL | 为NULL值 |
使用单引号限定字符串,如果将值和字符串类型的列进行比较,就需要限定引号。
第五课 高级数据过滤
5.1组合WHERE子句
为了进行更强的过滤方式,SQL允许给出多个WHERE子句。这些子句有两种使用方式,即以AND子句或OR子句的方式使用。
**SQL在处理OR操作符前,优先处理AND操作符。**此问题的解决方法是使用圆括号对操作符明确分组。
5.2IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取一组由逗号分隔、括在圆括号中的合法值。
例:检索由供应商DLL01和BRS01制造的所有产品
SELECT prod_name, prod_price
FROM Products
WHERE vend_id IN ('DLL01', 'BRS01');
--等同于
SELECT prod_name, prod_price
FROM Products
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01');
IN操作符优点:
在有很多合法选项时,IN操作符的语法更清楚,更直观;
在与其他AND和OR操作符组合使用IN时,求值顺序更容易管理;
IN操作符一般比一组OR操作符执行得更快;
IN的最大优点是可以包含其他的SELECT语句,能够更动态的建立WHERE子句。
5.3NOT操作符
NOT操作符有且仅有一个功能,那就是否定其后所跟的任何条件。NOT从不单独使用,所以它的语法和其他操作符有所不同。NOT关键字可以用在要过滤的列前。
例:列出除供应商DLL01之外的所有供应商制造的产品
SELECT prod_name
FROM Products
WHERE NOT vend_id = 'DLL01';
NOT优点:在更复杂子句中,NOT非常有用。例如,在与IN操作符联合使用时,NOT可以非常简单的找出与条件列表不匹配的行。
第六课 用通配符进行过滤
6.1LIKE操作符
通配符:用来匹配值的一部分的特殊字符。
通配符本身实际上是SQL的WHERE子句中有特殊含义的字符,SQL支持几种通配符。为在搜索子句中使用通配符,必须使用LIKE操作符。
6.1.1百分号(%)通配符
在搜索串中,%表示任何字符出现任意次数。
例:找出所有以词Fish起头的产品
SELECT prod_id, prod_name
FROM Products
WHERE prod_name LIKE 'Fish%';
如果使用的是Microsoft Access,需要使用*而不是%。
通配符可以在搜索模式任意位置使用,并且可以使用多个通配符。
例如,搜索模式’%bean bag%‘表示匹配任何位置上半酣文本bean bag的值。'F%y’表示找出以F起头,y结尾的商品。
注意:除了能匹配一个或多个字符外,%还能匹配0个字符。
6.1.2下划线(_)通配符
下划线的用途与%一样,单只匹配单个字符。
注意:DB2不支持通配符_。如果使用的是Microsoft Access,需要使用?而不是_。
6.1.3方括号([ ])通配符
方括号通配符用来指定一个字符集,他必须匹配指定位置(通配符的位置)的一个字符。
注意:只有微软的Access和SQL server支持集合。
例:找出所有名字以J或M起头的联系人
SELECT cust_contact
FROM Customers
WHERE cust_contact LIKE '[JM]%';
[JM]匹配方括号中任意一个字符,它也只能匹配单个字符。
此通配符可以用^来否定,例如’[JM]%’,表示查找除J和M开头的联系人。(如使用的是Microsoft Access,需要使用!而不是^来否定一个集合)
6.2使用通配符的技巧
1)不要过度使用通配符,如果其他操作符能达到相同目的,应使用其他操作符。
2)在确实需要使用通配符时,也尽量不要把他们用在搜索模式的开始处。把通配符置于开始处,搜索起来是最慢的。
3)仔细注意通配符的位置。如果放错地方,可能会返回不想要的数据。