1. 程式人生 > >數據庫使用簡單總結

數據庫使用簡單總結

使用 select 插入數據 null 劃線 outer ast mes drop

創建一個表
create table user(
id number(4),
password char(4),
name char(20),
createTime date
);
數字
number(n) 數字最長幾位 如:number(2) 表示最長99
number(n,m) 浮點數 如:number(7,2) 表示最大數99999.99
字符串
char(n) 表示定長字符串(方便查詢)
varchar(n) 表示變長字符串(節省空間)
varchar2(n) Oracle自己定義的變成字符串
日期
date 日期

插入數據
方法1 insert into user values(1001,"1234","TOM");


方法2 insert into user(id,name) values(1002,"Ford");

分頁顯示
set pagesize 100 每100行數據分頁顯示

nvl(d1 , d2)方法演示:如果d1為null則用d2替代
select ename, salary , bonus , salary + nvl(bonus, 0) month_sal from emp_xxx ;

select empno, ename || job detail from emp_xxx ;
"||" 符號表示兩個數據串接起來 , 類似亍Java中的兩個字符串之間的+號


復制表
復制表table1為table2
create table table2 as select * from table1;



lower() 將字符數據轉換為小寫 如:select * from table where lower(job) = ‘analyst‘;
upper() 將數據轉換為大寫 如:select * from table where upper(job) = ‘ANALYST‘;

between …and… 關鍵字
薪水大亍5000並且小亍10000的員工數據?
方法1 select * from emp_xxx where salary >= 5000 and salary <= 10000 ;
方法2 select * from emp_xxx where salary between 5000 and 10000 ;
薪水不在5000至8000的員工

方法1 select * from emp_xxx where salary < 5000 and salary >8000;
方法2 select * from emp_xxx where not betwen 5000 and 8000;

in( 列表 )
列出職位是Manager或者Analyst的員工
方法1 select * from table where job = ‘Manager‘ or job = ‘Analyst‘;
方法2 select * from table where job in(‘Manager‘,‘Analyst‘);
列出職位不是Manager或者Analyst的員工
方法1 select * from table where job <> ‘Manager‘ or job <> ‘Analyst‘;
方法2 select * from table where job not in(‘Manager‘,‘Analyst‘);

模糊匹配 like %
1、“% ”表示0到多個字符 , 跟like配合使用
2、“_”下劃線表示一個字符
select * from emp_xxx where lower(job) like ‘%sales%‘ ;
select * from emp_xxx where job like ‘_a%‘ ;

round() 用於數字的四舍五入
round(12.34567, 2 ) 保留2位有效數字 12.34
round(12.34567) 默認0位有效數字 12

trunc() 用於截取
trunc(12.34567, 2) 12.34

count(*) 統計有多少行
sum(salary) salary列的總和
avg(nvl(salary,0)) salary列的平均值
max(salary) salary列的最大值
min(salary) salary列的最小值

having子句
having子句用於對分組後的數據進行過濾。
註意區別where是對表中數據的過濾 ;having是對分組得到的結果數據進一步過濾

rename關鍵字
rename table1 to table2

左補齊
select lpad(ename,10,"*") from table;
右補齊
select rpad(ename,10,"*") from table;
對字段salary字段5000取模
select salary,mod(salary,5000) from table;

months_between 兩個日期之間的月份數
add_months 給定一個日期,為該日期增加指定月份
last_day 找出參數時間點所在月份的最後一天

將amy的入職日期提前2個月
select time from emp_xxx a where a.ename = "amy";
update emp_xxx set time=add_months(tims,-2) where ename="amy";
select time from emp_xxx a where a.ename = "amy";

這個月的最後一天是多少號
select sysdate,last_day(sysdate) from dual;

轉換函數: to_char / to_date / to_number
to_char to_number
日期 ---------> 字符 ----------> 數字
<--------- <---------
to_date to_char

to_number用法
將"$10"乘以10,輸出結果
select to_number("$10","$9,999,999.99")*10 sal from table;
to_char用法
將"$10"按指定格式“¥9,999,999.99”輸出
select to_char("$10","$9,999,999.99") from table;

誰的薪水比張無忌高?
select name,money from table where money > (select money from table where name = "zhangwuji");

insert into table(name,age,sex) values(‘wuzhitong‘,27,‘nan‘);

查詢誰的薪水比所有叫張無忌的薪水都高?
select name,salary from table where salary > ALL(select salary from table where name ="zhangwuji");

哪些人的薪水比仸何一個叫張無忌的員工工資高?
select name,salary from table where salary > ANY(select salary from table where name ="zhangwuji");

誰和劉蒼松同部門?列出除了劉蒼松之外的員工名字
select name from table where bumen = (select bumen from table where name = "劉蒼松") and name <> "劉蒼松";

誰和劉蒼松同部門?列出除了劉蒼松之外的員工名字( 如果子查詢得到的結果是多個 )
select name from table where bumen in(select bumen from table where name ="劉蒼松") and name <> "劉蒼松";

每個部門拿最高薪水的是誰?
select name,salary,bumen from table where (bumen,salary) in(select bumen,max(salary) from table where bumen is not null group by bumen);

哪個部門的人數比部門30的人數多?
select bumen,count(*) from table group by bumen having count(*) > (select count(*) from table where bumen = "30");

哪個部門的平均薪水比部門20的平均薪水高?
select bumen,avg(nvl(salary,0)) from table group by bumen having avg(nvl(salary,0)) > (select bumen, avg(nvl(salary,0)) from table where bumen = "20");

列出員工名字和職位 , 這些員工所在的部門平均薪水大於5000元
select name,job from table where bumen in(select bumen from table group by bumen having avg(nvl(salary,0)) > 5000);

結果集操作
union 和 union all區別
union去掉重復記錄,union all不去重
union 排序,union all不排序
intersect 交集
minus 差集

合集( union )演示
select name,salary from table where bumen = 10 union select name,salary from table where salary > 6000;

表間關聯查詢

內連接
table1 join table2 on 條件(表1叫做驅動表 , 表2叫做匹配表)
列出員工的姓名和所在部門的名字和城市
select name,city,location from table1 t1 join table2 t2 on t1.depthno = t2.depthno

外連接
左外連接語法結構: table1 left outer join table2 on 條件
右外連接語法結構: table1 right outer join table2 on 條件
外連接的特征
1、如果驅動表在匹配表中找不到匹配記錄,則匹配一行空行
2、外連接的結果集 = 內連接的結果集 + 驅動表在匹配表中匹配不上的記錄和空值
3、外連接的本質是驅動表中的數據一個都不能少
left outer join 以左表為驅動表
right outer join 以右表為驅動表

列出員工的姓名和他所在部門的名字 , 把沒有部門的員工也查出來
select * from table1 t1 left outer join table2 t2 on t1.deptno =t2.deptno
select * from table2 t2 right outer join table1 t1 on t1.deptno =t2.deptno

full outer join 全外連接
1、全外連接可以把兩個表中的數據都查出來
2、全外連接的結果集 = 內連接結果集+驅動表在匹配表中找不到數據的記錄和空值+匹配表在驅動表中找不到的數據記錄和空值
3、驅動表和匹配表可以互換
select * from table1 full outer join table2 on t1.deptno = t2.deptno

Transaction(事務)
commit 事務提交 將所有的數據改動提交
rollback 事務回滾 回退到事務之初

alter
add 添加一列
alter table user add (time char(10));

rename 修改元素名
alter table user rename column time to times;

modify
alter table user modify(times char(8));

drop column
alter table user drop column times

約束條件
主鍵約束=不能重復+不能為null
方式定義:列級約束和表級約束

唯一約束(UK unique )

檢查約束(CK,Check)

外鍵(FK,Foreign key)

創建索引
方法一 使用alter語句
普通索引:alter table user add index index_name(name);
唯一索引:alter table user add unique(name);
PK索引: alter table user add primary key(name);

方法二 使用create index語句
普通索引:create index index_name on user(name);
唯一索引:create unique index index_name on user(name);

刪除索引
drop index index_name on user;
alter table user drop index index_name;
alter table user drop primary key;

https://www.cnblogs.com/jiangxiaobo/p/6278136.html

數據庫使用簡單總結