mysql 十八哥_十八哥Mysql笔记之基础篇
連接Mysql服務器
注意?:-h指的是host地址?;-u指的是user,?之所以打到-p回車再輸入密碼,是為了防止密碼泄露
如果-h不寫則默認是localhost
★服務器à數據庫?database??à多張或一張表table(建表的同時就是聲明列)
★基本的語句
(注意分號結束)
1、查看當前服務器有什么數據庫:showdatabases
2、創建數據庫????????????:create?database
3、刪除數據庫????????????:drop?database?數據庫名
刪除表????????????????:drop?table表名
4、選擇要操作的數據庫????:use數據庫名
5、查一個數據庫有什么表??:show?tables;
6、修改表名?:?rename?table舊表名to新表名????(不能修改數據庫的名字)
7、查看一個表的結構??????:desc表名???(僅是查看列的結構,不含數據)
8、創建表并添加列????????:??自定義表名,同時下面設置列名和類型
Create??table表名(
Num?int?,
Name?char(10)
Age?int?)?;
以上是實例?,?注意每個屬性用逗號進行隔開,最后一分號結束
Ps?:age?int?unsigned?zerofillà?zerofill?表示0填充并且默認unsigned
插入數據的語句?:
Insert??into?表名
(num,name,age)values(1,’張三’,22),(2,’王四’,25);
注意?:如果插入全部屬性則前者可以省略?,如果要選擇插入某些屬性則修改前者即可values有個s,且必須有
注意values的拼寫
插入新列的語句?:
Alter?table?表名?add列名?類型?限制?after列名
限制可以是?:(1)unsigned無符號
After?是為了聲明在哪一列后面,默認在最后一列,如果要放在第一則替換為first
修改表之修改列?:
Alter?table?表名change舊列名?新列名?新列的類型?限制
如果要修改原來列的屬性可把新列名也寫為舊列名即可
修改表之刪除列?:
Alter?table?表名drop?列名
修改表之增加列主鍵?:
Alter?table?表名add??primary?key?(列名)
如?: 令id列為主鍵
Alter?table?表名add??primary?key?(id)
增加主鍵的時候如果出現duplicate?entry錯誤,?就是因為主鍵有重復的值
修改表中某列的值?:
Update表名set
name??=??‘李四’?,?age?=?30
Where
Num?=?11
注意?:?where設置?修改的?條件
刪除表中某行的數據??:
Deletefrom?表名?where??num?=?1;
注?:如果要刪除多行,則需要用or
查詢語句
查詢全部數據???:Select?*?from?表名?;
查詢部分列的數據???:Select?num,name??from表名?;
條件查詢?:?select?num,name
from?表名
where?num>1
★★★所謂的建表就是?聲明列的過程
★★★插入的時候整型類型討論
無符號和有符號分別表示不同的?能夠取到的?取值范圍?,為了開發的速度合適的類型,默認是有符號存儲范圍也是在有符號的范圍
★★屬性進行初始化的賦值時?,如果沒有進行賦值則默認為?null,一般創建時可以用語句
Name?char(10)??not??null??default?自定義的默認值,?null不好比較一般都是自定義
★★浮點型?float(M,D)M代表精度即是總長度?;D代表標度即是小數點
如 :price?float(6,2)9999.99?~?-9999.99
★★字符型?(注意該類型的數據需要添加單引號):
Char(M)??:?定長字符串?,?如果存的數據小于M也實占M個字符,內容不足部分補0,M代表可容納的字符數??,?0<=M<=255,?如?:nihao五個字符
好 ? 一個字符(三個字節)
Varchar(M)?:不定長字符串,如果存的數據小于M個字符,則占數據實際的大小
0<=M<=65535?(ascii),但是它會有1到2個字節被用于記錄長度
速度上char比較快,varechar比較省資源
★★★decimal:高精度浮點數,常用于金融運算,不會出現浮點數計算的誤差
★★★見識?history?herstory
★★★year類型
★★★Date類型
★★★實戰建立106宿舍資料
create?table?ss106(
id?intprimary?key?auto_increment,//?主鍵,遞增
name?char(4)?not?null?default?'',
age?tinyint?unsigned?not?null?default?0,
email?varchar(30)?not?null?default?'',
telchar(11)?not?null?default?'',?????????????//電話號碼設置為char
salary?decimal(7,2)?not?null?default?0,??????//金錢的問題設置為decimal類型
intro?varchar(1000)?not?null?default?''?????//此處結尾不能添加逗號!!
)charset?utf8;??????????????????????????//設置為utf8類型
Ps?:編寫以上代碼時?,?單詞有的打錯了?,?導致修改了幾次才能運行!!!所以編寫代碼的時候一定要認真拼寫,腦中一定要有印象
★★★使用delect的時候,有時候id不存在但也能夠執行語句
★★★where?: ?理解為使表達式是否成立,成立則為真
如?:取出數學比語文高20分的同學成績
Select?*?from?students
Where?math-china>20
★★select中where常用運算符
★in?:?表示在某個集合內進行取值,
如?取出學號為2,3,5的學生成績
Select?*?from?students?where?id?in(2,3,5);
★between?:?表示在某個范圍內進行取值?,可以取邊界值
如?取出學號為2~5的學生成績
Select?*?from?students?where?id?between?2?and?5?;
這句等于
Select?*?from?students?where?id?>=?2?and?id?<=?5?;
★not:Select?*?from?students?where?id?!=?2?;
Select?*?from?students?where?not?in?(2,3);
★like?:?模糊查詢
(1)取出以某文字開頭的?:文字%
如?:取出姓張的成績
Select?*?from?students?where?name?like?‘張%’;
Ps?:不姓張則not?like
(2)取出限定字數的?: 文字_ ,一個下劃線一個字
Select?*?from?students?where?name?like?‘張_’;
★★★select?之group:?使用于統計,一般配合統計函數用
★??????Max?:
如?:找出最高成績
Select?max(grade)?from?students?;
Sum?:
如?:求出所有商品庫存總和
Select?sum(goods_num)?from?goods?;
Avg?:
如?:求出所有手機價格的平均價格
Select?avg(price)?from?goods?;
Conut?:
如?:求出行數
Select?count(*)?from?goods?;
★group?by: 進行分組和按此列排序,并在分組中尋找和要求的?,經常和集函數一起使用?,?如果不和集函數使用也是取出分組的排在第一位置的
如?:尋找同分組,最高價格
Select?cat_id?,?max(price)?from?goods?group?by?type_id;
Ps?:添加其他的選項沒意義
★把列名當做變量名進行運算?(注:顯示出來的欄目統計函數顯示的時候會自己占列)
Ps?:?顯示的名字可以用as令命名
★★having?語句?:
Where?語句不能夠?對查詢的結果進行操作,需要進一步的操作必須受使用having
如?:查詢市場的手機價格和店鋪手機價格之間差價為100元的手機
(1)?錯誤的
Select?good_id,good_name,market_price-shop_price?as?chajia?from?goods?where?chajia>100;
(2)正確的
Select?good_id,good_name,market_price-shop_price?as?chajia?from?goods?where?market_price-shop_price?>100;
但計算了兩次
(3)用having語句?:
Select?good_id,good_name,market_price-shop_price?as?chajia?from?goods?having?chajia>100;
★having和where同時使用
如?:查詢欄目3的,市場的手機價格和店鋪手機價格之間差價為100元的手機
Select?good_id,good_name,market_price-shop_price?as?chajia?from?goods?where?good_id?=?3?having?chajia>100;
◇實戰?:計算掛科數目在2科以上的同學的平均成績
Select?name,sum(score<60)?as?shumu,avg(score)?as?pj?from?students?group?by?name?haing?shumu>=2?;
★★★order?by?:改變排序的依據,一般默認升序?,?如果要改為降序則要添加desc
Order?by?列名1[desc/asc],列名2[desc/asc];
如?:按照價格進行降序排列,在價格排序好之后,如果價格一樣的再按照id排
select?id,price?from?goodsorder?byprice,id?desc
★limit??:?配合order?by使用,限制選出來的條數
Limit?偏移的數目,限制的條數à偏移的數目可以不寫默認為0
如?:按照價格進行降序排列,在價格排序好之后,如果價格一樣的再按照id排,且只取出4,5,6行的數據
select?id,price?from?goodsorder?byprice,id?desc?limit?3,3;
★★★?特殊的錯誤?:
★★如果出現這個情況,分號在前面,就會使任何的語句都不能執行,需要輸入’;進行結束(即是一個分號和冒號)
★★版本不支持中文
★★我擦,用一個insert語句,錯了這么多個地方,第一個地方就版本不支持中文,第二個坑爹的地方就是?輸入的?字符中含有?中文的字符,特別是標點的問題?,?唉……
★★★where?,?group?by?,?having?,?order?by?,?limit多個時,按照這個順序進行抒寫
★★★
★★復制一張表(只是復制表結構)?:?create??table表名like被復制的表名
★★復制某張表的數據?:insert??into表名from被復制的表名(后能加order?by等)
★★清空一張表的數據?:truncated表名
★★★巧妙的運用
★★查詢(select)的結果一般都是一個表結構,所以可以把結果當做表使用,用括號區別
如?:select?*?from?(select?id,cat_id,goods_name,shop_price?from?goods?order?by?cat_id)?as?temp?group?by?shop_price;
括號內的查詢結果當做一個已有的表進行處理,*表示括號內有的列,把括號內的表稱為temp
★★把查詢結果當做條件使用?:
如?:select?goods_id?,?goods_name?from?goods?where
goods_id?=?(select?max(goods_id?)?from?goods)?;
★★where帶入行中看是否成立來理解,列看做變量來理解可以運算,查詢的結果當做臨時表來理解
★★★where型子查詢?:把內層的查詢結果作為外層查詢的比較條件,用?in來表示在里面
如?:取出每個欄目中價格最貴的商品
Select?id,cat_id,shop?_price?from?goodswhereshop_pricein?(select?max(shop_price)?from?goods?group?by?cat_id);
注意?:這里巧妙地把一個查詢的結果組作為 外層的查詢條件;內層不用cat_id也可以,因為那只是表示顯示出來的欄目而已
★★★From型子查詢?:?把內層的查詢結果當成臨時表,供外層Sql再次查詢
注意?:使用from型的子查詢必須?添加別名?,?即是as
否則出現這個錯誤
如?:取出每個欄目下最新的商品
Select?*?from?(select?id,cat_id,goods_name?from?goods?order?by?cat_id?asc,id?des)?as?temp?group?by?cat_id?;
先排序好,再按欄目進行取出來
★★★不允許這樣操作
★★★找出掛科兩門以上同學的平均成績
select?name,avg(score)?from?students?where?name?in?(select?name?from(select?name,count(*)?as?num?from?students?where?score?=?2)?as?temp)?group?by?name;
把題目進行分解??兩個以上,不及格,平均成績
所以先找出兩科以上,不及格的學生
總結
以上是生活随笔為你收集整理的mysql 十八哥_十八哥Mysql笔记之基础篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ft232 mac usb串口驱动_记M
- 下一篇: mysql connector c 源码