學習mysql中遇到的問題以及解決(一)
問題1:字段加上單引號' ' 就報錯啦,去掉單引號' '就正常了
問題2:default 加了括號就報錯--同樣,找到一個解釋是:因為mysql自身版本問題(那咱就去()吧)。
問題3:mysql有時候報錯是因為你重新修改了操作完沒有注意語句的執行順序啦
問題4:使用MySQL執行update或者delete的時候報錯:~(報錯提示要選主鍵或消除安全模式)
問題5:報錯:where 不能直接使用內置函數噢!解決:通過嵌套查詢—子查詢的方式,使得內置函數不直接接觸where啦!
問題6:select 時 聚合函數旁邊有其他普通屬性時,要使用group by,且group by 要包含除了聚合函數里的屬性外的其他所有普通屬性,因為mysql默認的模式 sql_mode是:
所選擇的列都要參與分組,所以不小心寫錯,報錯提示:所選的列既不在聚合函數也不是主鍵。
問題7:select+ select的查詢時,被當做臨時表的select要起個別名。因為派生表(臨時表),需要起別名區分開來,才能當成一張普通表查詢里邊自己想要的屬性。
問題8:關鍵字報錯問題:保留關鍵字/非保留關鍵字:其中保留關鍵字:需要加反引號`` (``符號在鍵盤1旁邊哈!)
問題9:兩張表的共同屬性關系是:1對多,(1對多 的外鍵引用關系不適合用內連接!)
----解決:需要起別名,“副表”,另外一張表的作用來區分開。
問題10:一個表不能有2個主鍵,因為主鍵代表數據的物理組織形式,所以不能存在2個。但是允許用多個字段聯合組成主鍵。
解決例子:使用(主鍵組合)alter table SC add primary key(`Sno`,`Cno`);
1,字段加上單引號' ' 就報錯啦,去掉單引號' '就正常了---找到一個解釋的原因是說,mysql版本的自身原因,應該是新版的變量屬性設計的時候,都系統為你加好了 單引號' '(我的猜測),因為對於新版的變量屬性,一旦加單引號必報錯,
所以mysql8,一旦是變量,就不要再加單引號了。哈哈哈,寶寶,這里的符號搞錯了噢,是那個長得跟單引號很像的符號反引號噢。修改符號為反引號,就不再報錯了。
同樣,
補充:正確的反引號``
2,default 加了括號就報錯--同樣,找到一個解釋是:因為mysql自身版本問題。
3,mysql有時候報錯是因為你重新修改了操作完沒有注意語句的執行順序啦,例如,上次執行添加進表(表的id是以主鍵添加進去),
第二次,你刪除掉表id 的主鍵屬性,然后重新修改表以加約束主鍵id,然后只執行最后這一句語句會報錯的,提示Multiple primary key
4,使用MySQL執行update或者delete的時候報錯:
例如執行:①delete from Address; (Address 是一張表) 或者 執行:②delete from Address where StuName='趙麗穎'; 執行①② 都會報錯!:
You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
查看mysql安全模式狀態: show variables like 'sql_safe_updates';
因為版本較新的MySQL是在safe-updates模式下進行sql操作的,這個模式會導致在非主鍵條件下無法執行update或者delete 解決:設置一下取消安全模式即可: set sql_safe_updates=0; /*取消安全模式*/
當然設置回安全模式: set sql_safe_updates=1; /*設置安全模式*/
5,報錯:where 不能直接使用內置函數噢!
舉例:
解決:通過嵌套查詢—子查詢的方式,使得內置函數不直接接觸where啦!
6,group by 分組查詢時,select 后邊出現的列一定要參與分組【聚合函數的列就可以省略啦】
(1)select * from stu group by (stuId); #stuId 是主鍵噢,正常執行
select * from stu group by(telNum); #telNum 非主鍵,報錯
錯誤:SELECT list is not in GROUP BY clause and contains nonaggregated column 'studb.stu.StuId' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
翻譯錯誤:所選的列既不在聚合函數也不是主鍵,錯誤原因是因為sql_mode 模式是所選擇的列都要參與分組
(2)select 時 聚合函數旁邊有其他普通屬性時,要使用group by,且group by 要包含除了聚合函數里的屬性外的其他所有普通屬性:
(3)select ScoreId,SubjectId from score group by (ScoreId,SubjectId);
報錯:操作數應包含1列:Operand should contain 1 column(s)。
把括號去掉,不再把兩個列合在一起,單獨成一列:select ScoreId,SubjectId from score group by ScoreId,SubjectId;
7,左連接后:報錯:Every derived table must have its own alias
把(查到的學生信息對應考試信息,出現null,當做一個臨時表)---派生表,需要起別名,才能當成一張普通表查詢里邊自己想要的屬性。
例如:#查詢缺考學生信息
把(查到的學生信息對應考試信息,出現null,當做一個臨時表)
#查詢缺考學生信息
select StuId,StuName from( #學生表與成績表的左連接,可以得到學生信息對應考試表,出現考試信息為null select stu.StuId,StuName,Score from stu left join score on stu.StuId=score.StuId) where score is null;
報錯:
報錯:Every derived table must have its own alias
翻譯報錯:每個派生表必須有自己的別名。
解決: 給臨時表(派生表)起個別名。
#查詢缺考學生信息
select StuId,StuName from( #學生表與成績表的左連接,可以得到學生信息對應考試表,出現考試信息為null select stu.StuId,StuName,Score from stu left join score on stu.StuId=score.StuId) as 考試信息 where score is null;
8,關鍵字報錯問題:
保留關鍵字/非保留關鍵字:其中保留關鍵字:需要加反引號`` (``符號在1旁邊哈!) (寶寶,要睜大眼睛看噢,符號是反引號``, 而不是 單引號’’),非保留關鍵字: 可以直接使用噢!
保留/非保留 關鍵字:(查看mysql官網)https://dev.mysql.com/doc/refman/8.0/en/keywords.html
ps:一般mysql的圖像界面工具會提示,當創建表格或者字段時提示錯誤,可能是使用了保留關鍵字!
舉例:
解決:添加反引號``
9,兩張表的共同屬性關系是:1對多,(1對多 的外鍵引用關系不適合用內連接!)
----解決:需要起別名,“副表”,另外一張表的作用來區分開。
內連接需要一張表與另一張表的共同屬性是1對1,而不是1對多;(1:多只能選擇子查詢)。
舉例子:表結構如下:
題意:查詢顯示出結果如下:
分析:
內連接查詢:
賽程表(只有隊伍編號(分成:主隊隊伍編號、客隊隊伍編號))參賽隊表(隊伍編號對應隊伍名稱)
所以兩個表需要通過隊伍編號關聯起來-----外鍵,參賽表的隊伍編號是賽程表的主隊隊伍編號、客隊隊伍編號的引用外鍵。
因為參賽隊表(隊伍編號對應隊伍名稱)中的 隊伍編號 同時被賽程表(只有隊伍編號(分成:主隊隊伍編號、客隊隊伍編號))中的 主隊編號 和 客隊編號 引用作為外鍵,所以通過隊伍編號的把兩張表連接到一起,無法統一隊伍編號是要與主隊編號結合成一組還是和客隊編號結合成一組。(1對多 的外鍵引用關系不適合用內連接!)
-----------不過通過,給表起別名區分開(實現了一對一),也是可以使用內連接的。
1、子查詢:
#子連接
select (select TeamName from Team where Team.TeamId=`Match`.HostTeamId) as '主隊', MatchResult as '比分', (select TeamName from Team where Team.TeamId=`Match`.GustTeamId) as '客隊', from `Match`;
2、2-1 起別名實現1對1的內連接:
#內連接
select Team.TeamName as '主隊',MatchResult as '比分',t.TeamName as '客隊',MatchTime as '比賽時間' from Team, `Match`, Team as t where Team.TeamId=`Match`.HostTeamId and t.TeamId=`Match`.GustTeamId; # t 是Team 這張表起的一個別名,有“副表”另外一張表的作用的意思
2-2 內連接寫法2:
#內連接寫法2
select Team.TeamName as '主隊',MatchResult as '比分',t.TeamName as '客隊',MatchTime as '比賽時間' from `Match` inner join Team on (Team.TeamId=`Match`.HostTeamId) inner join Team as t on (t.TeamId=`Match`.GustTeamId);
3、內連接跟子查詢結合起來使用
3-1.寫法一:
select Team.TeamName as '主隊',MatchResult as '比分', (select TeamName from Team where `Match`.GustTeamId=Team.TeamId) as '客隊',MatchTime as '比賽時間' from Team, `Match` where Team.TeamId=`Match`.HostTeamId;
3-2.寫法二:
#內連接inner join結合子查詢
select TeamName as '主隊',MatchResult as '比分',(select TeamName from Team where Team.TeamId=`Match`.GustTeamId),MatchTime as '比賽時間' from `Match` inner join Team on Team.TeamId=`Match`.HostTeamId;
10,一個表不能有2個主鍵,因為主鍵代表數據的物理組織形式,所以不能存在2個。但是允許用多個字段聯合組成主鍵。
Error Code: 1068. Multiple primary key defined (翻譯:重復定義了主鍵)
解決:使用(主鍵組合):
#解決:使用(主鍵組合) alter table SC add primary key(`Sno`,`Cno`);
學習mysql中遇到的問題以及解決(二):