1. 程式人生 > >MySQL高階查詢和程式設計基礎

MySQL高階查詢和程式設計基礎

第一章 資料庫設計

一、資料需求分析:

  資料需求分析是為後續概念設計和邏輯結構設計做準備。

結構:(1)對現實世界要處理的物件進行詳細的調查。

     (2)收集基礎數、據。

     (3)對所收集的資料進行處理。

     (4)確定新的功能。

 

二、概念結構設計:

 主要的五項概念:實體、屬性、域、碼、實體間聯絡。

  實體之間的聯絡:(1)1:1 在任意一方建立另外一方的外來鍵。

               (2)1:m 在多的一方建立一的外來鍵。

               (3)m:n 建立第三張表,雙方的主鍵在第三張表中作為外來鍵。

 

三、使用E-R模型進行概念結構設計:

    E-R圖概述:

  (1)真實、充分的反映現實世界中事物和事物之間的聯絡。

  (2)簡明易懂。

  (3)易於修改。

  (4)便於向資料邏輯模型轉換。

標識實體的原則包括以下4項:

  (1)實體通常是一個名詞,其名稱應簡明扼要、恰如其分。

  (2)每個實體僅描述一件事情或一個事物。

  (3)每個實體都是唯一的,即不能出現含義相同的實體。

  (4)聯絡通常是一個動詞或動名詞,其名稱應反映出實體之間的內在關聯。

 

四、邏輯結構設計:

    當1:m 的聯絡轉換為關係模式時,通常採用與m端相對應的關係模式進行合併。

五、使用PowerDesigner設計資料庫:

概念模型、物理模型、生成資料庫。

 

 

 

第二章 基本查詢應用

一、SELECT基本結構:

語法:

select <column1, column2, column3...>

from <table_name>

[where <條件表示式>]

[group by column1, column2, column3... | having <條件表示式>]

[order by < column1, column2, column3...> [ASC或者DESC]]

 

說明:

(1)必須的子句只有select和from子句。

(2)where子句用於對查詢結果進行過濾。

(3)group by子句根據指定列分組,having子句對分組後的結果進行過濾。

(4)order by子句用於對查詢結果進行排序。ASC表示升序排序,DESC表示降序排序,預設按照ASC排序。

 

LIMIT子句:

select * from table LIMIT [offset,] rows

 

二、聚合函式:

常用的聚合函式:

1.AVG 返回指定組中的平均值,空值被忽略。

例:select prd_no,avg(qty) from sales group by prd_no

 

2. COUNT 返回指定組中專案的數量。

例:select count(prd_no) from sales

 

3. MAX 返回指定資料的最大值。

例:select prd_no,max(qty) from sales group by prd_no

 

4. MIN 返回指定資料的最小值。

例:select prd_no,min(qty) from sales group by prd_no

 

5. SUM 返回指定資料的和,只能用於數字列,空值被忽略。

例:select prd_no,sum(qty) from sales group by prd_no

 

6. COUNT_BIG 返回指定組中的專案數量,與COUNT函式不同的是COUNT_BIG返回bigint值,而COUNT返回的是int值。

例:select count_big(prd_no) from sales

 

7. GROUPING 產生一個附加的列,當用CUBE或ROLLUP運算子新增行時,輸出值為1.當所新增的行不是由CUBE或ROLLUP產生時,輸出值為0.

例:select prd_no,sum(qty),grouping(prd_no) from sales group by prd_no with rollup

 

8. BINARY_CHECKSUM 返回對錶中的行或表示式列表計算的二進位制校驗值,用於檢測表中行的更改。

例:select prd_no,binary_checksum(qty) from sales group by prd_no

 

9. CHECKSUM_AGG 返回指定資料的校驗值,空值被忽略。

例:select prd_no,checksum_agg(binary_checksum(*)) from sales group by prd_no

 

10. CHECKSUM 返回在表的行上或在表示式列表上計算的校驗值,用於生成雜湊索引。

11. STDEV 返回給定表示式中所有值的統計標準偏差。

例:select stdev(prd_no) from sales

 

12. STDEVP 返回給定表示式中的所有值的填充統計標準偏差。

例:select stdevp(prd_no) from sales

 

13. VAR 返回給定表示式中所有值的統計方差。

例:select var(prd_no) from sales

 

14. VARP 返回給定表示式中所有值的填充的統計方差。

例:select varp(prd_no) from sales

 

分組查詢:

1.使用group by進行分組查詢

在使用group by關鍵字時,在select列表中可以指定的專案是有限制的,select語句中僅許以下幾項:

〉被分組的列

〉為每個分組返回一個值得表示式,例如用一個列名作為引數的聚合函式

group by

例1:

select courseID,avg(score) as 課程平均成績

from score

group by courseID

例2:

select studentID as 學員編號,courseID as 內部測試,avg(score) as 內部測試平均成績

from score

group by studentID,courseID

 

2.使用having子句進行分組篩選

where子句只能對沒有分組統計前的資料行進行篩選,對分組後的條件的篩選必須使用having子句。

例:

select studentID as 學員編號,courseID as 內部測試,avg(score) as 內部測試平均成績

from score

group by studentID,courseID

having avg(score)>60

 

在select語句中,where、group by、having子句和統計函式的執行次序如下:

where子句從資料來源中去掉不符合去搜索條件的資料;group by子句蒐集資料行到各個組中,統計函式為各個組計算統計值;having子句去掉不符合其組搜尋條件的各組資料行 。

 

聯接查詢:

概述:連線查詢是關係資料庫中最主要的查詢,主要包括內連線外連線和交叉連線等。通過連線運算子可以實現多個表查詢。連線是關係資料庫模型的主要特點,也是它區別於其它型別資料庫管理系統的一個標誌。 在關係資料庫管理系統中,表建立時各資料之間的關係不必確定,常把一個實體的所有資訊存放在一個表中。當檢索資料時,通過連線操作查詢出存放在多個表中的不同實體的資訊。連線操作給使用者帶來很大的靈活性,他們可以在任何時候增加新的資料型別。為不同實體建立新的表,然後通過連線進行查詢。

方式形式:內連線的連線查詢結果集中僅包含滿足條件的行,內連線是SQL Server預設的連線方式,可以把INNERJOIN簡寫成JOIN根據所使用的比較方式不同,內連線又分為等值連線、自然連線和不等連線三種;交叉連線的連線查詢結果集中包含兩個表中所有行的組合;外連線的連線查詢結果集中既包含那些滿足條件的行,還包含其中某個表的全部行,有3種形式的外連線:左外連線、右外連線、全外連線。

 

 

第三章 子查詢

一、子查詢的基本知識:

 

巢狀在select、insert、update和deleted語句或其他子查詢中的查詢,允許使用任何表示式的地方均可以使用子查詢,但是子查詢通常位於where子句中。

子查詢的實質:一個select語句的查詢結果能夠座位另一個語句的輸入值。

 

二、單行子查詢:

單行子查詢是指子查詢的返回結果只有一行資料。

當主查詢的條件語句中引用子查詢的結果時,可使用單行比較符(=、>、<、>=、<=和<>)進行比較。

 

三、多行子查詢:

多行子查詢是指查詢的返回結果是多行資料。常見的多行比較符包括IN、ALL。

IN比較符:

使用IN時,主查詢會與子查詢中的每一個值進行比較,如果預期中的任何一個值相同,則返回。NOT IN 與IN的含義恰好相反。

單行子查詢中的“=”可以用多行子查詢中的“IN”替換。

使用ALL關鍵字的子查詢:

語法:表示式或欄位 單行比較運算子 ALL(子查詢)

ALL運算子的含義:

(1)<ALL,表示小於最小值

(2)>ALL,表示大於最大值

ANY運算子的含義:

(1)<ANY,表示大於最小值

(2)>ANY,表示小於最大值

 

四、在FROM子句中使用子查詢:

在from中使用子查詢的實質是將子查詢看作一張虛表與主查詢中的表作聯接查詢。

 

五、在SELECT子句中使用子查詢:

實質:將子查詢的執行結果作為SELECT子句的列,可以起到與聯接查詢異曲同工的作用。

 

六、EXISTS子查詢:

語法:主查詢表示式 [NOT] EXISTS (子查詢)

EXISTS用於檢查子查詢是否會返回一行資料,該子查詢實際上並不返回任何資料,而是返回TRUE或FALSE。EXISTS指定一個字查詢,用於檢測行的存在。當子查詢的行存在時,則執行主查詢表示式,否則不執行。

 

七、在DML語句中使用子查詢:

在UPDATE子句中使用子查詢:

UPDATE [原表] SET [要修改的列] WHERE [條件]

在DELETE子句中使用子查詢:

DELETE FROM [原表] WHERE [條件]

 

八、補充:

子查詢依賴子查詢稱為相關子查詢。

子查詢:

(1)表掃描適合外大內小(效率高)不適合外小內大。

(2)索引。

交叉連線(cross join):

交叉連線是把所有第一個表和第二個表的值一一對應。

例:

select u.username , t.toyname from user as u cross join tay ast ;

 

 

第四章 檢視、索引

一、檢視:

概念和特點:

(1)檢視是一種資料庫物件,是一個從一張表、多張表或檢視中匯出的虛表。檢視的結構和資料是資料表進行查詢的結果。

(2)僅存放檢視的定義,不存放檢視所對應的資料。

(3)如果基表中的資料發生變化,則從檢視中查詢出的資料也隨之改變。

 

優點:

1、關注點聚焦。

2、簡化操作。

3、定製資料。

4、合併分割資料。

5、安全性。

 

建立和使用:

利用CREATE VIEW語句可以建立檢視,該命令的基本語法如下:

CREATE VIEW view_name AS SELECT column_names FROM table_name1 , [table_name2 , table_name3 , ... table_namen] WHERE condition

引數說明:

view_name:檢視名。

column_names:檢視中的欄位列表,可以來源於多個表。

table_name1:表名1.

condition:條件表示式,如果是多表則該表示式還包含表的聯接條件。

 

使用檢視建立複雜查詢:

檢視中的列不僅可以是基表的資料列,還可以是計算機或聚合函式列。

 

二、索引:

概述:

資料庫中的索引是一個表中所包含值的列表,它註明了這些值所對應的儲存位置。

 

基本價值:

提高效率。

 

作用和弊端:

作用:

(1)通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。

(2)可以大大加快資料的檢索速度。

(3)可以加速表與表之間的聯接,在實現資料參考完整性方面有特別的意義。

(4)使用分組和排序子句進行資料檢索時同樣可以顯著減少查詢中分組和排序的時間。

(5)通過使用索引,可以在查詢的過程中使用優化隱藏器,提高系統性能。

弊端:

(1)因為建立索引所需的工作空間約為資料庫表的1.2倍,所以帶索引的表在資料庫中會佔據更多的空間。

(2)為維護索引,在對資料進行插入、更新和刪除操作時會耗費系統時間。

(3)在建立索引時,由於需要複製資料,同樣會耗費系統的時間和空間。

 

使用場合:

(1)在經常需要搜尋的列上,可以加快搜索的速度。

(2)在作為主鍵的列上。

(3)在經常用聯接的列(這些列主要是一些外來鍵)上,建立索引可以加快聯接的速度。

(4)在經常需要根據範圍進行搜尋的列上建立索引。因為索引已經排序,其指定的範圍是連續的。

(5)在經常需要排序的列上建立索引。因為索引已經排序,這樣查詢可以利用索引的排序節省查詢的時間。

(6)在使用WHERE子句的列上建立索引,加快條件的判斷速度。

一般而言,不應該建立索引的列具有以下4個特點:

(1)對於那些在查詢中很少使用或參考的列不應該建立索引。

(2)對於那些只有很少資料值的列而言,同樣不應該增加索引。

(3)對於那些定義text、image和bit資料型別的列不應該增加索引。

(4)當修改效能遠大於檢索效能時,不應該建立索引。

 

分類:

(1)聚集索引:

聚集索引是將資料的值在表內排序並儲存對應的資料記錄,是資料表物理排序與索引順序相一致。

(2)非聚集索引(普通索引):

非聚集索引也稱為普通索引,它是一種完全獨立於資料進行的檔案結構。資料儲存在一個地方,索引儲存在另一個地方。非聚集索引中的資料排列順序並非表中結構的排列順序。

(3)聚集索引和非聚集索引的比較:

a. 聚集索引相比非聚集索引,在插入資料時速度要慢(時間花費在“物理儲存排序”上,即首先要找到位置然後插入),但在查詢資料時速度要快。

b. 如果硬碟和記憶體空間有限,則應限制非聚集索引的使用。

 

建立索引的方法:

(1)MySQL自動建立索引。

MySQL在建立表中其他物件時可以附帶建立新索引。通常情況下,MySQL在建立UNIQUE約束或PRIMARY KEY約束時,系統會自動在這些約束上建立聚集索引;另外系統通常也會在自動外來鍵列上建立非聚集索引(即普通索引)。

(2)使用者建立索引。

除了MySQL自動生成索引外,也可以根據實際需要,使用MySQL整合開發平臺(如Navicat For MySQL),或者利用SQL語句CREATE INDEX命令直接建立索引。

 

使用ALTER命令建立索引:

ALTER TABLE table_name ADD INDEX index_name (column_list);

ALTER TABLE table_name ADD UNIQUE (column_list);

ALTER TABLE table_name ADD PRIMARY KEY (column_list);

 

使用CREATE命令建立索引:

CREATE INDEX index_name ON table_name (column_list);

CREATE UNIQUE INDEX index_name ON table_name (column_list);

 

使用DROP和ALTER命令刪除索引:

DROP INDEX index_name ON table_name; 或

ALTER TABLE table_name DROP INDEX index_name;

 

 

第五章 MySQL儲存過程

一、使用者自定義變數:

使用者會話變數:

語法1:

set @user_variable1=expression1 [,@user_variable2=expression2,......]

語法2:

select @user_variable1:=expression1 [,@user_variable2:=expression2,......]

語法3:

select expression1 into @user_variable1,expression2 into @user_variable2,......

 

使用者會話變數與SQL語句:

檢索資料時,如果select語句的結果集是單個值,可以將select語句的返回結果賦予使用者會話變數。

 

區域性變數:

語法:

declare 資料型別 區域性變數;

 

重置命令結束標記:

begin-end語句快中通常存在多條MySQL表示式,每條MySQL表示式都是用“;”作為結束標記。

 

二、條件控制語句:

if語句:

if語句根據條件表示式的值確定執行不同的語句塊。

語法:

if 條件表示式1 then 語句塊1;

[elseif 條件表示式2 then 語句塊2]...

[else 語句塊n]

endif;

 

case語句:

case語句用於實現比if語句分支更為複雜的條件判斷。

語法:

case 表示式

when value1 then 語句塊1;

when value1 then 語句塊2;

...

else 語句塊n;

end case;

 

while語句:

當條件表示式的值為true時,反覆執行迴圈體,直到條件表示式的值為false。

語法:

[迴圈標籤:] while 條件表示式 do

迴圈體;

end while[迴圈標籤];

 

leave語句:

leave語句用於跳出當前的迴圈語句(如while語句),它的作用等同於高階程式語言中的break語句。

語法:

leave 迴圈標籤;

 

iterator語句:

iterator語句用於跳出本次迴圈,進而進行下次迴圈,它的作用等同於高階程式語言中的continue語句。

語法:

iterator 迴圈標籤;

 

三、儲存過程:

建立和執行儲存過程:

建立:

create procedure 儲存過程的名字(

[in | out | inout] 引數1 資料型別1,

[in | out | inout] 引數2 資料型別2,

...

)

[no sql | reads sql data | modifies sql data]

begin

儲存過程語句塊,

end

執行:

call 儲存過程名(引數列表)

 

不帶引數的儲存過程:

執行:

call 儲存過程名

 

帶輸入引數的儲存過程:

注意:

執行帶引數的儲存過程時,傳入值的型別、個數和順序都需要與儲存過程中定義的引數逐一對應。

 

帶輸出引數的儲存過程:

如果需要儲存過程中返回一格值或者多個值,可通過使用輸出引數來實現。輸出引數必須在建立儲存過程時,使用out關鍵字進行宣告。

 

四、遊標:

MySQL中使用遊標的步驟:

(1)宣告遊標:

語法:

declare 遊標名 cursor for select 語句;

(2)開啟遊標:

語法:

open 遊標名;

(3)從遊標中提取資料:

語法:

fetch 遊標名 into 變數名1 , 變數名2 , ......;

(4)關閉遊標:

語法:

close 遊標;

 

遊標使用:

略。

 

 

第七章 資料庫事物查詢與查詢優化

一、事物:

事物概述:

事物是一個由所定義的完整的工作單元,一個事物內所有語句誒作為一個整體來執行。即或者全部執行,或者全部都不執行。當遇到錯誤時,可以回滾事務,取消事物內所做的所有改變,從而保證資料庫中資料的一致性和可恢復性。

 

事物特性:

1、原子性。

2、一致性。

3、隔離性。

4、永續性。

 

關閉MySQL自動提交:

方法一:(顯示的關閉自動提交)

set autocommit=0;

方法二:(隱示的關閉自動提交)

start transaction;

 

MySQL事物操作語句:

start transaction: 標識一個事物的開始,即啟動事物。

相關推薦

MySQL高階查詢程式設計基礎

第一章 資料庫設計 一、資料需求分析:   資料需求分析是為後續概念設計和邏輯結構設計做準備。 結構:(1)對現實世界要處理的物件進行詳細的調查。      (2)收集基礎數、據。      

MySQL聯合查詢左關聯的區別

rand 定義 ges left join == sql img alt 我把這個定義為聯合查詢或者說並查詢: 第1種:SELECT a.gbname,b.gcontent FROM tb_goodsbrand a,tb_goods b WHERE a.gbid = b.g

Mysql高階查詢,約束,索引

1、高階查詢 (1)總結 3、select ... 聚合函式 from 表名 1、where ... 2

MySQL查詢表連線查詢

SELECT * FROM grade; SELECT * FROM result; SELECT * FROM student; SELECT * FROM subject; SELECT s.StudentNo ,s.StudentName ,j.SubjectName ,r.Stude

MySQL高階查詢筆記

SELECT 獨立欄位名,COUNT(*) FROM 表名 GROUP BY 獨立欄位名; 注意:分組查詢的結果集中只能包含兩種列 (1)分組條件列 (2)其他列的聚合函式 2.複雜查詢---子查詢 步驟1:到表中查詢出對於的編號 SELECT 欄位名 FROM 表名 WHE

人工智慧(mysql)—— mysql高階查詢(索引、多表、連線)

一、索引    1、索引的定義                對資料庫中表的一列或者多列的值進行排序的一種結構(MySQL中索引用Btree方式)    2、索引的優點                加快資料的檢索速度    3、索引的缺點                a、

mongoDB的高階查詢高階修改

db.c1.remove();    刪除c1集合中所有的資料 db.c1.remove("條件");    刪除c1集合中符合條件的所有的資料 修改資料把user3修改成user30: 若已經插入db.c1.insert({name:"user3",age:30}); { "_id" : ObjectId(

MySQL高階查詢簡例

多表查詢 1,內連線 1.1 等值連線 方式一:= 查詢所有員工的員工和部門資訊(查詢員工和部門的資訊) select * from emp,dept 產生一個笛卡爾集 下面就是避免笛卡爾集的方式:等值條件 select * from emp,dept where emp.deptn

Mybatis學習記錄(四)--高階查詢快取

這些都是連貫的學習筆記,所以有的地方因為之前都說過,所以也就沒怎麼寫詳細了,看不太明白的可以看看之前的筆記. 一.高階查詢 高階查詢主要是一對一查詢,一對多查詢,多對多查詢 1.一對一查詢 有使用者和訂單兩個表,使用者對訂單是1對1查詢.也就是訂

MySQL 高階查詢

昨天寫了一篇關於MySQL的簡單單表查詢的文章,但對於一個程式設計師來說,那些都是很基礎的,單一的一個表在實際專案開發中基本上不會遇到。高階查詢雖說也是基礎,但相較於單表,高階查詢的邏輯性更高,語句也

網站開啟慢之學習mysql查詢linux top命令

今天在公司,休息的時候開啟自家網站看了看,逛到一個商品列表頁的時候,感覺很慢,遂覺得哪裡出了問題。 這時,我不知道什麼情況,不過有種感覺,覺得應該是sql問題,這可能就是經驗問題,於是ssh 到伺服器。 top 命令 一看嚇一跳  mysql  CPU% 高達  

資料庫:mysql基礎(四)---高階查詢

子查詢(巢狀查詢) 將一個查詢結果作為另一個查詢的條件或者組成繼續進行檢索 分類 #先看一個例子 #查詢20號部門所有員工及其所在部門資訊 #用關聯查詢來做 select * from emp,dept where emp.deptno = dep

Linux高階程式設計基礎——程序間通訊之用sigqueue函式sigaction函式實現訊號的安裝與傳送

程序間通訊之用sigqueue函式和sigaction函式實現訊號的安裝與傳送 程序A向程序B傳送SIGUSR1訊號; 程序B收到訊號後,列印字串“receive SIGUSR1”; 要求用sigqueue函式和sigaction函式實現以上功能; /這個實

MySQL查詢過程高階查詢

通過中篇的介紹,你會了解到: MySQL查詢過程 高階查詢相關概念 explain命令詳細介紹 索引優化建議 MySQL查詢過程 想要更好的優化查詢,首先要了解其整體查詢過程,從客戶端傳送查詢請求,到接收到查詢結果,MySQL伺

MySQL基礎知識(四)——子查詢連線

一.子查詢 先建立一張商品表,後續對其進行操作。 # 建立一個商品表,商品id:goods_id 商品名稱:goods_name 商品分類:goods_cate # 商品品牌:brand_name 商品價格:goods_price 是否上架:is_show 是否已售空:is_saleof

數據庫基礎(2):簡單查詢連接查詢

輸出 bsp 排列 原理 max 數學 mar exists credit 1. 實驗內容   建的數據庫如下: 1 CREATE TABLE Depts 2 ( 3 Dno CHAR(20) PRIMARY KEY, 4 Dname CHAR(2

Mysql聯合查詢UNIONUNION ALL的使用介紹

組合 ans per ext 輸入 and nbsp 理解 des 一、UNION和UNION ALL的作用和語法 UNION 用於合並兩個或多個 SELECT 語句的結果集,並消去表中任何重復行。UNION 內部的 SELECT 語句必須擁有相同數量的列,列也必須擁有

mysql查詢分析工具分析方法

mysql 慢查詢 分析工具 1.mysql慢查詢分析工具1.參考文檔:http://www.ttlsa.com/mysql/analyse-slow-query-log-using-anemometer/http://isadba.com/?p=655官方文檔:https://github.co

MySQL查詢日誌相關的配置使用。

其他 進制 數據 mps 執行 不存在 時間 tex http MySQL慢查詢日誌提供了超過指定時間閾值的查詢信息,為性能優化提供了主要的參考依據,是一個非常實用的功能,MySQL慢查詢日誌的開啟和配置非常簡單,可以指定記錄的文件(或者表),超過的時間閾值等就可以記

nginx負載均衡mysql主主被動模式基礎架構綜合部署

nginx負載均衡 mysql主從(主主被動互備模式) 1.結構思路 準備用5個虛機,一個虛機安裝nginx來配置負載均衡,兩個虛機做web服務器,另外兩個虛機,安裝mysql,做主主被動配置,每次web只讀取一個mysql服務。 2.具體實施步驟 用vmware最小化安裝5個虛機,我用的是c