《SQL必知必会》(1-7)

《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';

《SQL必知必会》(1-7)_第1张图片

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必知必会》(1-7)_第2张图片

出现以上现象的原因是操作符优先级问题,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;

《SQL必知必会》(1-7)_第3张图片

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;

《SQL必知必会》(1-7)_第4张图片 

注: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中使用!否定,而不是^。

你可能感兴趣的:(《SQL必知必会》(1-7))