Mysql基礎筆記


連接Mysql服務器  

 

  注意 :-h指的是host地址 ; -u指的是user , 之所以打到-p回車再輸入密碼,是為了防止密碼泄露;如果-h 不寫則默認是localhost

★服務器->數據庫 database -> 多張或一張表 table(建表的同時就是聲明列)

 

★基本的語句  

(注意分號結束)

1、查看當前服務器有什么數據庫:show databases 

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錯誤, 就是因為主鍵有重復的值

 注意:

PRIMARY KEY
主鍵約束,每張數據表只能存在一個主鍵,主鍵保證記錄的唯一性,主鍵自動為NOT NULL。
AUTO_INCREMENT(自動增長)必須和主鍵一起使用,但是主鍵不是必須和AUTO_INCREMENT一起使用

 

 

修改表中某列的值 : 

          Update 表名 set  name  =  ‘李四’ , age = 3  Where Num = 11   

    注意 : where 設置 修改的 條件

 

刪除表中某行的數據  : 

      Delete from 表名 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 :高精度浮點數,常用於金融運算,不會出現浮點數計算的誤差

★★★year 類型

★★★Date 類型

 

★★★實戰建立106宿舍資料

create table ss106(

id int primary key auto_increment,    // 主鍵,遞增

name char(4) not null default '',

age tinyint unsigned not null default 0,

email varchar(30) not null default '',

tel char(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 : 按照group by的字段進行分組查找和按此列排序,並在分組中尋找和要求的 ,經常和集函數一起使用 , 如果不和集函數使用也是取出分組的排在第一位置的

如 :查找出每個種類(type_id)中最高價格的

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科以上的同學的平均成績

Name  subject  score

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 goods order by price,id desc

★limit  : 配合order by 使用,限制選出來的條數和從哪條開始取

   limit 哪條后開始取,取出的條數 

如 :按照價格進行降序排列,在價格排序好之后,如果價格一樣的再按照id排,且只取出4,5,6行的數據

 select id,price from goods order by price,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 goods where shop_price in (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 < 60 group by name having num>= 2) as temp) group by name;

      把題目進行分解  兩個以上,不及格,平均成績;所以先找出兩科以上,不及格的學生

 

★★★exists 子查詢 :判斷是否存在,返回值True或False,把外層的查詢結果,拿到內層,看內層的查詢是否成立

 

如 : 獲取 商品類型的表 中,有商品的欄目;

Select cat_id,good_name from category where exists (select * from goods where goods.cat_id=category.cat_id);

 

英國是島國之一,有海底隧道

★★★Union : 連接查詢 , 把兩次或者以上的查詢結果一起顯示,要求兩次或多次查詢的結果列數一樣,類型可以不一樣

                     如 : select user_name,msg_content from feedback where id=1

                          Union select name, content from conmumicate where id=1

                           注意 : 此時 列名以第一個為准

練習:有兩個表A和B, 都有兩列 分別為 id num,有部分的id 是相同的,要求把兩個表顯示出來,如果id相同則把 sum 相加

Select id,sum(num) from (select * from A union select * from B) as temp group by id;

                 注意 : (1)如果合並的兩個表中,它們都有一行所有的數據都相同的話,合並后的表會將此視為重復只保留一條(去重復功能),如果想要不去重復則要 加 all                                     如:select * from A union all select * from B 

                        (2)如果union和order by ,limit 並用則要添加括號,為了分辨整體還是不部分

                                      (3)在兩個表合並時,如果子句使用order by 必須陪着limit 使用呢,否則無效

★★★Mysql中,集合相乘,就是笛卡爾積,就是兩個集合的完全組合。 所以A*B得到的積, 有M*N個元素且不可能重復。

如 :A有9行,B有8行,兩表相乘有72行 

   Select * from A,B;   注意 :用逗號進行分割表示乘,形成的過程是另一表從上到下進行匹配而成

  

 

★★左連接:以左表為准,去右表找匹配的數據,如果找不到就用null補

            所以至少有N行(即是左表的行數)

注意 : 與列位置無關

     如 :現在要從goods,category表中取數據,且將兩張表互聯

         Select 

          Goods_id,goods.cat_id,goods_name,shop_price

          From

          Goods left join category

          On goods.cat_id = category.cat_id;

      注意 :(1)在添加自己要的列名時,如果兩個表中有相同的列名就要添加表名前綴

            (2)因為goods表在左邊所以是left 

            (3)第四,五部分表看做 連接 一張大表 , 所以后面where,having就像以前寫

            (4)右連接 right 替換 left ; 內連接 inner 替換 left 

 

★左右連接的區別 : 

                       (1)以不同的表為准

                       (2)一般最好以左連接為好(),右連接可以轉換為左連接

                              

★內連接 :查詢左右表都有的數據,即舍棄null的那部分,所以內連接是左右連接的交集

                         注意 : 目前 mysql不支持外連接 outer join,但是可以用Union達到目的 ,就是把左右連接Union

練習 :

 

              Select goods_id,goods.cat_id,cat_name,brand_id,brand_name,goods_name

               from goods left join category  on goods.cat_id = category.cat_id  left join brand

               on goods.brand_id = brand.brand_id;

           解釋 :把四五部分看做一張表,再次進行左連接 

 

 

       Select  t1.teamname,matchresult,t2.teamname,matchtime

       From

        Match left join team as t1

        On match.hostteamid = t1.teamid

        Left join team as t2

On match.guestteamid = t2.teamid

Where matchtime between ‘2006-6-1’and’2006--1’;

解析 :為了區分team的不通所以用as添加了別名

 

★當多表時,同名如果不添加前綴,發生的錯誤

 

★★★視圖 :把查詢的結果形成一張虛擬表,並沒有真實的數據存在,只是與表的一種查詢產生的關系 。 

創建視圖的語法 :Create view 視圖名 as select 語句

刪除視圖的語法 :drop view 視圖名

                    

               如 :create view goods2 as select id,goods_name,goods_price from goods where goods_price >1500;

          優點 :(1)簡化視圖,能把自己經常用的拿出來

                (2)能夠起到約束的作用,可以選擇想給別人看的列,把表的權限封鎖,開放視圖的權限

(3)大數據分表時會用到,當表的行數超過了200萬行時,就會變慢。因此可以把一張表分為多張表。分表常用取模法:比如200萬行分為4張表,就直接求余 à id%4+1 = [1,2,3,4]

(4)還可以把多張表合成一張表

 create view new select from n1  union select from n2

(5)視圖的數據來自於表,如果表中的數據改變了則視圖的數據也會改變;

     當視圖的數據與表的數據一一對應時,此時可以進行修改。對於視圖insert還應注意,視圖必須包含表中沒有默認值的列,否則視圖不知道如何處理該列  

 

      ★★視圖的algorithm  (以下是它的取值)

          (1)merge :不寫默認,當引用視圖時,引用視圖的語句與定義視圖的語句合並。即是把查詢視圖的語句與創建視圖的語句合並,分析之后形成select語句

 

                例如 :新生成一個表goods2,進行查詢表goods2小於3000元的手機

                       create view goods2 as select id,goods_name,goods_price from goods where goods_price >1500;

                       select * from goods2 where shop_price <3000;

                   在執行第二句進行查詢的時候,實際上執行的是where shop_price >1500 and shop_price <3000 ,第一句執行之后實際上是沒有數據的只是空表

最終執行的是       select id,goods_name,goods_price from goods where goods_price >1500 and goods_price <3000’

                        查詢的對象是goods表

         解析 :在查詢的時候,實際上還是回到了goods表中進行查詢

          (2)temptable :當引用視圖時,根據視圖的創建語句建立一個臨時表

 

               例如 :  create algorithm=temptable view goods2 as select id,goods_name,goods_price from goods where goods_price >1500;

                           select * from goods2 where shop_price <3000;

          最終執行的是2句話 : 先取出數據放到臨時表然后去查臨時表

                                 查詢的對象是臨時表

     (3)Undefind :讓系統幫你選

 

 ★★★字符集 : 如果某級沒有設置字符集,則繼承上一級的。一般設置表的即可 。一般出現亂碼的問題是因為字符集不符合造成的,可以聲明字符的編碼進行解決

 

★★★觸發器 :監控某種情況,並觸發某種操作

               如 :商店拍下商品並減少庫存 ; 

    ★觸發器能夠監視和觸發的操作均為增刪改 , 四要素

 

         觸發的時間 :after/before :比如飯前洗手(before)/飯后洗手(after)

        ★★創建觸發器的語法 

           Create trigger 觸發器名字

            After/before  insert/update/delete  on  表名

             For each row

             Begin

               Sql語句

              End$

            在表XX觸發XX操作之后/之前,每一行開始觸發XX操作,然后結束

注意 :(1)sql即是需要觸發的語句,可以是多句,但是也必須是那三個語句范圍

(2)多個sql語句用分號隔開,並事先聲明用$進行結束,語句為 delimiter $,此時分號只表隔開不是結束 , 修改回來則是  delimiter ;

  ★續上,如何在觸發器的sql語句中引用行的值 : 

 

  

(1)對於監視insert來說,新增的行 可以用new來表示,且行中增加的一列:

用  new.列名 來表示

實例 :兩張表,一張是商品表goods;另一張是訂單表orde,如下

 

 注意 :這里不能命名為order ,因為是關鍵字

 

當進行下單后,庫存減少的觸發器

進行設置觸發器

 

 

 

當插入語句后,觸發的情況。這里是的good的gid是和orde的id對應的,

 

 

(2)對於監視delete 來說 , 刪去之后,則之前的是舊行 , 可以用old來進行表示

     且行中被刪除的一列的值:用  old.列名 來表示

 

當刪除下單后,庫存增加的觸發器

 

刪除后的觸發效果

 

 

 

(3)對於監視update來說, 更新之后 , 改之前的是old,改之后是new

        如 :同一樣商品,下單之后,又修改了訂單的數量 ,則

庫存數=當前庫存(未改的)+未改訂單商品數量—修改訂單后商品數量 

 

注意 :如果不是同一樣商品的話則拆開計算那個語句

 

 

 

★刪除觸發器的語法 :drop trgger 觸發器的名字; 

★查看觸發器 :show trigger

★after和before的區別

 

 

before案例 :用於對訂單的判斷,如訂單的數量超出范圍,強制修改訂單等等

   如 :如果訂單超過5,就強制把訂單數改為5

 

 

★★★存儲引擎 :數據庫存儲同樣的數據,有着不同的存儲方式和管理方式,稱為存儲引擎 , 常用的有 

Myisam :批量插入速度快,不支持事務,鎖表,支持全文索引

innoDB :批量插入相對較慢,支持事務,鎖行,支持全文索引

 

  ★★事務:指一組操作,要么全部都成功操作,要么都不執行à原子性(不可分割)

在所有的操作完成之前,其他會話不夠看見中間的改變à隔離性

當事務完成之后,其影響是會保留下來的,不能撤銷à 持久性

數據的變化,在事務的前后保持不變 à一致性

 

比如 :轉錢瞬間銀行斷電收不到錢,因為只完成了轉錢扣錢的操作,轉錢進的操作未完成

   ★事務一般選用InnoDB,所以建表的時候要進行聲明

 

     ★事務的語法 :

(1)開啟事務:start  transaction

(2)提交事務:commit  (在輸入完要進行的事務語句之后,進行提交)

 

在沒提交事務之前,對方都不會看見你的操作結果

有些語句會造成事務的隱式提交比如再來一個start transaction

(3)rollback :取消事務

事務的原理

 

 

★★★備份 :系統運行時,增量備份與整體備份

        比如 : 每周日整體備份一次,周一到周六備份當天

 ★★備份文件語法:

  (1)導出庫下的多張表

mysqldump –u用戶名 –p密碼 庫名 表1 表2 > 地址/自定義備份文件名

 

注意 :如果把表名去掉就能夠導出一個庫下的所有表

mysqldump –u用戶名 –p密碼 庫名 > 地址/自定義備份文件

 

(2)以庫為單位進行導出

mysqldump –u用戶名 –p密碼 –B 庫1 庫2> 地址/自定義備份文件

 

(3)導出所有的庫

mysqldump –u用戶名 –p密碼 –A> 地址/自定義備份文件

 

★★★數據庫的恢復 :即是把備份文件里面的語句全部執行一次

  ★★登陸到命令行的狀態下

(1)恢復一個庫

   Source 地址//庫名

 

(2)恢復一個表

   Use 庫名

      Source 地址//表名

 

 

★★不登陸到命令行

 

注意 :如果直接使用cmd的話,顯示‘mysql'不是內部或外部命令,也不是可運行的程序時,需要設置環境變量。我的電腦上右鍵-〉屬性-〉高級-〉環境變量-〉新建:變量名:path 變量值:mysql.exe所在的目錄。然后重啟CMD窗口

 

 

★★★索引 :針對數據所建立的目錄,加快搜索的速度

 例子 : select * from goods where id=100; à 實際上在查找的時候並不一定是從id=1查到id=100,它是會按照一定的優化算法尋找的

 ★★索引的算法 :

   (1)二叉樹索引,把數按照大小不斷分開在兩邊 log2N

      (2)哈希索引

 ★索引的優點 :加快查詢速度

    索引的缺點 :降低了增刪改的速度,增大表文件的大小(索引文件可能大過表文件)

  ★實例 :如果要導入很多的數據,索引占內容比較大的話,就要先去掉所引,再導入,然后再統一添加索引

    所以,索引的時候必須:(1)不過度索引 (2)索引條件列選擇比較頻繁的比如id而不是性別 (3)索引散列的值,比如不索引為男,女添加索引

★★文件第一個是表結構文件,第二個是表數據文件(最后的Date),第三個是表索引文件(最后的index)。所以索引文件比數據文件大。

 

 

 ★★索引的分類 : 

    (1)普通索引 : index 僅僅是加快查詢的速度

    (2)唯一索引 :unique index 行上的值不能重復

    (3)主鍵索引 :primary key 不能重復,一張表只能有一個主鍵,但是可以有一個或者多個唯一索引

    (4)全文索引 :fulltext index

★查看一張表上的所有索引 : show index from 表名  

            垂直排列查看    Show index from 表名 /G

 

★給表中的列添加索引 : alter table 表名 add index/unique /fulltext自定索引名(列名)

           alter table 表名 add primary (列名)

  注 :自定索引名可以省略則默認和列名一樣,主鍵索引直接省略它

 

            注 :全文索引是依靠相似度來匹配找出

Select * from 表名 where match(全文搜索的列名) agains (‘搜索的內容’)

全文索引是有停止詞的,就是對於常見的詞比如in it,是不會添加索引的

全文索引在mysql的默認情況下,對中文的意義是不大的,因為英文單詞有空格拆分成單詞,進而對單詞進行索引,中文則沒有

★刪除非主鍵索引 :alter table 表名drop index 索引名 

刪除主鍵索引 :alter table 表名 drop primar key

 

 

★★★存儲過程 : procedure ,將一段代碼封裝起來,當要調用該存儲過程來實現。在封裝的語句體里面,可以用if,while等控制

  ★★查看現有的封裝 :show procedure status

      刪除封裝 :drop procedure 名字

       調用封裝 : call 名字();  實際調用封裝的語句,即是begin到end之間的語句

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM