[SQL入門級] 第一天 SQL初步

SQL語句分爲如下三種類型:sql

  • DML:Data Manipulation Language 數據操縱語言
    1. INSERT
    2. UPDATE
    3. DELETE
    4. SELECT
  • DDL:Data Definition Language 數據定義語言
    1. CREATE TABLE
    2. ALTER TABLE
    3. DROP TABLE
    4. CREATE INDEX
    5. DROP INDEX
  • DCL:Data Control Language 數據控制語言
    1. GRANT 授予訪問權限
    2. REMOVE 撤銷訪問權限
    3. COMMIT 提交事務處理
    4. ROLLBACK 事務處理回退
    5. SAVEPOINT 設置保存點
    6. LOCK 對數據庫的特定部分進行鎖定

1、基本的SQL-SELECT語句數據庫

別名 函數

①直接在字段名後面寫  select last_name name,employee_id id from empolyees;spa

②在字段名後加as  select last_name as name,employee_id as id from empolyees;code

③加雙引號(當別名由多個單詞構成且中間以空格隔開時必用)  select last_name "my name",employee_id as id from empolyees;      blog

 

鏈接符排序

①把列與列,列與字符鏈接在一塊兒事務

②用 || 表示ip

③能夠用來'合成'列ci

select last_name||'`s job_id is '||job_id as details from employees

 

重複行(去重)distinct

select distinct department_id from employees;

注意:null值也單獨爲一行

注意:字符和日期必須用單引號括起來(SQL中只有在上面提到的別名時會用到雙引號,其它狀況都用單引號),SQL語言大小寫不敏感,但''括起來的字符串嚴格區分大小寫

 

2、過濾和排序

過濾 where

-- AND OR NOT 邏輯且/邏輯或/邏輯否

-- [NOT] BETWEEN AND 表示區間內的值,包含邊界 等價於 >= and <=

-- [NOT] IN 表示離散的值,where department_id in(70,80,90) 等價於 where department_id=70 or department_id=80 or department_id=90

-- [NOT] LIKE 模糊查詢 

   百分號%表示0…n個字符;

   下劃線_表示單個字符;

   轉義字符 ESCAPE,where last_name like  '%\_%' escape '\' (轉義字符能夠是任何字符 如 \ # $ 等)

-- IS [NOT] NULL 空值

-- 運算優先級

    算術運算符>鏈接符>比較符>IS NULL,LIKE,IN>BETWEEN>NOT>AND>OR

    括號能夠改變優先級

 

排序

ORDER BY … DESC(逆序)/ASC(順序,默認)

select last_name,department_id,salary*12 annual_sal
from employees

--order by 能夠不放在where子句

--where department_id > 80

--多級排序

--依字段別名排序
order by annul_sal
,last_name desc

 

3、單行函數

字符

① 大小寫控制函數:由於被單引號括出來的內容是嚴格區分大小寫,而有時候查詢不在意大小寫,這時候此類函數派上用場

   LOWER('SQL Course') → sql course    所有小寫

   UPPER('SQL Course') → SQL COURSE 所有大寫

   INITCAP('SQL Course') → Sql Course  單詞首字母大寫

② 字符控制函數:

   CONCAT('Hello','World') → HelloWorld 鏈接字符串

   SUBSTR('HelloWorld',1,5) → Hello       從第1個下角標位置開始截取長度爲5的子字符串--Java中下標從0開始,-1表明無效數據;SQL中下標從1開始,0表明無效數據

   LENGTH('HelloWorld') → 10                字符串長度

   INSTER('HelloWorld','W') → 6             字符在字符串中的位置

   LPAD(salary,10,'*') → *****24000     字符串左對齊,用10個位去存,不足在左端用*補齊

   RPAD(salary,10,'*') → 24000*****     字符串右對齊,用10個位去存,不足在右端用*補齊

   TRIM('H' FROM 'HelloHWorldH') → elloHWorld 去除原字符串中首尾與指定字符相同的字符

   REPLACE('abcdb','b','m') → amcdm      將字符串中全部與指定字符相同的字符替換爲另外一個字符

 

數值

   ROUND() 四捨五入

      --ROUND(435.45,1) ROUND(435.45) ROUND(435.45,-1)
                         435.5                  435                       440

   TRUNC() 截斷

       --ROUND(435.45,1) ROUND(435.45) ROUND(435.45,-1)
                         435.4                  435                       430

   MOD() 求餘

      --MOD(1600,15)

                         10

 

日期:Oracle中的日期型數據實際含有兩個值(日期和時間)

   在日期上加上或減去一個數字結果仍爲日期

   兩個日期相減返回日期之間相差的天數

   MONTHS_BETWEEN 兩個日期相差的月數

   ADD_MONTHS         向指定日期中加上若干月數

   NEXT_DAY              指定日期的下一個星期幾對應的日期

   LAST_DAY              本月的最後一天

   ROUND                   日期四捨五入

   TRUNC                    日期截斷

 

數據類型轉換

① 隱式 DATE ←→ VARCHAR2 ←→ NUMBER

源數據類型 目標數據類型
VARCHAR2/CHAR NUMBER
VARCHAR2/CHAR DATE
NUMBER VARCHAR2
DATE VARCHAR2

--注意區別,JAVA中+號在字符串運算中表明字符串鏈接,SQL中字符串鏈接用的是 ||,+號則表示數學加法運算

select '12' + 2 from dual; --此處'12'隱性轉換爲NUMBER類型的12

14

 

② 顯式

image

TO_CHAR

   select employee_id,to_char(hire_date,'yyyy"年"mm"月"dd"日"') --此處在輸出日期格式中穿插的字符要用""括起來
   from employees
   where to_char(hire_date,'yyyy/mm/dd') = '1994/06/07'  -- to_date('1994/06/07','yyyy/mm/dd')

TO_DATE

TO_NUMBER

   select to_char(1234567.89,'999,999,999.99') from dual; -- 1,234,567.89      不足不用補零

   select to_char(1234567.89,'000,000,999.99') from dual; -- 001,234,567.89   不足位數補零

   select to_char(1234567.89,'$999,999,999.99') from dual; -- $1,234,567.89   美圓符號

   select to_char(1234567.89,'L999,999,999.99') from dual; -- ¥1,234,567.89  本地貨幣符號

   select to_number('1,234,567.89','L999,999,999.99') from dual; -- 1234567.89 格式要對應上

 

通用

這些函數適用於任何數據類型,同時也適用於空值

NVL(expr1,expr2) 等價於 expr1!=null?expr1:expr2

--commission_pct 獎金率字段的值有可能爲null,是null則用 0 代替

select employee_id,last_name,salary*12*(1+nvl(commission_pct,0)) annual_sal,commission_pct from employees;

--因爲department_id是NUMBER類型,而'沒有部門'是嚴格的字符類型,直接調用NVL函數報「無效數字」錯誤,需進行處理

select last_name,nvl(to_char(department_id),'沒有部門') from employees;

NVL2(expr1,expr2,expr3) 等價於 expr1!=null?expr2:expr3

select last_name,nvl2(commission_pct,commission_pct + 0.015,0.01) from employees;

NULLIF(expr1,expr2) 等價於 expr1==expr2?null:expr1

select first_name,length(first_name) "expr1",
       last_name,length(last_name) "expr2",
       nullif(length(first_name),length(last_name)) result
from employees

COALESCE(expr1,expr2,…,exprn) 若是第一個表達式爲null,則返回下一個表達式,依次迭代

 

條件表達式(IF-THEN-ELSE邏輯)

① CASE表達式

CASE expr1 WHEN comparison_expr1 THEN return_expr1
  [WHEN comparison_expr2 THEN return_expr2
   WHEN comparison_exprn THEN return_exprn
   ELSE else_expr]

END

--查詢部門號爲10,20,30的員工信息,若部門號爲10,則打印
--其工做的1.1倍,20號部門,1.2倍,30號部門,1.3倍
select employee_id,last_name,department_id,
       case department_id when 10 then salary*1.1
                                    when 20 then salary*1.2
                                    else salary*1.3
                                    end REVISED_SALARY
from employees
where department_id in(10,20,30)

image

 

② DECODE函數

select employee_id,last_name,department_id,       decode(department_id,10,salary*1.1,                                        20,salary*1.2,                                        salary*1.3) REVISED_SALARYfrom employeeswhere department_id in(10,20,30)

相關文章
相關標籤/搜索