SQL判断空值、nvl处理与JOIN的使用

LIKE子句会影响查询性能,因此在明确知道字符个数时,应该使用'_',而不使用'%'。
判断空值/非空值
SELECT select_list FROM table_list/view_list WHERE column IS [NOT] NULL html

若是查询出来的字段是空值,而后又想给个默认值给它,能够用nvl(value,0),就给个0给value了。能够在select后使用(用途:赋默认值,数据整齐,能够令到数据不用在读出后再循环赋值),也能够在order by 后使用(用途方便排序,不会出现空值排最头状况)。mysql

NVL是关于数值的,NULL状况不行sql

SQL ISNULL(), NVL(), IFNULL() and COALESCE() 函数这些在咱们经常使用到sql语句中会经常用到的下面咱们就来看看实例教程吧.数据库

P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder 
1 Jarlsberg 10.45 16 15 
2 Mascarpone 32.56 23   
3 Gorgonzola 15.67 9 20函数

假设“ UnitsOnOrder ”一栏是可选的,可能包含空值。性能

咱们有如下的SELECT语句:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products
在上面的例子中,若是任何“ UnitsOnOrder ”价值观是空,其结果是无效的。 微软的ISNULL ( )函数是用来指定咱们要如何处理空值。 该NVL ( ) , IFNULL ( )和联合( )函数还能够用来实现一样的结果。 在这种状况下,咱们要空值为零。 下面,若是“ UnitsOnOrder ”为NULL它不会损害计算,由于ISNULL ( )返回一个零值,若是为NULL : SQL Server / MS AccessSELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))
FROM Products
Oracle
Oracle没有ISNULL ( )函数。可是,咱们可使用NVL ( )函数来实现相同的结果SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products
mysql
MySQL的确实有一个ISNULL ( )函数。然而,它的做品有点不一样,微软的ISNULL ( )函数。 MySQL中咱们可使用IFNULL ( )函数,就像这样: SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products优化

下面说到 JOIN的使用,JOIN的类型ui

=================JOIN的使用====================htm

来自:http://blog.sina.com.cn/u/4a48be9101000620blog

利用SELECT语句来检索的时候只能从一个表中进行。若是你想从两个表或者更多的表中进行检索,该怎么办呢?好在咱们可使用SQL和关系数据库系统的一个颇有用的特性,即"Join"。"Join"就是使得关系数据库系统相关的东东。"Join"容许你从两个表或者更多的表链接数据进行数据检索,而只须要利用一个SELECT语句。若是在FROM关键字以后有多个表的话,"Join"能够在SQL SELECT语句中识别它们。
SELECT "list-of-columns"

FROM table1,table2

WHERE "search-condition(s)"

"Join"

经过示范当你只处理一个表的时候会发生什么事情可使得"Join"的解释更简单,因此这里我没有使用"Join"。这个单一的数据库有事也被称为"flat table"(平表)。如今你有一个表的数据库用来检索全部顾客的信息以及他们从你的商店买了什么,下面就是这个表的全部列:

每次一个新行被插入到表中,全部的列都将被更新,这样就致使了没必要要的”多余数据”。好比,每次Jenny买东西,下面的行都将被插入到表中:

为了不”多余数据”,一个最好的方法:让数据库有两个表:其中一个用来对顾客保持跟踪;另一个用来对他们买什么东西保持跟踪。即有"Customer_info" 表和"Purchases" 表:

"Customer_info" 表为:

customer_number

firstname

lastname

address

city

state

zip

"Purchases" 表为:

customer_number

date

item

price

如今开始,无论顾客何时进行重复的购物,只有第二个表"Purchases" 须要更新。这样咱们就减小了多余的数据,也就是说咱们规格化了这个数据库。

你仔细点就会发现两个表中仍是有一个"cusomer_number"列是相同的。这个列包含了单独的顾客号,它将用来JOIN(链接)两个表。下面举个例子来使用这两个表,假如你想搜索顾客的名字以及他们所买的东西,你可使用如下的语句来实现:

SELECT customer_info.firstname, customer_info.lastname, purchases.item

FROM customer_info, purchases

WHERE customer_info.customer_number = purchases.customer_number;

特殊的"Join"有为"Inner Join" 或者"Equijoin",这是一个最多见的"Join"类型,之后咱们常常用使用到或者看到。

这里要注意每列老是在表名以前,这却也不是必需的。这是一个好的练习对于帮助你澄清列后面跟着表的认识有很大帮助。若是两个表之间有一个相同的列,它就是必须的。我这里推荐在使用JOIN的时候最好在全部列以后加上表名。

注意;上面描述的这个语法将在绝大多数的数据库系统起做用,本教程的也是同样。可是结果你会发现你上面的语句并不起做用,请仔细检查一下吧。

固然你能够试一试修改以上的代码,你可使用JOIN(ANSI SQL-92语法规范中的INNER JOIN):

SELECT customer_info.firstname, customer_info.lastname, purchases.item

FROM customer_info INNER JOIN purchases

ON customer_info.customer_number = purchases.customer_number;

再举另一个例子:

SELECT employee_info.employeeid, employee_info.lastname, employee_sales.comission

FROM employee_info, employee_sales

WHERE employee_info.employeeid = employee_sales.employeeid;

这个例子将从employee_info和employee_sales表中选择当employee_info表的employeeid等于employee_sales表的employeeid的employeeid 、emplyee_info表中lastname以及employee_sales表中的comission数值。

从上面的例子中能够发现利用JION的语句比价简练。既然有这样的有点,咱们何乐而不为呢?

============================JOIN的类型===========================

来自:http://www.2006cn.com/Article/15/141/2006/20060916137968.html

Q:SQL 语句 join 的详解使用方式
  A:(1) cross join
      参与select语句全部表的的全部行的笛卡尔乘积
      select au_lname ,title
      from authors cross join  titiles

     outer join 对参与join的两个表有主从之分,处理方式以主表的每条数据去match 从属表的列,合乎条件的数据是咱们所要的答案,不合乎条件的也是咱们要的答案,只不过哪些从属表选取的列将被添上null。

(2) left join
     左边的为主表,右边为从属表
     select a.cust_id ,b.order_date,b.tot_ant
     from customer a left join sales b
     on (a.cust_id =b.cust_id and b.order_date〉’’1996/10/15’’)
     能够写为
     select a.cust_id,b.order_date,b.tot_ant
     from custom a
     left join (select * from sales where order_date〉’’1996/10/15’’) b
    on a.cust_id =b.cust_id

(3) right join
     左边的表为从属表,右边的表为主表

(4) self join
     self join 经常使用在同一表内不一样数据间对同一列的比较
    select a.emp_no,a.emp_name,b.emp_no,b.emp_name,a.date_hired
    from employee a
    join employee b
    on (a.emp_no!=b.emp_no and a.date_hired=b.date_hired)
    order by a.date_hired
   这样会重复数据,只要加上一句 and a.emp_name〉b.emp_name

(5) full join
     不只列出符合条件的数据,两边未符合join条件的数据也会一并列出。哪些未符合join条件的数据若是在select列中没法获得对应的值则填上null

    select a.cust_id,b.tot_amt
    from customer a full join sales b
    on a.cust_id=b.cust_id
有表
id   ic  name  amount
      I    *        *
      c
      i
      c
      i
      i
   要求结果为
    ic  name  amount  ic   name  amount
    i                         c
    i                         c
    i
    i
  select aaa.*,bbb.*
  from ( select (select count(id) from  aa as  b where (b.id〈a.id) and (ic=’’i’’)) as     newid, * from aa a where ic=’’i’’) aaa
  full join
   (select (select count(id) from aa as b where b.id〈a.id and ic=’’c’’) as newid,* from
aa a where ic=’’c’’) bbb
on aaa.newid=bbb.newid
order by aaa.name

6.使用 HASH 和 MERGE 联接提示
此示例在 authors、titleauthors 和 titles 表之间创建三表联接,以生成一个做者及其著做的列表。查询优化器使用 MERGE 联接将 authors 和 titleauthors (A x TA) 联接在一块儿。而后,将 authors 和 titleauthors MERGE 联接 (A x TA) 的结果与 titles 表进行 HASH 联结以生成 (A x TA) x T。

重要  指定联接提示后,要执行 INNER JOIN 时 INNER 关键字再也不为可选,而必须显式说明。

USE pubs
SELECT SUBSTRING((RTRIM(a.au_fname) + ’’ ’’ + LTRIM(a.au_lname)), 1, 25)
   AS Name, SUBSTRING(t.title, 1, 20) AS Title
FROM authors a INNER MERGE JOIN titleauthor ta
   ON a.au_id = ta.au_id INNER HASH JOIN titles t
   ON t.title_id = ta.title_id
ORDER BY au_lname ASC, au_fname ASC

下面是结果集:

Warning: The join order has been enforced because a local join hint is used.
Name                      Title
------------------------- --------------------
Abraham Bennet            The Busy Executive’’s
Reginald Blotchet-Halls   Fifty Years in Bucki
Cheryl Carson             But Is It User Frien
Michel DeFrance           The Gourmet Microwav
Innes del Castillo        Silicon Valley Gastr
...                    ...
Johnson White             Prolonged Data Depri
Akiko Yokomoto            Sushi, Anyone?

(25 row(s) affected)

相关文章
相关标签/搜索