《SQL必知必会》读书笔记
说明:本书SQL语句均使用PLSQL Developer客户端,在oracle数据库中实践。
1. 基本概念
表(table):某种特定类型数据的结构化清单。
模式(schema):用来描述数据库中特定的表,也可以用来描述整个数据库(和其中表的关系)
主键(primary key):一列(或一组列),其值能够唯一标识表中的每一行。主键满足条件:
Ø 任意两行都不具有相同的主键值;
Ø 每一行都必须具有一个主键值(主键列不允许NULL值);
Ø 主键列中的值不允许修改或更新;
Ø 主键值不能重复使用(如果某行从表中删除,它的主键不能赋给以后的新行)。
2. 检索数据(select)
2.1 检索单个列
select 列名 from 表名;
select 列名1, 列名2;列名3 from 表名;
select * from 表名;
2.2 检索不同的值
distinct关键字:指示数据库只返回不同的值(返回结果的唯一性)。
select distinct 列名1, 列名2 from 表名;
注:distinct 关键字作用于所有列,不能部分使用distinct。
2.3 限制结果
Ø 在SQL Server和Access中,用关键字TOP
selecttop 5 列名 from表名;
Ø 在DB2中
select列名 from 表名 fetch first 5rows only;
Ø 在oracle中,用rownum
select列名 from 表名 whererownum<=5;
Ø 在MySQL、MariaDB、PostgreSQL或者SQLite,用limit
select列名 from 表名 limit 5 offset5;
3. 创建用户
createuser 用户名identified by 用户密码default tablespace 表空间名;
4. 设置权限
grant all on 表名 to 用户名;
5. 排序检索数据(order by)
5.1 多个列排序
select 列名1,列名2,列名3 from 表名 order by 列名2, 列名3;
注:仅在当多个行具有相同的列名2时,则按列名3排序;如果列名2中的所有值唯一,则不会按列名3排序。
5.2 按列位置排序
select 列名1,列名2,列名3 from 表名 order by 2, 3;
5.3 指定排序方向
select 列名1,列名2,列名3 from 表名 order by 列名2 DESC, 列名3;
注:DESC只应用到直接位于其前面的列名,上面列名3按升序(ASC)排序。
注:在指定一条order by子句时,应该保证它是select语句中最后一条子句。
6. 过滤数据(where、not、in)
6.1 where子句
select 列名1,列名2 from 表名 where 列名2<10;
where子句操作符
操作符 |
说明 |
操作符 |
说明 |
= |
等于 |
> |
大于 |
<>/!= |
不等于 |
!>= |
不小于(大于等于) |
< |
小于 |
between |
两值之间 |
<=/!> |
小于等于(不大于) |
is null |
为NULL值 |
<>和!=通常可以互换,但并非所有的DBMS都支持这两种操作符。
6.2 where…and…
select列名1,列名2 from 表名 where 条件1 and 条件2;
and操作符用在where子句,用来指示检索满足所有给定条件的行。
6.3 where…or…
select列名1,列名2 from 表名 where 条件1 or条件2;
or操作符用在where子句,用来表示检索匹配任一给定条件的行,当第一个条件满足时,不管第二个条件是否满足,相应的行都将被检索出来。
select prod_name,prod_price,VEND_ID from products where vend_id='DLL01'OR VEND_ID='BRS01';
6.4 where…or…and…
select prod_name,prod_price,VEND_ID from products where vend_id='DLL01'OR VEND_ID='BRS01'and prod_price>=10;
出现以上现象的原因是操作符优先级问题,SQL在处理or之前,优先处理and,故应使用圆括号对操作符进行明确分组。
select prod_name,prod_price,VEND_ID from products where (vend_id='DLL01'OR VEND_ID='BRS01') and prod_price>=10;
6.5 in操作符
in操作符用来指定条件范围,范围中的每个条件都可以进行匹配。in取一组由逗号分隔、括在圆括号中的合法值。
select prod_name,prod_price,VEND_ID from products where vend_id in ('DLL01','BRS01') order by prod_name;
in操作符完成了与or相同的功能,使用in操作符的优点:
Ø in操作符的语法更清楚,更直观。
Ø 在与其他and和or操作符组合使用in时,求值顺序更容易管理。
Ø in操作符一般比一组or操作符执行的更快。
Ø in最大的优点是可以包含其他select语句,能更动态地建立where子句。
6.6 not操作符
not在where子句中用来否定其后条件的关键字,它从不单独使用,可以用在要过滤的列前,也可以用在其后。
select prod_name,vend_id from products wherenot vend_id='DLL01'orderby prod_name;
注:not在功能上等同于<>/!=,它在复杂语句更有用。
7. 通配符的使用(like)
通配符:用来匹配值的一部分的特殊字符。
搜索模式:由字面值、通配符或两者组合构成的搜索条件。
通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索。
7.1 百分号%
%表示任何字符出现任意次数。
select prod_id,prod_name from products where prod_name like'Fish%';
%表示接受Fish之后的任意字符,不管它有多少字符。(注意字符串的大小写)。
select prod_id,prod_name from products where prod_name like'%bean bag%';
搜索模式'%bean bag%'表示匹配任何位置上包含文本bean bag的值,不论它之前或之后出现什么字符。
%能匹配0个、一个或多个字符。例如where email like‘b%@forta.com’,%代表搜索模式中给定位置的0个、1个或多个字符。
select prod_id,prod_name from products where prod_name like 'F%y%';
匹配以F开头、以y结尾的prod_name,为了防止y之后有空格,所以y后面加%以匹配y之后的字符(空格)。
注:’%’不会匹配产品名称为NULL的行。例如:子句where prod_name like ’%’。
7.2 下划线(_)通配符
下划线的用途与%一样,但它只匹配单个字符,而不是多个字符。DB2不支持通配符_,且Microsoft Access,用?而不是_。
select prod_id,prod_name from products where prod_name like'_ inch teddy bear';
select prod_id,prod_name from products where prod_name like'__ inch teddy bear';
说明:一个_只匹配一个字符,如“8”。__匹配两个字符,如“12”。
7.3 方括号([])通配符
方括号([])通配符用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。
只有Access和SQL Server支持集合。
例,找出所有名字以J或M起头的联系人,可进行如下查询:select cust_contact from customers where cust_contact like'[JM]%'orderby cust_contact;
[JM]匹配方括号中任意一个字符,它也只能匹配单个字符,任何多于一个字符的名字都不匹配。
select cust_contact from customers where cust_contact like'[^JM]%'orderby cust_contact;
匹配以J和M之外的任意字符起头的任意联系人名,与上一个语句作用刚好相反。
Access中使用!否定,而不是^。