Mysql的一些问题
在正式開始之前首先引入'大俠中的大xi'總結的MySQL的學習筆記:
學習筆記(一):https://blog.csdn.net/qq_44483394/article/details/96489065
學習筆記(二):https://blog.csdn.net/qq_44483394/article/details/97180909
學習筆記(三):https://blog.csdn.net/qq_44483394/article/details/97803109
以上筆記的視頻源自b站(一天學會MySQL數據庫):https://www.bilibili.com/video/av39807944/?p=10
之后是對以上學習中思考到的問題的補充:
1.SQL語言中的ALTER和UPDATE,DROP和DELETE都有什么區別?
add,modify,drop是DDL語句,insert,update,delete是DML語句
DDL語句是對表結構的修改,DML語句是對表數據的修改
比如添加主鍵的操作:ALTER TABLE user4 ADD PRIMARY KEY(id);
刪除主鍵的操作:ALTER TABLE user4 DROP PRIMARY KEY(id);
更改某個屬性:ALTER TABLE user7 MODIFY name VARCHAR(20) UNIQUE;
2.建立約束的3種方式?
建表的時候添加:name VARCHAR(20) UNIQUE
使用alter...add...:ALTER TABLE user5 ADD UNIQUE(name)
使用alter...modify...更改屬性:ALTER TABLE user7 MODIFY name VARCHAR(20) UNIQUE;
3.復合主鍵的使用情況?
一般適用于中間表,而一個字段并不能保證唯一性,比如下面的SQL語句:
CREATE TABLE score( sno VARCHAR(20) NOT NULL, cno VARCHAR(20) NOT NULL, degree DECIMAL, FOREIGN KEY(sno) REFERENCES student(sno), FOREIGN KEY(cno) REFERENCES course(cno), PRIMARY KEY(sno,cno) );score表中包含了學生學號和,課程號。這個時候可能會出現一個學生多門成績的情況,所以使用復合主鍵。
4.連接查詢中的自連接用法(在使用自連接的情況大多的數據都存在于自己的表中)?
首先了解內連接和外連接(mysql中沒有全外連接,要實現全外連接可以左連接union右連接):https://www.jianshu.com/p/f523eaa85bbe
自連接實際上自己的表和自己進行連接查詢,將自己的表起一個別名然后通過連接可以查出想要的結果。用法:
查找局部不一樣的列:場景:查找“同一家人但是住址不同的記錄”,自連接與非等值連接結合
/* 用于查找是同一家人但住址卻不同的記錄的SQL語句 */ SELECT DISTINCT A1.name, A1.addressFROM Addresses A1, Addresses A2WHERE A1.family_id = A2.family_idAND A1.address <> A2.address ;查詢成績比課程平均成績低的同學的成績表:
課程表的三個字段,cno:課程號? ? ?sno:學生號? ? ?degree:成績
SELECT * FROM score a WHERE degree<(SELECT avg(degree) FROM score b WHERE a.cno=b.cno);在這里where a.cno=b.cno的作用實際是select進行一個一個查詢的時候,里面的語句會查出當前課程號的平均成績然后再進行大小比較以查看當前select的語句是否滿足條件。
查出生產蘋果供應商的其他產品:
一張products表,有產品id(prod_id),供應商id(vend_id),產品名稱。
方法一(子查詢):select * from products where vend_id = (select vend_id from products where prod_name = '蘋果');
方法二(自連接):
select p1.prod_id,p1.prod_name from products as p1,products as p2?
?
where p1.vend_id = p2.vend_id and p2.prod_name = '蘋果';
可以理解為當select一條一條查詢的時候,只有當name='蘋果'的時候將數據篩選出來
5.MySQL中的模糊查詢?
%:表示任意0個或多個字符。可匹配任意類型和長度的字符
_: 表示任意單個字符。匹配單個任意字符,它常用來限制表達式的字符長度語句
[ ]:表示括號內所列字符中的一個(類似正則表達式)。指定一個字符、字符串或范圍,要求所匹配對象為它們中的任一個。
比如 SELECT * FROM [user] WHERE u_name LIKE '[張李王]三' 將找出“張三”、“李三”、“王三”(而不是“張李王三”);
如 [ ] 內有一系列字符(01234、abcde之類的)則可略寫為“0-4”、“a-e”
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]' 將找出“老1”、“老2”、……、“老9”;
[^ ] :表示不在括號所列之內的單個字符。其取值和 [] 相同,但它要求所匹配對象為指定字符以外的任一個字符。
比如 SELECT * FROM [user] WHERE u_name LIKE '[^張李王]三' 將找出不姓“張”、“李”、“王”的“趙三”、“孫三”等;
SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]'; 將排除“老1”到“老4”,尋找“老5”、“老6”、……
6.巧用笛卡爾積添加數據項(應該盡量避免使用笛卡爾積)?
新增的成績評分表(根據low和upp分為A,B,C,D,E)
CREATE TABLE grade( low int(3), upp int(3), grade CHAR(1) );然后通過笛卡爾積查詢并通過where篩選:
SELECT sno,cno,grade FROM score,grade where degree BETWEEN low AND upp;得到如下:
7.連接查詢的好處?
可以不用創建外鍵,通過某個字段值之間的相等來求他們之間的一個交集并集相關的東西。
8.對于四大事務隔離級別的理解?
https://blog.csdn.net/zjxxyz123/article/details/79413729
注意:repeatable read已經可以解決不可重復讀的問題,A添加數據并提交之后,B在一個同一個事務中的兩次查詢并不能夠得到數據的改變,必須在新的事務中查詢才能得到改變,如果在舊的事務中插入A已經插入的數據還會報錯。這個做到了不可重復讀,但是不能防止幻讀。
轉載于:https://www.cnblogs.com/ljq2622/p/11295710.html
總結
以上是生活随笔為你收集整理的Mysql的一些问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件开发
- 下一篇: Docker笔记:常用服务安装——Ngi