對MySQL的理解


關於數據庫其實我們可以簡單的理解為存儲貨物的一個廠庫,里面分別是按照一定的分類存放的物品,然后人們有時會從廠庫中拿走或存儲一些物品,有時也會更改或增加一些分類

這些物品都分門別類的存放在廠庫中,方便人們的查詢和存儲。

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的查詢結果,可使用集合操作符UNIONUNION ALLintersectminus 

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)不包含子查詢、snapshotview select語句

2)Insert語句的子查詢中

3)Insert語句的values

4)Updateset

序列注意事項:

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 serverMySQL中都是可以在定義表的時候,直接指定自增長

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 變量類型....isas

  //定義變量

  Begin

  //執行語句

  End;

 

調用過程的兩種方法:

  Exec 過程名(參數值...

  Call 過程名(參數值...

函數

函數用於返回特定的數據,當建立函數時,在函數頭部必須包含return子句,而在函數體內必須包含return語句返回的數據。我們可以使用create function來建立函數 

:這里所說的函數和summax等函數是相同概念。 

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 方案名.包名.函數名(參數值...;

觸發器

觸發器是指隱含的執行的存儲過程。當定義觸發器時,必須要指定觸發器的事件和觸發器的操作,常用的觸發器事件包括insertupdatedelete語句,而觸發操作實際就是一個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.提高表的邏輯獨立性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM