SQL必知必会 第一篇
第一课
主键(primary key):一列或一组列,其值能够唯一标识表中的每一行
1. 任意两行都不具有相同的主键值
2. 每一行都必须有一个主键值(不允许NULL)
3. 主键列中的值不允许修改或更新
4. 主键值不能重用(如果从表中删掉某行,它的主键不能赋给以后的新行)
所使用的是SQL Server,在开始正式的练习前先给出所用的数据库关系图:
第二课
这一课介绍如何使用SELECT语句从表中检索一个或多个数据列
主要代码如下:
select prod_name
from products;
select prod_id, prod_name, prod_price
from products;
select *
from products;
select distinct vend_id
from products;
select top 5 prod_name
from Products;
select prod_name --这是一条注释
from Products;
1. SQL不区分大小写
2.(*)表示通配符,表示返回表中所有列,最好不要使用*通配符
3. DISTINCT 关键字指示数据库只返回不同的值,而且作用于所有的列,不能部分使用
4. 在SQL Server中,用TOP关键字来限制最多返回多少行
5. 第一个被检索的行是第0行,不是第1行,这里要注意
6. 注释用--或者#都可以
小结:这一课讲了如何使用SQL的SELECT语句来检索单个表列,多个表列以及所有表列。讲了如何返回不同的值,如何注释代码。不幸的是,更复杂的SQL使得SQL代码变得不轻便。
第三课
这一课讲授如何使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据
主要代码如下:
select prod_name
from products
order by prod_name;
select prod_id, prod_price, prod_name
from products
order by prod_price, prod_name;
select prod_id, prod_price, prod_name
from Products
order by 2, 3;
select prod_id, prod_price, prod_name
from Products
order by prod_price desc, prod_name;
1. ORDER BY语句应该处于SELECT语句中的最后一句
2. 可以使用非检索的列进行排序
3. 按多个列排序时,排序的顺序按照规定进行
4. 可以用相对列位置进行排序
5. ORDER BY语句是默认升序排序的,如果想要降序排序,使用DESC关键字,DESC关键字只作用于直接位于其前面的列名
6. 如果需要区分大小写和排序顺序,要请求数据库管理员的帮助
小结:这一课讲了如何用SELECT语句的ORDER BY子句对检索出的数据进行排序。这个字句必须是SELECT语句中的最后一条子句。根据需要,可以用它在一个或多个列上对数据进行排序。
第四课
这一课讲授如何使用SELECT语句的WHERE子句指定搜索条件
主要代码如下:
select prod_name, prod_price
from products
where prod_price = 3.49;
select prod_name, prod_price
from Products
where prod_price < 10;
select prod_name, prod_price
from Products
where prod_price <= 10;
select vend_id, prod_name
from Products
where vend_id <> 'DLL01';
select vend_id, prod_name
from Products
where vend_id != 'DLL01';
select prod_name, prod_price
from Products
where prod_price between 5 and 10;
select prod_name
from Products
where prod_price is null;
select cust_name
from Customers
where cust_email is null;
1. 在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤
2. 在同时使用ORDER BY子句和WHERE子句时,应该让ORDER BY子句位于WHERE之后
3. 操作符的兼容性取决于DBMS
4. 单引号用来限定字符串,如果将值与字符串类型的列进行比较,就需要单引号
5. 通过过滤选择不包含指定值的所有行时,可能希望返回含NULL值的行,但是这做不到。过滤数据时,一定要验证被过滤列中含NULL的行确实出现在返回的数据中
小结:这一课讲了如何使用SELECT语句的WHERE子句过滤返回的数据。此外,还有如何检验相等、不相等、大于、小于、值的范围以及NULL值等。
第五课
这一课讲授如何组合WHERE子句来建立功能更强、更高级的搜索条件。还有,将学习如何使用NOT和IN操作符
主要代码如下:
select prod_id, prod_price, prod_name
from Products
where vend_id = 'DLL01' and prod_price <= 4;
select prod_name, prod_price
from Products
where vend_id = 'DLL01' or vend_id = 'BRS01';
select prod_name, prod_price
from Products
where (vend_id = 'DLL01' or vend_id = 'BRS01')
and prod_price >= 10;
select prod_name, prod_price
from Products
where vend_id in ('DLL01', 'BRS01')
order by prod_name;
select prod_name
from Products
where not vend_id = 'DLL01'
order by prod_name;
1. 在使用具有AND和OR操作符时,应该加括号来明确地分组,不要依赖于默认的求值顺序(先AND后OR)
2. IN和NOT操作符具有更多的优势,尽量多使用
小结:这一课讲授了如何用AND和OR操作符组合成WHERE子句,还讲授了如何明确地管理求值顺序,如何使用IN和NOT操作符
第六课
这一课介绍什么是通配符、如何使用通配符以及怎样使用LIKE操作符进行通配搜索,以便对数据进行复杂过滤
主要代码如下:
select prod_id, prod_name
from Products
where prod_name like 'fish%';
select prod_id, prod_name
from Products
where prod_name like '%bean bag%';
select prod_name
from Products
where prod_name like 'f%y';
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';
select cust_contact from Customers
where cust_contact like '[jm]%'
order by cust_contact;
select cust_contact
from Customers
where cust_contact like '[^jm]%'
order by cust_contact;
select cust_contact
from Customers
where not cust_contact like '[jm]%'
order by cust_contact;
1. 通配符(wildcard)是用来匹配一部分的特殊字符
2. LIKE操作符指示DBMS,后面的搜索模式利用通配符匹配而不是简单的相等匹配
3. 配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索
4. %表示任意字符出现任意次数,代表搜索模式中给定位置的0个、1个或多个字符
5. 如果DBMS用空格来填补字段的内容,会使 'f%y'这样的语句没成功检索想要的结果,简单的解决办法是给搜索模式再增加一个%号:'f%y%',更好的解决办法是使用函数(见第八课)
6. 通配符%无法匹配NULL,NULL表示的是不存在
7. 通配符_每次只匹配单个字符,而不是多个字符
8. 使用__时注意要在后面加一个空格,否则空格也是字符会被匹配,会产生错误
9. [jm]匹配括号里任意一个字符,它也只能匹配单个字符,此通配符可以用前缀字符^来否定
10. 通配符搜索比前面讨论的其他搜索要耗费更长的时间,不要过度使用通配符
11. 如果确实要使用通配符,也尽量不要把它放在搜索模式的开始处,这样是最慢的
12. 仔细注意通配符的位置
小结:这一课介绍了什么是通配符,如何在WHERE子句中使用SQL通配符,还说明了通配符应该细心使用,不要使用过度