/*
達內學習 Oracle day38 2013-10-24
*/
oracle -sql (structed query language)
數據的存儲
file
dbms(數據庫管理系統) 管理的文件就是db
主流的數據庫:FDB 關係型數據庫(基於二維表的數據庫) 有行有列組成的表
數據庫管理的基本單位是表
RDBMS 關係型數據庫管理系統
Oracle甲骨文 50%
版本9i,10g,11g
DB2 IBM (國際商務機器)20%
sqlserver microsoft 15%
開源數據庫:
mysql sun(斯坦福大學網絡實驗室)甲骨文
嵌入式數據庫
sqllite 文本型數據庫
//==================================================
SQL 語言的分類
1 查詢語句
select
2 數據定義語言 DDL
create table
drop table
alter table
3 數據操作語言 DML
insert
delete
update
4 事務控制語言 TCL
commit
rollback
savepoint
5 grant revoke
//---------------------------------------------------------------
遠程登陸
telnet 192.168.0.23/26
openlab open123
window: telnet IP
ubuntu: 相同
登陸數據庫 sqlplus openlab/open123 sqlplus openlab open123
//-----------
察看 一張表結構
SQL>desc 表名;
SQL> desc s_emp;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID 編號 NOT NULL NUMBER(7)
LAST_NAME 姓氏 NOT NULL VARCHAR2(25)
FIRST_NAME 名 VARCHAR2(25)
USERID 員工編號 VARCHAR2(8)
START_DATE 入職日期 DATE
COMMENTS 備註 VARCHAR2(255)
MANAGER_ID 領導編號 NUMBER(7)
TITLE 職位 VARCHAR2(25)
DEPT_ID NUMBER(7)
SALARY 工資 NUMBER(11,2)
COMMISSION_PCT 提成 NUMBER(4,2)
name 就是表頭中的字段
null? 字段能不能不填寫
type 字段的類型
數字:number
字符串:varchar2
日期類型:date
//----------
基本概念:
選擇:所有列被選擇部分行被選中
投影:所有行被選中,部分列被選擇
表連接:把所有表組織起來
select 語句
A,from
數據從哪裏來
1,怎麼從一張表查詢一個字段
select 字段名 from 表;
查詢 s_emp 表中的 salary;
select salary from s_emp;
2,怎麼從一張表中查詢多個字段
select 字段名,字段名…… from 表; //同級別的東西用逗號隔開
查詢 s_emp 表中 名 和對應的 工資
select first_name,salary from s_emp;
3,查詢一個表中所有字段
select * from 表;
4,sql中的數學運算 + - * /
要求把每個人的工資 加100以後顯示
select salary,salary+100 from s_emp;
5,字段和表達式別名
select first_name name,salary*12 'yearsal' from s_emp;
字段 和表達式的別名。 字段或者表達式後面 起另一個名字(別名只能有一個並且別名處理成大寫) 原樣顯示用單引號
6,sql中的字符串
在一串字符的兩端 加上單引號
例如:'' 'a' 'hello'
字符串的拼接 ||
select last_name||'_'||first_name name ,salary*12 yearsal from s_emp;
col 字段名 for a+數字; 設置字段名最多顯示多少個字符,超了折行
col name for a25
姓名之間加入單引號
select last_name||''''||first_name name from s_emp;
7,空值處理
重新計算年薪,要求年薪是 工資*12*(1+提成/100)
select salary*12,salary*12*(1+nvl(commission_pct,0)/100) byearsa from s_emp
任何值 和 NULL 做運算結果都是NULL
nvl(par1,par2)
par1 爲NULL時返回par2的值,當par1的值不爲NULL就返回par1的值
8,數據的排重顯示
select distinct salary from s_emp ;
只管做什麼,不管在怎麼做。
select distinct salary,title from s_emp; //工資和職位都相同
B,where
限定表中數據返回,符合where條件的數據被選中,不符合where條件的數據被過濾掉
1,特殊的where條件
select id,salary from s_emp where 1=1;
2,數字型的數據的限制
列出工資大於1400的員工的id, first_name salary
select id,first_name,salary from s_emp where salary>1400;
select id,first_name,salary from s_emp where salary!=1400;
3,字符串類型的數據的判斷
找出first_name 叫Mai的員工的id
select id from s_emp where first_name = 'Mai';
字符串值區分大小寫,sql語句不區分大小寫
4,常見的運算符
= != < > >= <=
5,sql提供的元算符
a,表達一個閉區間
[a,b]
where 字段 between a and b;
查詢工資在 1500 到 2000 之間的id
select id from s_emp where salary between 1500 and 2000;
b,表達一個值 出現在一個列表中
where 字段 in(值1,值2,……);
查詢部門編號是 50,31,32 的員工ID
select id, first_name,dept_id from s_emp where dept_id in(50,31,32);
改變括號內順序對查詢結果沒有影響。但是可能對查詢效率有影響。應該把概率高的放在前面。
c,模糊查詢關鍵字。 關鍵字 like
where 字段 like '通配串'
數據庫中代表0-n個任意字符的是 %,代表一個任意字符的是 _
查詢s_emp中first_name 帶a的
select id,first_name from s_emp where first_name like '%a%';
查詢所有S_開頭的表明
select table_name from user_tables where table_name like 'S\_%' escape '\';
'\' '後面的字符轉義 ,只有下劃線和%需要轉義
d,如何判斷一個字段的值是否是NULL值
where 字段 is NULL;
找出manager_id是null的人的id
select id from s_emp where manager_id is NULL;
6,邏輯條件運算符
and or not
對立面
between a and b -> not between a and b
in -> not in(注意NULL)
like -> not like
is null -> is not null
7,條件組合順序
爲了清楚加()
C,order by
數據排序
order by 位置在語句最後面
order by 排序標準 排序方式
升序(自然排序,字典排序) asc 降序(反自然,反字典) desc
按照工資排序 顯示 id first_name salary
select id,first_name,salary form s_emp order by salary desc;
按照manmager_id 排序
顯示id first_name,manager_id
select id,first_name,manager_id from s_emp order by manager_id;
NULL 在排序中當最大值處理
當按照第一個排序時,如果第一個字一樣,按照第二排序字段。
select id,first_name,salary from s_emp order by salary asc,first_name desc;
D,單行函數
1 概念
單行函數:針對sql影響的每一行數據都做處理,每一行都會返回一個結果
sql語句影響多少行 就返回多少個結果
組函數:針對一組數據做處理,返回一個結果。無論sql語句影響多少行都返回一個結果。
2 舉例 組函數 count
select count(id) from s_emp
where id>1;
select upper(first_name) from s_emp where id = 1;
3 爲了測試單行函數 引入了一張表 dual
select * from dual;
4 處理字符串的單行函數
upper(par1) 轉化大寫
lower(par2) 轉化小寫
select lower('HELLO')from dual;
initcap(par1) 把每個單詞的首字母變大寫
select initcap('one world one dream') from dual;
length(par1) 求字符串的長度
select length('hello') from dual;
把s_emp表中所有first_name 和first_name的長度列出來
select first_name,length(first_name) from s_emp;
E,多表查詢
F,組函數和分組
G,子查詢