天天看點

資料庫 — Oracle_SQL語句一、SQL語句分類二、DDL(Data Define Language)三、DML(Data Manipulate Language)四、DQL(Data Query Language)

文章目錄

  • 一、SQL語句分類
  • 二、DDL(Data Define Language)
  • 三、DML(Data Manipulate Language)
  • 四、DQL(Data Query Language)

一、SQL語句分類

  • DDL:資料定義語言 - 表
    • create

    • add

    • drop

    • truncate

    • rename

    • alter

      +…
  • DML:資料操作語言 - 資料庫 要配合TCL
    • insert

    • update

    • delete

  • DQL:資料查詢語言(重點)
    • select

  • DCL:資料控制語言
    • 資料庫使用者、權限
      • create user

      • grant

  • TCL:事務控制語言
    • 事務
      • commit

      • rollback

      • savepoint

二、DDL(Data Define Language)

  1. 建立表——

    create

CREATE table user (
    -- 字段 類型
    id number(6),
    name varchar2(20),
    className varchar2(20),
    score number(5, 1)
);
           
  1. 删除表,不可逆——

    drop

  1. 檢視表結構
  1. 添加字段——

    add

alter table user ADD (
	-- 建表寫法一樣
	birthday date
);

alter table user ADD (
	-- 建表寫法一樣
	score number(4,1)
);
           
  1. 删除字段——

    drop

  1. 修改屬性——

    modify

-- 修改字段 修改類型,不能修改字段名
alter table user MODIFY (
	className varchar2(10) not null
);  

alter table student.user MODIFY (
	className varchar2(10) default 'java'
);
           
  1. 修改表名——

    rename

  1. 删除表中所有資料——

    truncate

三、DML(Data Manipulate Language)

  1. 插入資料——

    insert into

-- 值的個數和順序必須按照表中定義
insert into user values
	(1, 'rose', 'java', sysdate, 92.3); 
	
-- 即使設定預設值,也不能主動添加null值
insert into user values
	(null, 'lucy', null, sysdate, 92.3);
	
-- 指定部分字段添加值, 值的順序按照指定順序添加
insert into user(name, BIRTHDAY, score) 
	values ('rose', sysdate, 93);
           
  1. 修改表中資料——

    update

-- 修改指定表中資料
update user set classname = 'python';

-- 同時修改多個字段
update user 
	set classname = 'python',
			score = 100;
			
-- 篩選:where 條件 所有字段都可以作為條件
update user set classname = 'python'
	where name = 'lucy';
           
  1. 删除表中資料——

    delete

-- 删除指定表中所有資料
delete from user;

-- 條件删除
delete from user where id = 1;
           
  1. TCL事務管理
    • commit

    • rollback

    • savepoint

-- TCL事務管理 commit rollback savepoint
-- 隻有DML需要配合TCL來使用,TCL是讓DML對于資料的操作生效或者撤銷
-- 不同的會話 - 連接配接,都有單獨的事務,如果DML沒有進行事務送出,操作是不生效
-- 送出事務 - 目前會話的DML操作生效
commit;

-- 復原事務 - 目前會話的DML操作從上一次送出後的地方撤銷
rollback;

-- 一次事務中,可以執行多次SQL語句
insert into user(id) values(2);
insert into user(id) values(3);
update user set score = 90;

-- 儲存一個事務節點,事務沒有結束
savepoint a;
update user set name = 'allen';

-- 復原到指定儲存的節點
rollback to a;
rollback;

-- 事務結束的途徑:送出、復原、關閉連接配接
           

四、DQL(Data Query Language)

  1. select...from...

    • 常用函數
    -- || 字元串拼接,多次拼接
    select 'ha' || 'hei' || 'heng' from dual;
    
    -- concat隻能傳2個參數
    select concat('ha','hei') from dual;
    
    -- 函數可以嵌套
    select concat(concat('ha','hei'),'heng') from dual;
    
    -- 字元串長度
    select length('lucy') from dual;
    
    -- 字元串補齊  StringUtils
    select lpad('haha', 10, '*') from dual;
    select rpad('haha', 10, '*') from dual;
    
    -- 字元串切割 指定字元串 從第n個字元開始(n從1開始數) 取m個字元
    select substr('hi! how are u! i am fine.', 3, 11) from dual;
    
    -- n可以為負數,意味着倒着數第n個字元開始
    select substr('hi! how are u! i am fine.', -3, 11) from dual;
    
    -- 全變大寫、小寫、首字母變大寫
    select LOWER('rOse') from dual;
    select Upper('rOse') from dual;
    select initcap('rOse') from dual;
    
    select * from USER_bonnie 
        where upper(name)='ROSE';
    
    -- trim 截取, 去除左右兩邊指定的字元串
    select trim('h' from 'hhhi! how are u! i am fine.hhh') from dual;
    select ltrim('hhhi! how are u! i am fine.hhh', 'h') from dual;
    select rtrim('hhhi! how are u! i am fine.hhh', 'h') from dual;
    
    select rtrim('    i! how are u! i am fine.hhh    ') from dual;
    
    -- indexOf 功能 , 不包含子串,傳回0
    select instr('hi! how are u! i am fine.', 'i') from dual;
    select instr('hi! how are u! i am fine.', 'i', 10) from dual;
    -- 指定位置為負數,倒着數
    select instr('hi! how are u! i am fine.', 'i', -5) from dual;
    
    -- 數字有關函數 Math.round ceil floor mod
    -- 四舍五入,可以保留小數點,也可以從整數部分四舍五入
    select round(44.56789, 0) from dual;
    select round(44.56789, 2) from dual;
    select round(46.56789, -1) from dual;
    
    -- 向上、向下取整,隻有一個參數
    select ceil(44.56789) from dual;
    select floor(44.56789) from dual;
    
    -- 截取,直接舍棄
    select TRUNC(15.79, 1) FROM DUAL;
    select TRUNC(15.79, -1) FROM DUAL;
    
    -- 取餘數 取模
    select mod(10, 3) from dual;
    
    -- 時間 date timestamp
    select sysdate from dual; -- 2019-07-17
    select systimestamp from dual;
    
    
    select * from user_bonnie;
    insert into user_bonnie (birthday)
        values('20-NOV-20');
    
    insert into user_bonnie (birthday)
        values(to_date('2019-02-28', 'yyyy-mm-dd'));
    
    -- 變成日期
    select to_date('2019-02-28', 'yyyy-mm-dd') from dual;  
    
    -- 變成字元串
    select to_char(sysdate, 'yyyy-MM-dd') from dual;
    select to_char(systimestamp, 'yyyy"年"MM"月"dd"日" hh24:mi:ss day') from dual;
    
    -- 所在日期當月最後一天
    select last_day(sysdate) from dual;
    
    -- 提取 Calendar.get() day month year
    select extract(day from sysdate)from dual;
    
    -- 在指定時間上添加月份
    select add_months(sysdate, -2) from dual;
    
    select months_between(
        to_date('2019-07-17', 'yyyy-mm-dd'),
        to_date('2019-02-28', 'yyyy-mm-dd')
    ) from dual;
    
    select round(months_between(
        to_date('2019-07-17', 'yyyy-mm-dd'),
        to_date('2019-02-28', 'yyyy-mm-dd')
    )) from dual;
    
    -- nvl2(comm, val1, val2): 如果comm為null,取val2,否則取val1
    select nvl2(comm, 0, 1000) from emp;
    
    -- 查詢所有人的年薪=sal*12 + comm
    -- select 後可以跟字段、表達式、函數
    -- nvl(comm, 0) :如果comm為null,則取0
    -- as 後跟列的别名,as可以省略
    select ename, 
            sal * 12 + nvl(comm, 0) as salary
        from emp;
        
    -- nvl2(comm, val1, val2): 如果comm為null,取val2,否則取val1
    select nvl2(comm, 0, 1000) from emp;
    
    -- 查詢出來的員工,按照入職時間排序 - 預設升序 asc 降序 desc
    select * from emp order by hiredate asc;
    select * from emp order by hiredate desc;
    
    select * from emp
        where 
            -- 在部門20的人 = 
            deptno = 20;
            -- 工資大于3000的人 > >=
            -sal >= 3000;
            -- 工資小于3000的人 < <=
            -sal < 3000;
            -- 工資不等于3000的人 <>
            -sal <> 3000;  
            -- 大于3000或者小于3000  or  and (and優先級更高)
            (sal > 3000 or sal < 3000)
            and deptno = 20;
            -- job是salesman的    字元串比較 = 大小寫敏感,借助函數
            lower(job) = 'salesman';
            -- 名字長度超過5位, 借助length函數
            length(ename) > 5;
            -- 名字中以 s 開頭的人 
            -- like 配合 %:0個或多個*  _:1個,模糊查詢
            ename like 'S%';
            -- 名字中有 s 的人
            ename like '%S%';
            -- 沒有上司的人
            -- null值很特殊,不能判斷、不能計算,代表無窮大,或者無窮小
            mgr is null; -- is not null
            -- 工資大于 3000,1500,1200 任意一個
            sal > any (3000, 1500, 1200);
            -- 工資大于 3000,1500,1200 每一個
            sal > all (3000, 1500, 1200);
            -- 工資等于 3000,1500,1200 任意一個
            sal in(3000, 1500, 1200);
               
    • 分組函數
    -- 分組函數、聚合函數    max min sum avg count
    select count(empno) from emp;
    
    -- 分組函數 忽略null值
    select count(comm) from emp_hh;
    select count(1) from emp;
    
    -- 每個部門最高工資
    select deptno, max(sal) from emp 
    group by deptno;
    
    -- 注意:錯誤!ename 14條,max(sal) 1條
    -- 結論:select子句中出現的字段,必須同時出現在group by子句中
    select ename, max(sal) from emp ;
    
    select deptno, max(sal), min(comm), avg(comm), sum(empno)
    from emp 
    group by deptno;
    
    -- 通過emp表查詢員工部門都有哪些
    select deptno from emp;
    
    select distinct deptno from emp; -- 去重複
    select distinct deptno , mgr from emp; -- 去重複