學習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中遇到的問題以及解決(二):