终于可以静下心来系统看一下SQL的东西,为了查阅方便特此记录,以下都是基于SQL必知必会教材,若能提出意见,不胜感激~~
select语句通常用于从表中检索数据,最主要的无非就是select...from...where...,然后在根据自己的需要添加一下字段、检索条件等等,如果省略了from子句后就是简单的访问和处理表达式,如select 3*2将返回6;select Now()将返回当前日期和时间
一、检索数据
检索所有列时可以使用通配符*(select * from),在不明确指定列名时可使用,在列名明确时不建议使用
select distinct prod_id,prod_name,prod_price --多个列时,列名之间加上逗号;distinct 去重,作用于其后的所有列;
from Products
limit 5 offset 5 --返回从第5行起的5行数据,这里的5不包括标题行
二、排序检索数据
排序默认是升序,降序关键字desc是descending缩写,order by 子句一定要放在where子句之后,否则会报错;多个SQL语句之间可用分号;隔开
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; --按列位置排序,先按第二列排序(price),再按第三列排序(name)
select prod_id,prod_price,prod_name
from Products
order by product_price desc,prod_name --desc关键字只应用到直接位于其前面的列名,所以先以价格降序排序产品,然后产品名仍然是标准的升序排序
三、过滤数据
where子句操作符
select vend_id,prod_name
from Products
where vend_id <> 'DLL01' ;--列出所有不是供应商DLL01制造的产品,单引号用于限定字符串
select prod_name
from Products
where product_price is null --is null 空值检查(空product_price字段,不是价格为0)
四、高级数据过滤——操作符(用来连接或改变where子句中的子句的关键字,也成为逻辑操作符)
select prod_id,prod_price,prod_name
from Products
where vend_id = 'DLL01' and prod_price <=4; --and操作符,用于检索满足所有给定条件的行
select prod_id,prod_price,prod_name
from Products
where vend_id = 'DLL01' and prod_price <=4; --or操作符,用于检索任一给定条件的行
select prod_id,prod_price,prod_name
from Products
where (vend_id = 'DLL01' or vend_id = 'BRS01') --选择由供应商DLL01和BRS01制造的且价格在10美元及以上的所有产品
and prod_price >= 10; --and操作符在求值过程中优先级高于or操作符,这种情况可以用圆括号对操作符进行明确分组,即圆括号求值的优先级高于and和or操作符
select prod_id,prod_price
from Products
where vend_id in ('DLL01','BRS01') --in操作符功能与OR相同,但in更清楚,直观
order by prod_name;
select prod_name
from Products
where not vend_id = 'DLL01' --not操作符功能与<>相同,但not可以否定in、between、exists子句
order by prod_name
五、用通配符进行过滤
当数据筛选的是不确定值时,我们可以用通配符(用来匹配值的一部分的特殊字符);
通配符搜索只能用于文本字段(字符串),非文本数据类型字段不能使用通配符搜索;
使用通配符时必须使用like操作符;
通配符可以在任意位置使用,可使用多个通配符;
在使用通配符匹配时需要注意空格问题;
如果其他操作符可以达到相同目的,不建议使用通配符;
在使用通配符时,尽量不要在开始处使用,否则搜索会变慢
select prod_id,prod_name
from Products
where prod_name like 'Fish%' ;--百分号(%)通配符,%表示任何字符出现任意次数,此语句找出所有以Fish开头的产品
select prod_id,prod_name
from Products
where prod_name like '_ inch teddy bear' ;--下划线(_)通配符,下划线通配符用途与%通配符一样,只是下划线通配符只匹配单个字符,%通配符可以匹配多个字符
select cust_contact
from Customers
where cust_contact like '[JM]%' --方括号([])通配符,方括号通配符用来指定一个字符集,[JM]匹配方阔号中任意一个字符,只能匹配单个字符
order by cust_contact; --找出所有名字以J或M开头的联系人
select cust_contact
from Customers
where cust_contact like '[^JM]%' --方括号([])通配符可以用^来否定,找出所有名字不是以J或M开头的联系人,也可以用not操作符得出类似结果
order by cust_contact
六、创建计算字段
select concat(vend_name, '(' , vend_country, ')') --concat字段拼接,等价于+
from vendors
order by vend_name;
select rtrim(vend_name) + '(' + rtrim(vend_country) + ')' --trim()去掉字符串左右两边的空格,rtrim()去掉字符串右边的空格,ltrim()去掉字符串左边的空格;+等价于concat
from vendors
order by vend_name;
select rtrim(vend_name) + '(' + rtrim(vend_country) + ')'
as vend_title --as关键字将字段命为别名
from vendors
order by vend_name;
select prod_id,quantity,item_price,quantity*item_price as expanded_price --expanded_price列是一个计算字段,数量*价格
from OrderItems
where order_num = 20008
七、使用函数处理数据
大多数SQL都支持文本处理函数、日期和时间处理函数、数值处理函数
1、文本处理函数
select vend_name,upper(vend_name) as vend_name_upcase --upper将文本转换为大写
from Vendors
order by vend_name
2、日期和时间处理函数
select order_num
from Orders
where year(order_date) = 2012 --year() 从日期中提取年份
3、数值处理函数
八、汇总数据
SQL聚集函数(对某些行运行的函数,计算并返回一个值)
#avg()函数
select avg(prod_price) as avg_price --avg()计算特定数据列的平均值,avg()函数忽略数值为NULL的行
from Products;
#count()函数
select count(*) as num_cust --count(*)对表中行的数目进行计数,不管表中是包含的是空值还是非空值
from Customers;
select count(cust_email) as num_cust --count(column)对特定列中具有值的行进行计数,忽略NULL值
from Customers;
#max()、min()函数
select max(prod_price) as max_price --max()返回指定列中的最大值;在用于文本数据时,返回按该列排序后的最后一行;max()忽略列值为NULL的行
from Products;
select min(prod_price) as max_price --min()返回指定列中的最小值;在用于文本数据时,返回按该列排序后的最前面一行;min()忽略列值为NULL的行
from Products;
#sum()函数
select sum(quantity) as items_ordered --sum函数返回指定列值的和;忽略数值为NULL的行
from OrderItems
where order_num = 20005
聚集不同值:5个聚集函数默认对所有行执行操作,若想只计算值不同的行,指定distinct参数
select avg(distinct prod_price) as avg_price --去重后求平均,distinct()函数只能用于count(),不能用于count(*)
from Products
where vend_id = 'DLL01'
今日暂时记录到这,明天继续~