昨天在书上看到SQL数据库语句网站seo优化时,where条件顺序不同,性能不同,这个建议在Oracle11G版本还合适吗?相关方式1优于相关方式2?sql中case数据库语句的用法浅谈
SQL中Case的使用具体相关方法,Case具有两种格式。简单Case函数和Case搜索函数。,复制具体相关代码 具体相关代码如下:,--简单Case函数,CASE sex,WhEN '1' ThEN '男',WhEN '2' ThEN '女',ELSE '其他' END,--Case搜索函数,CASE WhEN sex = '1' ThEN '男',WhEN sex = '2' ThEN '女',ELSE '其他' END,还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。,--比如说,下面这段SQL,您永远无法得到“第二类”这个结果,复制具体相关代码 具体相关代码如下:,CASE WhEN col_1 IN ( 'a', 'b') ThEN '第一类',WhEN col_1 IN ('a') ThEN '第二类',ELSE'其他' END,一,已知数据按照另外一种相关方式进行分组,分析。,有如下数据:(为了看得更清楚,我并没有使用国家具体相关代码,而是直接用国家名作为Primary Key),国家(country)人口(population),中国600,美国100,加拿大100,英国200,法国300,日本250,德国200,墨西哥50,印度250,根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。,洲人口,亚洲1100,北美洲250,其他700,想要解决这个问题,您会怎么做?生成一个带有洲Code的View,是一个解决具体相关方法,但是这样很难动态的改变统计的相关方式。,假如如果使用Case函数,SQL具体相关代码如下:,复制具体相关代码 具体相关代码如下:,SELECT SUM(population),,CASE country,WhEN '中国' ThEN '亚洲',WhEN '印度' ThEN '亚洲',WhEN '日本' ThEN '亚洲',WhEN '美国' ThEN '北美洲',WhEN '加拿大' ThEN '北美洲',WhEN '墨西哥' ThEN '北美洲',ELSE '其他' END,FROM Table_A,GROUP BY CASE country,WhEN '中国' ThEN '亚洲',WhEN '印度' ThEN '亚洲',WhEN '日本' ThEN '亚洲',WhEN '美国' ThEN '北美洲',WhEN '加拿大' ThEN '北美洲',WhEN '墨西哥' ThEN '北美洲',ELSE '其他' END;,复制具体相关代码 具体相关代码如下:,SELECT,CASE WhEN salary <= 500 ThEN '1',WhEN salary > 500 AND salary <= 600 ThEN '2',WhEN salary > 600 AND salary <= 800 ThEN '3',WhEN salary > 800 AND salary <= 1000 ThEN '4',ELSE NULL END salary_class,,COUNT(*),FROM Table_A,GROUP BY,CASE WhEN salary <= 500 ThEN '1',WhEN salary > 500 AND salary <= 600 ThEN '2',WhEN salary > 600 AND salary <= 800 ThEN '3',WhEN salary > 800 AND salary <= 1000 ThEN '4',ELSE NULL END;,二,用一个SQL数据库语句完成不同条件的分组。,有如下数据,国家(country)性别(sex)人口(population),中国1 340,中国2 260,美国1 45,美国2 55,加拿大1 51,加拿大2 49,英国1 40,英国2 60,按照国家和性别进行分组,得出结果如下,国家男女,中国340 260,美国45 55,加拿大51 49,英国40 60,普通情况下,用UNION也可以实现用一条数据库语句进行查询。但是那样增加消耗(两个Select部分),而且SQL数据库语句会比较长。,下面是一个是用Case函数来完成这个功能的例子,复制具体相关代码 具体相关代码如下:,SELECT country,,SUM( CASE WhEN sex = '1' ThEN,population ELSE 0 END), --男性人口,SUM( CASE WhEN sex = '2' ThEN,population ELSE 0 END) --女性人口,FROM Table_A,GROUP BY country;,三,在Check中使用Case函数。,在Check中使用Case函数在很多情况下都是非常不错的解决具体相关方法。可能有很多人根本就不用Check,那么我建议您在看过下面的例子之后也尝试一下在SQL中使用Check。,下面咱们来举个例子,公司A,这个公司有个规定,女职员的工资必须高于块。假如如果用Check和Case来表现的话,如下所示,复制具体相关代码 具体相关代码如下:,CONSTRAINT check_salary ChECK,( CASE WhEN sex = '2',ThEN CASE WhEN salary > 1000,ThEN 1 ELSE 0 END,ELSE 1 END = 1 ),假如如果单纯使用Check,如下所示,复制具体相关代码 具体相关代码如下:
相关方式1:
复制具体相关代码 具体相关代码如下:
select a.*
from students s,
class c
where
s.id = c.id
s.id = 'xxxxxxxx'
相关方式2:
复制具体相关代码 具体相关代码如下:
select a.*
from students s,
class c
where
s.id = 'xxxxxxxx'
s.id = c.id
10g中测试结果证明是一样的。
Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.
C:\Documents and Settings\Administrator>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 5月 11 17:48:55 2013
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> alter system flush shared_pool;
系统已更改。
SQL> alter system flush buffer_cache;
系统已更改。
SQL> set autotrace on;
SQL> select *
2 from COUNTRIES c,
3 REGIONS r
4 where c.REGION_ID=r.REGION_ID and c.REGION_ID='4';
REGIONS r
*
第 3 行出现错误:
ORA-00942: 表或视图不存在
SQL> select *
2 from hr.COUNTRIES c,
3 hr. REGIONS r
4 where c.REGION_ID=r.REGION_ID and c.REGION_ID='4';
CO COUNTRY_NAME REGION_ID REGION_ID
-- ---------------------------------------- ---------- ----------
REGION_NAME
-------------------------
EG Egypt 4 4
Middle East and Africa
IL Israel 4 4
Middle East and Africa
KW Kuwait 4 4
Middle East and Africa
CO COUNTRY_NAME REGION_ID REGION_ID
-- ---------------------------------------- ---------- ----------
REGION_NAME
-------------------------
NG Nigeria 4 4
Middle East and Africa
ZM Zambia 4 4
Middle East and Africa
ZW Zimbabwe 4 4
Middle East and Africa
已选择6行。
执行计划
----------------------------------------------------------
Plan hash value: 4030513296
--------------------------------------------------------------------------------
----------------
| Id | Operation | Name | Rows | Bytes | Cost (%
CPU)| Time |
--------------------------------------------------------------------------------
----------------
| 0 | SELECT STATEMENT | | 6 | 168 | 2
(0)| 00:00:01 |
| 1 | NESTED LOOPS | | 6 | 168 | 2
(0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| REGIONS | 1 | 14 | 1
(0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | REG_ID_PK | 1 | | 0
(0)| 00:00:01 |
|* 4 | INDEX FULL SCAN | COUNTRY_C_ID_PK | 6 | 84 | 1
(0)| 00:00:01 |
--------------------------------------------------------------------------------
----------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("R"."REGION_ID"=4)
4 - filter("C"."REGION_ID"=4)
统计信息
----------------------------------------------------------
628 recursive calls
0 db block gets
127 consistent gets
20 physical reads
0 redo size
825 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
13 sorts (memory)
0 sorts (disk)
6 rows processed
SQL>
#############
SQL> alter system flush shared_pool;
系统已更改。
SQL> alter system flush buffer_cache;
系统已更改。
select *
from hr.COUNTRIES c,
hr. REGIONS r
where
c.REGION_ID='4'
6 and c.REGION_ID=r.REGION_ID;
CO COUNTRY_NAME REGION_ID REGION_ID
-- ---------------------------------------- ---------- ----------
REGION_NAME
-------------------------
EG Egypt 4 4
Middle East and Africa
IL Israel 4 4
Middle East and Africa
KW Kuwait 4 4
Middle East and Africa
CO COUNTRY_NAME REGION_ID REGION_ID
-- ---------------------------------------- ---------- ----------
REGION_NAME
-------------------------
NG Nigeria 4 4
Middle East and Africa
ZM Zambia 4 4
Middle East and Africa
ZW Zimbabwe 4 4
Middle East and Africa
已选择6行。
执行计划
----------------------------------------------------------
Plan hash value: 4030513296
--------------------------------------------------------------------------------
----------------
| Id | Operation | Name | Rows | Bytes | Cost (%
CPU)| Time |
--------------------------------------------------------------------------------
----------------
| 0 | SELECT STATEMENT | | 6 | 168 | 2
(0)| 00:00:01 |
| 1 | NESTED LOOPS | | 6 | 168 | 2
(0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| REGIONS | 1 | 14 | 1
(0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | REG_ID_PK | 1 | | 0
(0)| 00:00:01 |
|* 4 | INDEX FULL SCAN | COUNTRY_C_ID_PK | 6 | 84 | 1
(0)| 00:00:01 |
--------------------------------------------------------------------------------
----------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("R"."REGION_ID"=4)
4 - filter("C"."REGION_ID"=4)
统计信息
----------------------------------------------------------
656 recursive calls
0 db block gets
131 consistent gets
22 physical reads
0 redo size
825 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
13 sorts (memory)
0 sorts (disk)
6 rows processed
SQL>