您好,登錄后才能下訂單哦!
DB2
Oracle
Infomix
Sybase
SQLServer
1 什么是數據庫
數據需要持久保存
(磁盤文件)
數據庫(數據庫管理系統)是個軟件
安全,可靠,高效
數據庫服務器,數據中心
用表來存儲數據的數據庫
SQL 通用的關系型數據庫的操作語言
不同數據庫之間SQL有一定的差異
NoSQL Not only SQL
芒果DB......
T-SQL
PLSQL
SQL 中的分類
DDL(Data Definition Language) 數據定義語言
create;drop...
DML(Data Maniplation Language)數據操作語言
insert;delete;update...
TCL(Transaction Control Language)事物控制語言
begin transaction;commit;rollback....
DQL(Data Query Language) 數據查詢語言
select...
DCL(Data Control Language)數據控制語言
grant;revoke...
安裝Oracle(DBA/OP)
創建庫(DBA/OP)
創建用戶(DBA/OP)
登陸數據庫(RD)
訪問數據庫(RD)
文檔
表名,
字段名 ,類型 ,說明
create 語句創建表, 指定表明 表有幾列,列名,每個列的類型
類型:
數字 number(m) 不能超過m
number(m,n) 一共m位,小數占n位
字符串 varchar2(m) 不能超過m
(可變長的字符串2版本)
日期 date
有默認格式 可以修改
在插入日期時必須要符合這個格式
對于日期可以使用to_date函數(但是保存在表中的數據還是系統設置的格式)
第一個參數自己定義的格式
to_date('2016-10-10','yyyy-mm-dd')
第二個參數指明自定義格式
CREATE TABLE table_name (column_name column_type); //創建表 create table emp(id number(10), name varchar2(50), hire_date date, salary number(8,2)); //刪除表 DROP TABLE tablename; drop table emp; //查看表的結構(只能看表的結構,不能看數據) DESC tablename; desc emp //給表添加行 插入式可以指定為null 沒有插入的列就為null 除非有默認值 INSERT INTO tablename( column_name,column_name,column_name) values (xxx,xxx,xxx,xxx); insert into emp(id,name,hire_date,salary)values(101,'lmdtx',to_date('2016-10-10','yyyy-mm-dd'),123123.12); OR insert into emp values (101,'lmdtx',to_date('2016-10-10','yyyy-mm-dd'),123123.12); //修改表中的某些行 where 是根據具體的條件來 UPDATE table_name SET field1=new-value1; UPDATE table_name SET field1=new-value1, field2=new-value2[WHERE Clause] update emp set salary=200 where id=101; 刪除表中行 DELETE FROM tablename; DELETE FROM table_name [WHERE Clause]; delete from emp where id=101; SELECT * FROM tablename; SELECT * FROM tablename [WHERE Clause]; select * from emp; select * from emp where salary>100; select name,salary from emp where salary>100;
oracle 字符操作:
varchar和varchar2 低版本還有區別高版本一樣的
char 和 varchar2的區別:
char 是定長 char(20) 無論用多少都是20空間
=》指的是存儲空間
varchar2是可變長 varchar2(20) 按照實際的給空間
默認是存儲20個英文字符的空間
length()
varchar2 中文:
一個中文占用幾個字符要看你使用的編碼
oracle 不是用的Unicode
在設計表的時候要注意 一般是中文長度 *3
查看oracle 的字符編碼 userenv('language')
select userenv('language') from dual;
dual表 無實際意義,就是偽表給我們用一些函數使用的
nvarchar2 類型 是幾個字符就是幾個字符 和編碼無關
char 和varchar2的最大長度
char 2000個
varchar2 4000個
字符串的連接 || 或者用 conncat(m,n)函數
'aa'||'bb'
create table class( xing nvarchar2(50), ming nvarchar2(50) ); insert into class values('張','三'); insert into class vlaues('steve','steve') select xing||ming from class; select xing||'.'||ming from class; select concat(xing,ming) from class; select concat(concat(xing,'.'), ming) from class;
trim 去掉前后空格trim(String);
ltrim 左邊空格
rtrim 右邊空格
lpad 在左邊填充字符到指定長度 lpad(String,50) 默認是空格
rpad 在右邊填充字符到指定長度rpad(String,50,'*')
lower 小寫lower(String)
upper 大寫
initcap 首字母大寫
length 求長度
substr 截取字符串 substr(String,起始位置) 取到結尾
substr(String,起始位置,取多少個)
substr(String,-20) 從后往前20個
從1 開始
instr 在一個字符串中查找字符串
返回第一次找到的位置 instr(String1,String2) 在String1 中查找String2
從1開始 instr(String1,String2,5) 在String1 中查找String2 從第5個開始找
instr(String1,String,5,2)在String1 中查找String2從第5個開始找到的第2個
create table emp(id number(10), name varchar2(50), hire_date date, salary number(8,2)); desc emp; insert into emp(id,name,hire_date,salary)values(101,'lmdtx',to_date('2016-10-10','yyyy-mm-dd'),123123.12); select *from emp; select * from emp where id=102; select name,salary from emp where salary>1000; update emp set salary=100 where id=102; update emp set salary=3000 where id=1011; update emp set salary=99999 where id>2000; update emp set salary=99999999999 where id=101; delete from emp where id = 010; delete from emp where id = 101; drop table emp; create table INFO_COST( ID number(11) primary key not null, COST_DESC VARCHAR2(200), BASE_DURATION number(11), BASE_COSR number(11,2), UNIT_COST number(11,2)); insert into INFO_COST(ID,COST_DESC,base_duration,base_cosr,unit_cost )values(1,'包20小時',20,2.45,0.30); insert into INFO_COST(ID,COST_DESC,base_duration,base_cosr,unit_cost )values(2,'包40小時',40,3.45,0.30); insert into INFO_COST(ID,COST_DESC,base_duration,base_cosr,unit_cost )values(3,'包100小時',100,4.45,0.30); insert into INFO_COST(ID,COST_DESC,base_duration,base_cosr,unit_cost )values(4,'包200小時',200,5.45,0.30); insert into INFO_COST(ID,COST_DESC,base_duration,base_cosr,unit_cost )values(5,'普通資費',null,null,0.20); insert into INFO_COST(ID,COST_DESC,base_duration,base_cosr,unit_cost )values(6,'包月',null,10,null); update INFO_COST set unit_cost= unit_cost+(unit_cost*10) where id<5; delet from INFO_COST WHERE id=5; select COST_DESC,unit_cost from INFO_COST; create table foo_1(c1 char(5),c2 varchar2(5)); insert into foo_1 values('abc','abc'); select length(c1),length(c2) from foo_1; create table foo_2(c1 varchar(6)); drop table foo_2; insert into foo_2 values('你好'); select * from foo_2; select userenv('language') from dual; desc dual; create table foo_3(c1 nvarchar2(2)); insert into foo_3 values('你好'); create table class( xing nvarchar2(50), ming nvarchar2(50) ); insert into class values('張','三'); select xing||ming from class; insert into class values('steve','steve') select xing||ming from class; select xing||'.'||ming from class; select concat(xing,ming) from class; select concat(concat(xing,'.'), ming) from class; create table foo_4(c1 varchar(500)); drop table foo_4; insert into foo_4 values(' the fortification in your pole. It is like a peek your wallet as the thief, when you are thinking how to spend several hard-won lepta, when you are wondering whether new money, it has laid background. Because of you, then at the heart of the most lax, alert, and most low of '); select trim(c1) from foo_4; select ltrim(c1) from foo_4; select rtrim(c1) from foo_4; select lower(c1) from foo_4; select upper(c1) from foo_4; select initcap(c1) from foo_4; select lpad(c1,600) from foo_4; select lpad(c1,600,'@') from foo_4; select substr(c1,100) from foo_4; select substr(c1,100,120) from foo_4; select substr(c1,-20) from foo_4; select instr(c1,'of') from foo_4; select instr(c1,'of',224) from foo_4; select instr(c1,'of',224,2) from foo_4;
Oracle 日期操作
1日期類型
date 年月日時分秒(基本都是人輸入)
timestamp 年月日時分秒(秒帶小數點)(系統來 時間戳)
sysdate 系統時間
systimestamp 系統時間戳
select sysdate from dual; select systimestamp from dual;
to_date 把一個字符串轉換為日期
select todate('201610-10','yyyy-mm-dd') from dual;
to_char 把時間轉換為指定的格式
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;
create table foo_5(d1 date); insert into foo_5 values(to_date('2016/10/10 09:00:00','yyyy/mm/dd hh:mi:ss')); insert into foo_5 values(sysdate); select to_char(d1,'yyyy~mm~dd hh34:mi:ss') from foo_5; select to_char(d1,'yyyy~mm~dd hh34:mi:ss') from foo_5 where d1>sysdate;
last_day 計算所在月的最后一天
months_between 一個日期和另一個日期差幾個月
least 一個日期和給定日期那一個時間更早
返回小的
greatest一個日期和給定日期那一個時間更近
返回大的
create table foo_6(birthday date); insert into foo_6 values(to_date('1990/09/09','yyyy/mm/hh')); insert into foo_6 values(to_date('1890/09/09','yyyy/mm/hh')); insert into foo_6 values(to_date('2016/10/10','yyyy/mm/hh')); select to_char(last_day(to_date('2016/10/10','yyyy/mm/dd')),'dd') from dual; select months_between(sysdate, birthday)/12 from foo_6; select to_char(least(birthday,to_date('2016/08/08','yyyy-mm-dd')),'yyyy-mm-dd') from foo_6; select least (1, 3 ) from dual select to_char(greatest(birthday,to_date('2016/08/08','yyyy-mm-dd')),'yyyy-mm-dd') from foo_6; select greatest (1, 3 ) from dual
round 對時分秒進行舍入 24小時制 12點后 算明天
trunc 對時分秒直接去掉
select to_char(round(sysdate),'yyyy/mm/dd') from dual; select to_char(trunc(sysdate),'yyyy/mm/dd') from dual;
用于從一個date或者interval類型中截取到特定的部分
extract(year from 日期)
extract(MONTH from 日期)
extract(DAY from 日期)
extract(HOUR from 日期)
extract(MINUTE from 日期)
extract(SECOND from 日期)
select extract(year from sysdate) from dual; select extract(month from sysdate) from dual; select extract(day from sysdate) from dual; select extract(hour from systimestamp) from dual; select extract(minute from systimestamp) from dual; select extract(second from systimestamp) from dual;
create
drop (很少用,必須少用)
alter (很少用,必須少用,在 create 的時候要考慮好)
create table foo_11( n1 number(20); c1 varchar(50); ); insert into foo_11 values(1,'abc'); insert into foo_11 values(null,'bcd'); insert into foo_11 values(3,null); select * from foo_11 where c1 is null;
null 相關:
nvl
nvl(arg1,arg2)
如果arg1 為null 返回arg2
如果arg1不為null 返回arg1
nvl2(arg1,arg2,arg3)
如果arg1為null 返回arg3;
如果arg1不為null 返回arg2;
select nvl(c1,'空')from foo_11; select nvl2(c1,'非空','空') from foo_11;
not null 約束
指定某些列不能為null
create table foo_12( n1 number(20) not null; c1 varchar(20) not null; );
number的舍入(先舍入,在看長度 )
create table foo_13( n1 number(5), n2 number(5,2), //對多的小數位直接舍棄,整數位多報錯 n3 number(5,-1),// 倒數 變 0 抹掉零頭..先舍入,在看長度 最后一個0不算 );
主鍵
數據的唯一性
1創建主鍵
主鍵也是列(多列,聯合主鍵)
一般沒有業務含義
唯一標識數據表中的某一行
必須有主鍵
類型組好是number
主鍵不為null
主鍵不能重復
constraint 主鍵約束名 primary key(主鍵列)
create table stu( stu_id number(11), stu_no number(8), stu_name varchar2(50), constraint stu_pk primary key(stu_id) ); insert into stu values(123,100001,'張三');
修改表
刪除:
drop 刪除表
drop table stu;
delete刪除數據 可以恢復,速度慢
delete table stu; delete table str where stu_id=123;
truncate刪除表內容不能恢復,速度快
truncate table stu;
alter
添加列
如何增加not null列
增加一個可以為空的列
update設置值
將該列改為not null
設置為主鍵
更麻煩
修改列的屬性
刪除列
create table foo_22 ( name varchar2(50) ); insert into foo_22 values('張三'); insert into foo_22 values('李四'); insert into foo_22 values('王五'); insert into foo_22 values('趙六'); insert into foo_22 values('齊七'); alter table foo_22 add ( salary number(8,2) ); desc foo_22; select * from foo_22; alter table foo_22 modify( name varchar2(55) not null ); desc foo_22; alter table foo_22 add( s_id number(8) ); desc foo_22; update foo_22 set s_id=3 where name='張三'; update foo_22 set s_id=4 where name='李四'; update foo_22 set s_id=5 where name='王五'; update foo_22 set s_id=6 where name='趙六'; update foo_22 set s_id=7 where name='齊七'; select * from foo_22; alter table foo_22 drop column s_id; desc foo_22; select * from foo_22;
拷貝數據
但是不能復制約束
create table emp2 as select empno, ename, job,sal from emp; create table emp2 as select empno, ename, job,sal from emp where ename='lmdtx';
拷貝表結構(在where 子句中 加上一個不成立的條件)但是不能復制約束
create table emp3 as select * from emp where 1=2;
>
<
>=
<=
<> 不等于
=
AND
OR
select * from emp2 where ename='' a' or 'b'='b 注入*** select * from emp2 where ename='a' OR 'b'='b';
like 模糊查詢
% 任意個字符
M% 開頭是M的
%M% 有M的
_ 一個字符
select * from emp2 where ename like 'M%'; select * from emp2 where ename like '%A%'; select * from emp2 where ename like '_A%';
where 子句中的between ** and **
select salary from emp2 where salary between 1500 and 3000;
where 子句 中的 in 和 not in
select salary from emp2 where salary in (100,200,300); select * from emp2 where ename='WARD' or ename='JAMES'; select * from emp2 where ename in ('WARD','JAMES'); select * from emp2 where ename not in ('WARD','JAMES');
where 子句判斷空值 is null 和 is not null
select * from emp2 where ename is null; select * from emp2 where ename is not null;
where 中 子查詢
select * from emp2 where SAL=(select salary from emp2 where ename='WARD'); select * from emp2 where ename in (select ename from emp2 where sal<1000 );
where 中 可以使用函數
select * from emp2 where length(ename)>4;
select 列的別名
select 查詢的結果可以看成是一個邏輯上的一張表
select ename name from emp2; 列名 別名 select ename 姓名 from emp2;
去重 distinct
select distinct salary from emp2;
select 中可以使用函數
select ename||job from emp2; select ename||'='||job namejob from emp2;//在加上一個別名
聚合函數(聚集函數)
count// null的不計數 統計 主鍵可以查有多行
select count(ename) from emp2;
min
select max(salary) from emp2;
max
select max(salary) from emp2;
sum
select sum(salary) from emp2;
avg
select avg(salary) from emp2;
排序
order by 對查詢的結果 可以根據某個或者幾個列進行排序
默認 asc 升序
desc 降序
order by 后面也可以使用函數
多個列
先按照一個排序 再按照另一個拍 用
select ename,salary from emp2 where salary>1200 order by salary; select ename,salary from emp2 where salary>1500 order by salary desc; select ename,salary from emp2 where salary>1500 order by length(ename); select ename,salary from emp2 orderby salary,length(ename);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。