mysql问题举例_MySql问题总结
Q1:主鍵,外鍵,超鍵,候選鍵;
主鍵 對表中數據進行唯一標識的數據列的組合;不能缺失;不能空值;
外鍵 該列為另一表的主鍵;
超鍵 關系中能唯一標識數據的屬性;
候選鍵 不含多余屬性的超鍵;
Q2:數據庫事務的四個特征及含義;
原子性 要么全部完成,要么不完成,若發生錯誤會進行回滾操作;
一致性 開始到結束后,數據庫完整性約束沒收到破壞;(實體完整性,參照完整性,用戶定義的完整性)
隔離性 事務與事務之間相隔離,串行化執行;
持久性 事務完成對數據的影響是永久的;
Q3:視圖的作用,可以更改嗎;
視圖是虛擬的表;只包含動態檢索數據的查詢,不包含數據;簡化操作,隱藏細節,保護數據;對視圖的更新會作用于基表,一般不更新;
Q4:drop,delete和truncate ;
drop 表級的刪除;不能回滾;
truncate 清空表;不記錄單行刪除日志;無法恢復;只能對于TABLE操作;不能在帶FOREIGN KEY約束的表(被引用的表)中使用;計數從頭開始;
delete 配合where刪除數據;會記錄日志用于回歸;會觸發觸發器;不減少索引和表的空間;
Q5:索引的工作原理和其種類;
索引的實現通常采用B樹或B+樹,加快查詢速度也消耗更多空間;
唯一索引 不允許任何兩行具相同值
主鍵索引 唯一索引的一種
聚集索引 行的物理順序和鍵值的索引順序相同
普通索引 無限制
全文索引 針對較大的數據生成全文索引很耗時間空間
組合索引 最左前綴原則:若對多列建立組合索引,若第二列未使用索引,則第三列也不會使用
InnoDB 主索引:InnoDB的數據文件本身;輔助索引:相應記錄主鍵的值
MyISAM 索引與數據分離;輔助索引:與主索引無區別;
Q6:連接的種類
內部聯接(等值聯接) INNER JOIN
外部聯接(包含在相關表中沒有關聯行的行) LEFT OUTER JOIN
RIGHT OUTER JOIN
Q7:數據庫范式
1NF 每一列都是不可分割的基本數據項,同一列無二值;無重復的域;
2NF 實例依賴于主鍵部分;
3NF 屬性不依賴于其他非主屬性;
Q8:存儲過程與觸發器的區別
存儲過程和觸發器都是SQL語句集;觸發器不可用CALL調用,而是在用戶執行某些語句后自動調用;
Q9:分表與分區
分表 真正的分表,每張表對應三個文件;提高MYSQL的并發能力;
分區 表中的數據分成多個區塊;突破磁盤的讀寫能力;
Q10:數據庫隔離級別
臟讀 一個事務讀取了另一個事務未提交的數據
不可重復讀 在一次事務范圍內,讀取同一數據產生了不同的值
虛讀 讀取整體的數據后,因其他事務對數據的更新,再次查詢時結果不同
串行化 3種均可避免
可重復讀(默認) 避免1,2
讀已提交 1
讀未提交 無
Q11:MYSQL的兩種存儲引擎
MYISAM 不支持事務,不支持外鍵,表鎖;插入數據時鎖定整個表,查行數時無需整表掃描
INNODB 支持事務,外鍵,行鎖,查表總行數時,全表掃描;
Q12:MYSQL索引算法
HASH 適合等值查找,不適合范圍,不能排序
BTREE 適合范圍查找,無hash沖突
Q13:聚集索引和非聚集索引
聚集索引 數據按索引順序存儲,節點存儲的是真實數據
非聚集索引 節點存儲的是指向真正數據的指針
Q14:索引的優缺點
優點 提高查詢效率
缺點 降低了更新效率
Q15:兩種存儲引擎索引的區別
Innodb 主索引的數據文件本身就是索引文件;輔助索引記錄主鍵的值;
MyISAM 主索引數據文件和索引文件分離;與主索引無區別;
Q16:數據庫的主從復制
一個服務器作為主服務器,一個或多個服務器作為從服務器,主服務器將更新寫到二進制日志,當一個從服務器連接到主服務器時,通知主服務器讀取日志,接收從那時起發生的所有更新。解決:數據分布,負載平衡,備份,高可用性和容錯性
基于語句 在主服務器上執行的語句,在從服務器上也執行
基于行 將改變的內容復制過去
混合類型 語句復制失敗時采用行的形式
Q17:數據庫連接池
為數據庫連接建立一個緩沖池,防止過于大量的連接的建立與管理;
Q18:存儲過程
存儲過程是一些預編譯的SQL語句,執行效率較高
Q19:樂觀鎖和悲觀鎖
樂觀鎖 假定不會發生并發沖突,只在提交時檢查,若有其他數據更新了數據,則回滾;使用數據版本標示數據(時間戳,版本號)
悲觀鎖 假定會發生并發沖突,屏蔽一切破壞數據庫一致性的操作,主要用于數據爭用激烈的環境,以及鎖成本低于回滾成本時;排他鎖;
25、 對于關系型數據庫而言,索引是相當重要的概念,請回答有關索引的幾個問題:
a)、索引的目的是什么?
快速訪問數據表中的特定信息,提高檢索速度
創建唯一性索引,保證數據庫表中每一行數據的唯一性。
加速表和表之間的連接
使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間
b)、索引對數據庫系統的負面影響是什么?
負面影響:
創建索引和維護索引需要耗費時間,這個時間隨著數據量的增加而增加;索引需要占用物理空間,不光是表需要占用數據空間,每個索引也需要占用物理空間;當對表進行增、刪、改、的時候索引也要動態維護,這樣就降低了數據的維護速度。
c)、為數據表建立索引的原則有哪些?
在最頻繁使用的、用以縮小查詢范圍的字段上建立索引。
在頻繁使用的、需要排序的字段上建立索引
d)、 什么情況下不宜建立索引?
對于查詢中很少涉及的列或者重復值比較多的列,不宜建立索引。
對于一些特殊的數據類型,不宜建立索引,比如文本字段(text)等
26、 簡述在MySQL數據庫中MyISAM和InnoDB的區別
區別于其他數據庫的最重要的特點就是其插件式的表存儲引擎。切記:存儲引擎是基于表的,而不是數據庫。
InnoDB與MyISAM的區別:
InnoDB存儲引擎:主要面向OLTP(Online Transaction Processing,在線事務處理)方面的應用,是第一個完整支持ACID事務的存儲引擎(BDB第一個支持事務的存儲引擎,已經停止開發)。
特點:
· 行鎖設計、支持外鍵,支持事務,支持并發,鎖粒度是支持mvcc得行級鎖;
MyISAM存儲引擎:是MySQL官方提供的存儲引擎,主要面向OLAP(Online Analytical Processing,在線分析處理)方面的應用。
特點:
不支持事務,鎖粒度是支持并發插入得表級鎖,支持表所和全文索引。操作速度快,不能讀寫操作太頻繁;
SQL常用的一些關鍵字
1、distinct關鍵字
顯示沒有重復記錄的商品名稱,商品價格和商品類別列表
select distinct ware_name,price from t_ware;
2、使用計算列
查詢所有商品價格提高20%后的價格
select ware_id,ware_name,price*1.2 from t_ware'
3、列的別名
a) 不使用as
select ware_id,ware_name,price*1.2 price_raise from t_ware;
b)使用as
select ware_id,ware_name,price*1.2 price_raise from t_ware;
4、使用邏輯表達式
a)not 顯示商品價格不大于100的商品
select?ware_id,ware_name,price,category_id from?t_ware where?not?price>100;
b)or 顯示商品類別編號為5或6或7的商品
select?ware_id,ware_name,price,category_id from?t_ware where?category_id or?category_id=6?or?category_id=7;
c)and 顯示商品價格大于100且商品類別編號為5的商品
select?ware_id,ware_name,price,category_id from?t_ware where?not?price>100?and?category_id = 5;
5、使用between關鍵字
顯示商品價格在200元至1000元之間的商品(留心一下,是半開區間還是封閉區間?)
select ware_id,ware_name,price,category_id from t_ware where price between 200 and 1000;
6、使用in關鍵字
顯示商品類別為5,6,7且價格不小于200元的商品
select ware_id,ware_name,price,category_id from t_ware where category_id in (5,6,7) and price>=200;
7、使用like子句進行模糊查詢
a)%(百分號)表示0到n個任意字符
select?ware_id,ware_name,price,category_id from?t_ware where?ware_name like?'%純棉%';
b)_(下劃線)表示單個的任意字符
select?ware_id,ware_name,price,category_id from?t_ware where?ware_name like??'%長袖_恤%';
8、轉義字符escape的使用
select ware_id,ware_name,price,category_id from t_ware where ware_name like '%\%%' escape '\';
9、使用order by給數據排序
select * from t_ware_category where parent_id = 0 order by ware_id ;
select * from t_ware_category where parent_id = 0 order by ware_id asc;
select * from t_ware_category where parent_id = 0 order by ware_id desc ;
rownum
a)查詢前20條商品記錄
select?ware_id,ware_name,price from?t_ware where?rownum?<= 20;
b)查詢第11條至第20條記錄
select?ware_id,ware_name,price from?t_ware where?rownum<=10?and?ware_id not?in(select?ware_id from?t_ware where?rownum<=10);
10、常用統計函數
a)sum()返回一個數字列或計算列的總和 select sum(price) from t_ware;
b)avg()對一個數字列或計算列球平均值
c)min()返回一個數字列或一個數字表達式的最小值
d)max()返回一個數字列或一個數字表達式的最大值
e)count()返回滿足select語句中指定的條件的記錄值
11、多表查詢和笛卡爾乘積
查詢商品編號,商品名稱,商品價格和商品類別名稱
select t_ware.ware_id, t_ware.ware_name, t_ware.price ,t_ware_category_name from t_ware, t_ware_category ?where t_ware.category_id=t_ware_category.category_id;
使用join
a)左連接
select t_ware.ware_id,t_ware.ware_name,t_ware.price,t_ware_category.category_name from t_ware left join t_ware_category on t_ware.category_id=t_ware_category.category_id;
select w.ware_id,w.ware_name,w.price,wc.category_name from t_ware w left join t_ware_category wc on w.category_id=wc.category_id;
b) 右連接
select?t_ware.ware_id,t_ware.ware_name,t_ware.price,t_ware_category.category_name from?t_ware left?join?t_ware_category on?t_ware.category_id=t_ware_category.category_id;
12、使用union
select?ware_id,ware_name from?t_ware where?ware_name like?'%T恤%'?union?select?ware_id,ware_name from?t_ware where?ware_name like?'%手提包%'
13、使用group by
a)統計每個二級類別下有多少商品,以及商品總價值
select?w.category_id,wc.category_name,count(w.ware_id),sum(w.price) from?t_ware w left?join?t_ware_category wc on?w.category_id=wc.category_id group?by?w.category_id,wc.category_name;
b) 統計每個一級類別下有多少商品,以及商品總價值
select?wc2.category_id,wc2.category_name,sum(w.price) from?t_ware w left?join?t_ware_category wc on?w.category_id=wc.category_id left?join?t_ware_category wc2 on?wc.parent_id=wc2.category_id group?by?wc2.category_id,wc2.category_name;
14、使用having對結果進行篩選
–舉例子說明:查詢table表查詢每一個班級中年齡大于20,性別為男的人數
select?COUNT(*)as?'>20歲人數',classid ?from?Table1 where?sex='男'?group?by?classid,age having?age>20
需要注意說明:當同時含有where子句、group by 子句 、having子句及聚集函數時,執行順序如下:
執行where子句查找符合條件的數據;
使用group by 子句對數據進行分組;對group by 子句形成的組運行聚集函數計算每一組的值;最后用having 子句去掉不符合條件的組。
having 子句中的每一個元素也必須出現在select列表中。有些數據庫例外,如oracle.
having子句和where子句都可以用來設定限制條件以使查詢結果滿足一定的條件限制。
having子句限制的是組,而不是行。where子句中不能使用聚集函數,而having子句中可以
總結
以上是生活随笔為你收集整理的mysql问题举例_MySql问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql5.7.14安装版教程_MyS
- 下一篇: linux cmake编译源码,linu