数据库(二)——SQL语句

205 阅读5分钟
  1. SQL语句不区分大小写

  2. 结束SQL语句,多条SQL语句必须以分号(;)分隔。一般多数DBMS不需要在单条SQL语句后加分号,也有一些必须加。

  3. 处理SQL语句时,所有空格都被忽略。以下写法都一样

//第一种
select prod_name
from Products

//第二种
select prod_name from Products

//第三种
select 
prod_name
from 
Products
  1. 注释使用--(两个连接符)嵌在行内,--之后的文本就是注释
  2. 多行注释可以使用 /* 开始,到*/结束。

select和order by

  1. select...from子句
  2. order by子句的位置:保证它是select 语句中最后一条子句。 可以多列排序
//先按prod_price,再按prod_name进行排序
SELECT prod_id,prod_price, prod_name
From Products order by prod_price, prod_name;

//按相对列进行排序,表示先按prod_price,再按prod_name进行排序
SELECT prod_id,prod_price, prod_name
From Products order by 2,3;
  1. 指定排序方向

默认升序排序,可以使用order by子句进行降序,指定DESC关键字。DESC关键字只应用到直接位于其前面的列名。如果多个列进行降序排序,必须对每一列指定DESC关系。

SELECT prod_id,prod_price, prod_name
From Products order BY prod_price DESC;
 
//desc关键字只对prod_price有效,prod_name依旧是升序
SELECT prod_id,prod_price, prod_name
From Products order BY prod_price DESC,prod_name;
  1. ASC是升序,默认的就是升序。

过滤数据 where

SELECT * From Products where prod_price<10;
  1. 在时使用order by和where语句时,应该让order by位于where之后。

  2. 一些操作符:<>(不等于),!>(不大于),between(在指定的两个值之间),is null(为null值)

  3. 何时使用引号
    单引号用来限定字符串。如果将值与字符串类型的列进行比较,就需要限定引号,用来与数值列进行比较的值不用引号。

高级数据过滤

  1. 使用AND 操作符给where子句附加条件。
//可以增加多个过滤条件,每个条件间都要使用and关键字  
SELECT * From Products where vend_id = 'dll01' and prod_price <= 4;
  1. 使用AND 操作符给where子句附加条件。
SELECT * From Products where vend_id = 'dll01' or prod_price <= 10;
  1. 使用and 和 or 一起,and在求值过程中优先级更高,所以有时候要注意,有些地方要用括号。平时最好也要使用圆括号,这样能消除歧义。
SELECT * From Products where (vend_id = 'dll01' or vend_id = 'BRS01') AND prod_price >= 10;  
  1. in操作符
    in操作符用来指定条件范围。
SELECT vend_id,prod_name,prod_price From Products where vend_id in( 'dll01' ,'BRS01' ) order by prod_name;
  1. not关键字
SELECT vend_id,prod_name,prod_price From Products where not vend_id = 'dll01' order by prod_name;

###通配符
通配符:用来匹配值的一部分的特殊字符 。通配符只能用于文本字段,非文本数据类型字段不能使用通配符搜索。

  1. like操作符
  2. 百分号(%)通配符:%表示任何字符出现任意次数
  3. %代表搜索模式中给定位置的0个、1个或多个字符
  4. 请注意NULL:通配符%看起来像是可以匹配任何东西,但有个例外,这就是NULL。子句WHERE prod_name LIKE'%'不会匹配产品名称为NULL的行。
//任意fish起头的值
select prod_id,prod_name from Products where prod_name like 'fish%';
//多个通配符,任意位置上包含文本bean bag 的值
select prod_id,prod_name from Products where prod_name like '%bean bag%';
//以F起头、以y结尾的所有产品
select prod_id,prod_name from Products where prod_name like 'F%y';
  1. 下划线(_)通配符:它只匹配单个字符,而不是多个字符。刚好一个字符,不多不少
  2. 方括号([])通配符:用来指定一个字符集,它必须匹配指定位置(通配符的位置)的一个字符。(只有微软的Access和SQL Server支持集合)
//找出所有名字以J或M起头的联系人
select cust_contact from Customers where cust_contact like '[JM%]';

//找出所有名字不以J或M起头的联系人
select cust_contact from Customers where cust_contact like '[^JM%]';

通配符很有用,但是这种功能是有代价的,耗费更长的处理时间,所以要合理使用

计算字段

  1. 拼接:将值联结在一起。把两个列拼接起来。
    用(+)或两个竖杠(||)表示,SQL Server是用+
select vend_name + '('+ vend_country +')' from Vendors ; 
//去空格Rtrim()函数
select rtrim(vend_name) + '('+ rtrim(vend_country) +')' from Vendors ;
  1. RTRIM()去掉字符串右边的空格,LTRIM去掉字符串左边的空格,TRIM()去掉字符串左右两边的空格
  2. 别名(alias):别名最常见的使用是将多个单词的列名重命名为一个单词的名字。
select rtrim(vend_name) + '('+ rtrim(vend_country) +')' as vend_title from Vendors;
  1. 执行算术计算
select prod_id,quantity,item_price from OrderItems WHERE order_num = 20008;
//订单中物品的单价
select prod_id,quantity,item_price,quantity*item_price as expanded_price from OrderItems WHERE order_num = 20008;

  1. SQL算术操作符 加(+),减(-),乘(*), 除( /)

使用数据处理函数

由于不同的DBMS使用的函数不同,所以如果决定使用函数,应该保证做好代码注释,以便以后你(或其它人)能确切地知道所编写的SQL代码的含义。
一、使用函数
大多数SQL实现支持以下类型的函数:

  1. 用于处理文本字符串
  2. 用于在数值数据上进行算术操作
  3. 用于处理日期和时间值并从这些值中提取特定成分的日期和时间函数。
  4. 返回DBMS正使用的特殊信息的系统函数。
    二、函数
    upper()将文本转换为大写。
select vend_name,UPPER(vend_name) as vend_name_upcase from Vendors  order by vend_name;

常用的文本处理函数
LEFT():返回字符串左边的字符
LENGTH():返回字符串的长度
LOWER():将字符串转换为小写
LTRIM():去掉字符串左边的空格
RTRIM():去掉字符串右边的空格
TRIM():去掉字符串左右两边的空格
SOUNDEX():返回字符串的SOUNDEX值
UPPER():将字符串转换为大写

select cust_name,cust_contact from Customers WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');  

日期和时间处理函数

select order_num from Orders WHERE DATEPART(yy,order_date) = 2012;

数值处理函数

汇总数据

聚集函数
AVG():返回某列的平均值,AVG()函数忽略列值为NULL的行 COUNT():返回某列的行数
MAX()返回某列的最大值
MIN()返回某列的最小值
SUM()返回某列值之和

select AVG(prod_price) as avg_price from Products;  
select AVG(prod_price) as avg_price from Products where vend_id = 'DLL01';
select COUNT(*) as num_cust from Customers;
select MAX(prod_price) as max_price from Products; 
select MIN(prod_price) as min_price from Products;
select SUM(quantity) as items_ordered from OrderItems where order_num = 20005;
select SUM(item_price * quantity) as total_price from OrderItems where order_num = 20005;

聚集不同值