關於數據庫其實我們可以簡單的理解為存儲貨物的一個廠庫,里面分別是按照一定的分類存放的物品,然后人們有時會從廠庫中拿走或存儲一些物品,有時也會更改或增加一些分類
這些物品都分門別類的存放在廠庫中,方便人們的查詢和存儲。
MySQL是一個關系型數據庫管理系統,開發者為瑞典MySQL AB公司。目前MySQL被廣泛地應用在互聯網行業。由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多互聯網公司選擇了MySQL作為后端數據庫。2008年MySQL被Sun公司收購,2010年甲骨文成功收購Sun公司。
MySQL數據庫的優點:
1、多語言支持:Mysql為C、C++、Python、Java、Perl、PHP、Ruby等多種編程語言提供了API,訪問和使用方便。
2、可以移植性好:MySQL是跨平台的。
3、免費開源。
4、高效:MySql的核心程序采用完全的多線程編程。
5、支持大量數據查詢和存儲:Mysql可以承受大量的並發訪問。
由於本人最先接觸到的數據庫是oracle,在此談論mysql說的有些命令或知識可能是oracle 上的,mysql可能不適用,見諒
首先先介紹下mysql的常用命令:
顯示所有數據庫:show databases;
•選定默認數據庫:use dbname;
•顯示默認數據庫中所有表:show tables;
•放棄正在輸入的命令:\c
•顯示命令清單:\h
•退出mysql程序:\q
•查看mysql服務器狀態信息:\s
mysql目前用的最多的存儲引擎就是InnoDB存儲引擎
InnoDB給MySQL的表提供了事務、回滾、崩潰修復能力、多版本並發控制的事務安全。在 MySQL從 3.23.34a 開始包含 InnoDB 存儲引擎。InnoDB 是 MySQL 上第一個提供外鍵約束的表引擎。而且InnoDB對事務處理的能力,也是MySQL其他存儲引擎所無法與之比擬的。
InnoDB存儲引擎的特點
1)支持外鍵(Foreign Key)
2)支持事務(Transaction):如果某張表主要提供OLTP支持,需要執行大量的增、刪、改操作(insert、delete、update語句),出於事務安全方面的考慮,InnoDB存儲引擎是更好的選擇。
SQL(Structured Query Language)語言的全稱是結構化查詢語言。數據庫管理系統通過SQL語言來管理數據庫中的數據。
SQL語言分為三個部分:數據定義語言(Data Definition Language,簡稱為DDL)、數據操作語言(Data Manipulation Language,簡稱為DML)和數據控制語言(Data Control Language,簡稱為DCL)。
DDL語句:CREATE、ALTER、DROP
DML語句:update、insert、delete、select
DCL語句:是數據庫控制功能。是用來設置或更改數據庫用戶或角色權限的語句,包括(grant,deny,revoke等)語句
每個數據庫建立是來后都會有一個數據庫實例,所謂數據庫實例就是一個數據庫的服務器,在該實例中會有用戶,剛剛創建的用戶是沒有任何權限的,因此,需要dba給該用戶授權
當一個用戶創建了任意一個數據對象,dbms就會創建一個相應的方案與之對應,且該方案名與應戶名相同
用戶權限分系統權限和對象權限,系統權限是和數據庫管理相關的權限,如create table、create view等,而對象權限是和用戶操作數據庫相關的權限,如數據庫的增刪改查。
說到權限就不得不說角色了,角色是一組權限的集合,目的是為了簡化對權限的管理,從而達到簡單對用戶的管理。
角色可以包含系統權限,也可以包含對象權限。
oracle中有嚴格的權限之分,至於mysql暫不清楚故不做深討~~~
下面簡單介紹下mysql一些基本命令:
一、數據庫增刪改查
1、增:有2種方法
1).使用insert插入單行數據:
語法:insert [into] <表名> [列名] values <列值>
例:insert into strdents (姓名,性別,出生日期) values ('張三','男','1990/1/1')
注意:如果省略表名,將依次插入所有列
2).使用insert,select語句將現有表中的 數據添加到已有的新表中
語法:insert into <已有的新表> <列名> select <原表列名> from <原表名>
例:insert into address ('姓名','地址','電子郵件')select name,address,email from Strdents
注意:查詢得到的數據個數、順序、數據類型等,必須與插入的項保持一致
2、刪:有2中方法
1).使用delete刪除數據某些數據
語法:delete from <表名> [where <刪除條件>]
例:delete from a where name='張三'(刪除表a中列值為張三的行)
注意:刪除整行不是刪除單個字段,所以在delete后面不能出現字段名
2).使用truncate table 刪除整個表的數據
語法:truncate table <表名>
例:truncate table addressList
注意:刪除表的所有行,但表的結構、列、約束、索引等不會被刪除;不能用於有外建約束引用的表
truncate與delete 的區別:
1)delete數據DML語句,其事物可以回歸,而truncate是DDL語句,不能回滾;
2)delete只是刪除表中數據,如表中有自增長列,不會改變自增長的數值,仍按原數據增長,而truncate會連自增長數值一並刪除,重新開始自增長;
3)truncate會釋放表的存儲空間,而delete 不會,高水位標記(HWM)不會降低。
注:
Drop :刪除數據表或數據庫,或刪除數據表字段,此方法不可逆
語法:drop database 數據庫名稱
三、改 使用update更新修改數據
語法:update <表名> set <列名=更新值> [where <更新條件>]
例:update addressList set 年齡=18 where 姓名='張三'
注意:set后面可以緊隨多個數據列的更新值(非數字要引號);where子句是可選的(非數字要引號),用來限制條件,如果不選則整個表的所有行都被更新
四、查
1.普通查詢
語法:select <列名> from <表名> [where <查詢條件表達試>] [order by <排序的列
名>[asc或desc]]
1).查詢所有數據行和列
例:select * from a
說明:查詢a表中所有行和
2).查詢部分行列--條件查詢
例:select i,j,k from a where f=5
說明:查詢表a中f=5的所有行,並顯示i,j,k3列
3).在查詢中使用AS更改列名
例:select name as 姓名 from a where gender='男'
說明:查詢a表中性別為男的所有行,顯示name列,並將name列改名為(姓名)顯示
4).查詢空行
例:select name from a where email is null
說明:查詢表a中email為空的所有行,並顯示name列;SQL語句中用is null或者is not null來判斷是否為空行
5).在查詢中使用常量
例:select name '北京' as 地址 from a
說明:查詢表a,顯示name列,並添加地址列,其列值都為'北京'
6).查詢返回限制行數(關鍵字:limit)
Select * from 表名 limit 從第幾條取,取幾條
例1:select * from students limit 3,5
說明:查詢表students ,顯示列表的3-5行,limit 為關鍵字(oracle 中沒有top關鍵字用rownum替代)
select * from a where rownum<6
7).查詢排序(關鍵字:order by , asc , desc)
例:select * from students where grade>=60 order by desc
說明:查詢表中成績大於等於60的所有行,並按降序顯示;默認為ASC升序
2.模糊查詢
1).使用like進行模糊查詢
注意:like運算副只用語字符串,
例:select * from students where name like '趙%'
說明:查詢顯示表students中,name字段第一個字為趙的記錄
2).使用between在某個范圍內進行查詢
例:select * from students where age between 18 and 20
說明:查詢顯示表a中年齡在18到20之間的記錄
3).使用in在列舉值內進行查詢(in后是多個的數據)
例:select name from students where address in ('北京','上海','唐山')
說明:查詢表students中address值為北京或者上海或者唐山的記錄,顯示name字段
3.分組查詢
1).使用group by進行分組查詢
例:select studentID as 學員編號, AVG(score) as 平均成績 (注釋:這里的score是列名)
from score (注釋:這里的score是表名)
group by studentID
2).使用having子句進行分組篩選
例:select studentID as 學員編號, AVG from score group by studentID having count(score)>1
說明:接上面例子,顯示分組后count(score)>1的行,由於where只能在沒有分組時使用,分組后只能使用having來限制條件,
4.多表聯接查詢
1).等號聯接
①在where子句中指定聯接條件
例:select a.name,b.mark from a,b where a.name=b.name
說明:查詢表a和表b中name字段相等的記錄,並顯示表a中的name字段和表b中的mark字段
注:上述sql中where后條件a.name=b.name一定要有,否則會出現笛卡爾結果
2)Left join:左連接, 連接兩張表,以左邊表的數據匹配右邊表中的數據,如果左邊表中的數據在右邊表中沒有,會顯示左邊表中的數據。
select a.name 學生姓名,b.score 學生成績 from students a left join score b on a.id=b.student_id;
3)Right join:右連接,連接兩張表,以右邊表的數據匹配左邊表中的數據,如果左邊表中的數據在左邊邊表中沒有,會顯示右邊表中的數據。
select a.name 學生姓名,b.score 學生成績 from students a right join score b on a.id=b.student_id;
4)Inner join:內連接,連接兩張表,匹配兩張表中的數據,和前面兩個不同的是只會顯示匹配的數據。
select a.name 學生姓名,b.score 學生成績 from students a INNER join score b on a.id=b.student_id;
二、合並查詢
合並多個select的查詢結果,可使用集合操作符UNION,UNION ALL,intersect,minus
1)union查詢結果會自動去掉重復項,而union all不會去掉重復項
2)intersect取交集
3)minus 取差集
a1 minus a2 結果取a1中去掉與 a2相同的部分,如沒有相同部分則不去掉。
注:mysql中僅支持union與union all查詢,不知最新版mysql是否支持其他的合並查詢
Select avg(sal),deptno,job from emp group by cube(deptno,job);deptno--先按deptno分組,再按job分組
三、序列
在mysql的一張表中,我們希望有列,假設該列是整形,我們希望當我們添加一條記錄的時候,該列值能夠自動的增長(比如從1開始增長,每次增長1)
下面分別說下不同數據庫建序列方式:
1)oracle
例:創建一個序列
create sequence myseq
Start with 1
Increment by 1
minvalue 1
maxvalue 30000
cycle //cycle表示當前序列增加30000,從1開始,每次增加1
nocache
使用:創建一張表
Create table aa (id number primary key,name varchar2(32));
使用: insert into aa values(myseq.nextval,’abc’);
序列細節說明:
一旦定義了某個序列,你就可以用currval,nextval
Currval:返回sequence的當前值
Nextval:增加sequence的值,然后返回sequence值
比如:
序列名.currval
序列名.nextval
什么時候使用序列:
1)不包含子查詢、snapshot、view 的select語句
2)Insert語句的子查詢中
3)Insert語句的values中
4)Update的set中
序列注意事項:
1)currval總是返回當前sequence的值,但是在第一次nextval初始化之后才能使用currval,否則會出錯。一次nextval會增加一次sequence的值,所以如果同一個語句里面使用多個nextval,其值就是不一樣的。
2)第一次nextval返回的是初始值,隨后的nextval會自動增加你定義的increment by值,然后返回增加后的值
3)如果指定cache值,oracle就可以預先在內存里面放置一些sequence,這樣存取的快些,cache里面的取完后,oracle自動再取一組到cache。使用cache或許會跳號,比如數據庫突然不正常down掉(shutdown abort),cache中的sequence就會丟失,所以可以在create sequence的時候用nocache防止這種情況
2)
在sql server和MySQL中都是可以在定義表的時候,直接指定自增長
Sqlserver
Crete table temp1(
Id int primary key identity(1,1),
Name varchar(36));
Mysql:
Create table temp1(
Id int primary key c,
Name varchar(36));
四、索引
所謂索引可以簡單的理解為一本書的目錄,通過目錄我們能快速的找到我們所要查找的內容
索引分類
1)單列索引
Create index 索引名 on 表名(列名)
2)復合索引
Create index 索引名 on 表名(列名1,列名2);
創建索引原則:
1)在大表上建立索引才有意義
2)在where子句或是連接條件上經常引用的列上建立索引
3)索引的層次不要超過4層
4)在邏輯類型字段上,或者值就是固定幾種的列上也不要建立索引
mysql編程
使用pl/sql編程的優缺點
使用純sql語句來操作數據庫,有技術缺陷
1、不能模塊化編程,為了完成下訂單,可能要發出幾條sql
2、執行速度低
3、安全性問題
4、浪費帶寬
使用pl/sql來編寫過程,可以提高效率
缺點:移植性不高
快速入門案例:
Create procedure prol is
Begin
Insert into emp (empno,ename) values(1234,’1234’);
End;
\
1、在控制台調用
Exec 過程名(參數1,...,參數n)
Sql編程規范:
1、當定義變量時,建議用v_作為前綴v_sal
2、當定義常量時,建議用c_作為前綴c_rate
3、當定義游標時,建議用_cursor作為后綴emp_cursor;
4、當定義例外時,建議用e_做為前綴e_error;
pl/sql塊
塊(block)是pl/sql的基本程序單元,編寫pl/sql程序實際上就是編寫pl/sql塊。要完成相對簡單的應用功能,可能只需編寫一個pl/sql塊,但如果要想實現復雜的功能,可能需要在一個pl/sql中鑲嵌其他的pl/sql塊。
pl/sql塊有三個部分構成:定義部分、執行部分、例外處理部分:
Declare
/*定義部分----定義常量、變量、游標、復雜數據類型*/
Begin
/*執行部分----要執行的pl/sql語句和sql語句*/
Exception
/*例外處理部分----處理運行的各種錯誤*/
End;
定義部分是從declare開始的,該部分是可選的,執行部分是從begin開始的,該部分是必須的,例外處理部分是從exception開始的,該部分是可選的
異常處理作用:
1、可以捕獲異常,並給出明確提示
2、有時可以利用異常,進行業務處理
過程
過程用於執行特定的操作,當建立過程時,既可以指定輸入參數(in),也可以指定輸出參數(out)。通過在過程中使用輸入參數,可以將數據傳遞到執行部分;通過使用輸出參數,可以將執行部分的數據傳遞到應用環境,在sql/plus中可以使用create procedure命令來建立過程。
Oracle 的過程可以指定參數是輸入的參數還是輸出的參數,默認是輸入參數。
基本語法:
Create procedure 過程名(變量 in 變量類型……,變量 out 變量類型....)is(as)
//定義變量
Begin
//執行語句
End;
調用過程的兩種方法:
Exec 過程名(參數值...)
Call 過程名(參數值...)
函數
函數用於返回特定的數據,當建立函數時,在函數頭部必須包含return子句,而在函數體內必須包含return語句返回的數據。我們可以使用create function來建立函數
注:這里所說的函數和sum、max等函數是相同概念。
Create function 函數名(參數1...)
Return 數據類型 is
定義變量;
Begin
執行語句;
End;
在sql/plus中調用函數
Var 變量名 變量類型
Call 函數名(參數值...)into :變量名;
Print 變量名
函數和過程的區別
1)函數必須有返回值,而過程可以沒有
2)函數和過程在java中調用方式不一樣
函數:select 自己的函數名(列) from 表
過程:使用CallableStatement去完成調用
包
包用於在邏輯上組合過程和函數,它由包規范和包體兩部分組成。
1、我們可以使用create package命令來建包
Create [or replace] package 包名 is
Procedure 過程名(變量名 變量類型...);
Function 函數名(變量名 變量類型...)return 數據類型
End;
包的規范只包含了過程和函數的說明,但是沒有過程和函數的實現代碼。包體用於實現包規范中的過程和函數。
在不同包中可以建立相同名字的過程、函數
包體
建立包體可以使用create package body 命令
基本語法:
Create or replace package body 包名 is
--實現過程
Procedure 過程名(變量名 變量類型...) is
//定義變量
Begin
//執行語句;
End;
--實現函數
Function 函數名(變量名 變量類型...)
Return 數據類型 is
//定義變量;
Begin
//執行語句;
End;
End;
包名必須先定義
注:
在包中聲明的變量必須在包體中實現!
在包體中使用的變量必須先在包中定義!
調用包的過程或函數
當調用包的過程或是函數時,在過程和函數前需要帶有包名,如果要訪問其他方案的包,還需要在包名前加方案名。
Exec 方案名.包名.過程名(參數值...);
Call 方案名.包名.函數名(參數值...);
觸發器
觸發器是指隱含的執行的存儲過程。當定義觸發器時,必須要指定觸發器的事件和觸發器的操作,常用的觸發器事件包括insert、update、delete語句,而觸發操作實際就是一個pl/sql塊。可以使用create trigger來建立觸發器
觸發器是非常有用的,可維護數據庫的安全和一致性。
mysql數據庫的備份
使用mysqldump命令備份
mysqldump命令可以將數據庫中的數據備份成一個文本文件。表的結構和表中的數據將存儲在生成的文本文件中。
mysqldump命令的工作原理很簡單。它先查出需要備份的表的結構,再在文本文件中生成一個CREATE語句。然后,將表中的所有記錄轉換成一條INSERT語句。這些CREATE語句和INSERT語句都是還原時使用的。還原數據時就可以使用其中的CREATE語句來創建表。使用其中的INSERT語句來還原數據
Mysqldump常用參數:
•--all-databases , -A 導出全部數據庫
•--add-drop-database 每個數據庫創建之前添加drop數據庫語句
•--no-data, -d 不導出任何數據,只導出數據庫表結構。
•--no-create-db, -n只導出數據,而不添加CREATE DATABASE 語句。
•--no-create-info, -t 只導出數據,而不添加CREATE TABLE 語句。
mysql視圖
視圖可以理解為是一張虛擬的表,它是基於表而存在的,且不占用存儲空間,視圖中的數據存放在原來的表中。使用視圖查詢數據時,數據庫系統會從原來的表中取出對應的數據。
視圖的作用歸納為如下幾點:
1.使操作簡單化
2.增加數據的安全性
3.提高表的邏輯獨立性