Mysql資料庫基礎知識

来源:http://www.cnblogs.com/yy601222543/archive/2017/11/11/7819849.html
-Advertisement-
Play Games

E-R模型(實體關係模型) 當前物理的資料庫都是按照E-R模型進行設計的 E表示entry,實體 R表示relationship,關係 一個實體轉換為資料庫中的一個表 關係描述兩個實體之間的對應規則,包括 一對一 一對多 多對多 關係轉換為資料庫表中的一個列 *在關係型資料庫中一行就是一個對象 數據... ...


E-R模型(實體關係模型)

  • 當前物理的資料庫都是按照E-R模型進行設計的
  • E表示entry,實體
  • R表示relationship,關係
  • 一個實體轉換為資料庫中的一個表
  • 關係描述兩個實體之間的對應規則,包括
    • 一對一
    • 一對多
    • 多對多
  • 關係轉換為資料庫表中的一個列 *在關係型資料庫中一行就是一個對象

   

數據引擎

MyISAM和InnoDB的區別

  1. MySQL預設採用的是MyISAM。
  2. InnoDB支持事務,而MyISAM不支持。InnoDB的AUTOCOMMIT預設是打開的,即每條SQL語句會預設被封裝成一個事務,自動提交,這樣會影響速度,所以最好是把多條SQL語句顯示放在begin和commit之間,組成一個事務去提交。
  3. InnoDB支持數據行鎖定,MyISAM不支持行鎖定,只支持鎖定整個表。即MyISAM同一個表上的讀鎖和寫鎖是互斥的,MyISAM併發讀寫時如果等待隊列中既有讀請求又有寫請求,預設寫請求的優先順序高,即使讀請求先到,所以MyISAM不適合於有大量查詢和修改並存的情況,那樣查詢進程會長時間阻塞。因為MyISAM是鎖表,所以某項讀操作比較耗時會使其他寫進程餓死。
  4. InnoDB支持外鍵,MyISAM不支持。
  5. InnoDB的主鍵範圍更大,最大是MyISAM的2倍。
  6. InnoDB不支持全文索引,而MyISAM支持。全文索引是指對char、varchar和text中的每個詞(停用詞除外)建立倒排序索引。MyISAM的全文索引其實沒啥用,因為它不支持中文分詞,必須由使用者分詞後加入空格再寫到數據表裡,而且少於4個漢字的詞會和停用詞一樣被忽略掉。
  7. MyISAM支持GIS數據,InnoDB不支持。即MyISAM支持以下空間數據對象:Point,Line,Polygon,Surface等。
  8. 沒有where的count(*)使用MyISAM要比InnoDB快得多。因為MyISAM內置了一個計數器,count(*)時它直接從計數器中讀,而InnoDB必須掃描全表。所以在InnoDB上執行count(*)時一般要伴隨where,且where中要包含主鍵以外的索引列。為什麼這裡特別強調"主鍵以外"?因為InnoDB中primary index是和raw data存放在一起的,而secondary index則是單獨存放,然後有個指針指向primary key。所以只是count(*)的話使用secondary index掃描更快,而primary key則主要在掃描索引同時要返回raw data時的作用較大。

       

三範式

  • 經過研究和對使用中問題的總結,對於設計資料庫提出了一些規範,這些規範被稱為範式
  • 第一範式(1NF):列不可拆分
  • 第二範式(2NF):唯一標識
  • 第三範式(3NF):引用主鍵
  • 說明:後一個範式,都是在前一個範式的基礎上建立的

   

欄位類型

  • mysql中包含的數據類型很多,這裡主要列出來常用的幾種
  • 數字:int,decimal
  • 字元串:
    • char(8):不可變,不夠8個在右邊補空格,
    • varchar(8):可變,不夠8個的話,該是幾個就幾個,
    • text
  • 日期:datetime
  • 布爾:
    • bit(1): 0,1
    • bit(2): 00, 01, 10, 11
    • bit(3): 001, 010, 100,......

         

約束

  • 主鍵primary key
  • 非空not null
  • 惟一unique
  • 預設default
  • 外鍵foreign key

   

遠程連接

  • 一般在公司開發中,可能會將資料庫統一搭建在一臺伺服器上,所有開發人員共用一個資料庫,而不是在自己的電腦中配置一個資料庫
  • 運行命令
  • mysql -hip地址 -uroot -p

   

資料庫

  • 創建資料庫
    • create database test character utf8 collate utf8_general_ci;
  • 刪除資料庫
    • drop database 資料庫名;
  • 切換資料庫
    • use 資料庫名;

       

數據表

  • 創建數據表
    • create table create_test(
    • id int(11) auto_increment primary key not null,
    • name varchar(20) not null,
    • birthday datetime,
    • gender bit default 0,
    • isDelete bit default 0
    • ) engine=InnoDB default charset=utf8;

   

  • 修改表

    alter table 表名 add|change|drop 列名 類型;
    如:
    alter table students add birthday datetime;

  • 刪除表

    drop table 表名;

  • 查看表結構

    desc 表名;

  • 更改表名稱

    rename table 原表名 to 新表名;

  • 查看表的創建語句

    show create table '表名';

       

數據操作

  • 查詢

    select * from 表名

  • 增加

    全列插入:insert into 表名 values(...)
    預設插入:insert into 表名(1,...) values(1,...)
    同時插入多條數據:insert into 表名 values(...),(...)...;
    insert into 表名(1,...) values(1,...),(1,...)...;

  • 主鍵列是自動增長,但是在全列插入時需要占位,通常使用0,插入成功後以實際數據為準
  • 修改

    update 表名 set 1=1,... where 條件

  • 刪除

    delete from 表名 where 條件

  • 邏輯刪除,本質就是修改操作update

    alter table students add isdelete bit default 0;
    如果需要刪除則
    update students isdelete=1 where ...;

       

清空表

-- 清空全部數據,不寫日誌,不可恢復,速度極快

truncate table 表名;

-- 清空全部數據,寫日誌,數據可恢復,速度慢

delete from 表名

   

查看字元集

show variables like '%char%';

   

數據備份

  • 進入超級管理員

    sudo -s

  • 進入mysql庫目錄

    cd /var/lib/mysql

  • 運行mysqldump命令

    mysqldump –uroot –p 資料庫名 > ~/Desktop/備份文件.sql;
    按提示輸入mysql的密碼

數據恢復

  • 連接mysqk,創建資料庫
  • 退出連接,執行如下命令

    mysql -uroot –p 資料庫名 < ~/Desktop/備份文件.sql
    根據提示輸入mysql密碼

       

數據查詢(where中的優先順序)

  • 小括弧,not,比較運算符,邏輯運算符
  • andor先運算,如果同時出現並希望先算or,需要結合()使用

       

數據查詢(where和having 的區別)

  • where是對from後面指定的表進行數據篩選,屬於對原始數據的篩選
  • having是對group by的結果進行篩選,屬於對分組數據的篩選

   

數據聚合操作

  • select count(*) from students;
  • select max(id) from students where gender=0;
  • select min(id) from students where isdelete=0;
  • select sum(id) from students where gender=1;
  • select avg(id) from students where isdelete=0 and gender=0;

   

數據分組

  • select gender as 性別,count(*) from students group by gender having gender=1;

       

排序

  • select * from 表名 order by 1 asc|desc,2 asc|desc,...

       

去除重覆行

  • select distinct * from ...

       

外鍵的設置

  • 在創建表時可以直接創建約束

    create table scores(
    id int primary key auto_increment,
    stuid int,
    subid int,
    score decimal(5,2),
    foreign key(stuid) references students(id) on delete cascade,
    foreign key(subid) references subjects(id)
    on delete cascade
    );

       

  • 也可以在創建好數據表後單獨創建外鍵約束

    alter table scores add constraint stu_sco foreign key(stuid) references students(id) on delete cascade;

       

  • 級聯操作的類型包括:
    • restrict(限制):預設值,拋異常
    • cascade(級聯):如果主表的記錄刪掉,則從表中相關聯的記錄都將被刪除
    • set null:將外鍵設置為空
    • no action:什麼都不做

         

  • 企業中一般會在主表中創建邏輯刪除欄位(isDelete).

       

連表查詢

select students.sname,subjects.stitle,scores.score
from
scores
inner join students on scores.stuid=students.id;

註:inner join ...on...左右的表明無所謂順序,讀取兩個表的全部欄位

left join...on... 和 right join...on... 查詢其中一個的全部數據欄位,另一個沒有也無所有,null填充


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、先準備一個div onchange觸發事件 <input type="file" onchange="preview(this)" ></span> <div id="preview"></div> 2、寫JS代碼 //上傳圖片之前預覽圖片function preview(file){ if ( ...
  • 作為一個初學者,經常會遇到在獲取某一元素的寬度(高度、top值...)時,到底是用 style.width還是offsetWidth的疑惑。 1. 當樣式寫在行內的時候,如 <div id="box" style="width:100px">時,用 style.width或者offsetWidth都 ...
  • 代碼: 正則表達式: 1. 匹配空:^$ 2. 匹配手機號:^(((\+86)|(86))?1[34578]\d{9})$ 3. 控制提示信息的顯示:ng-show="myForm.phone.$dirty && myForm.phone.$invalid" ...
  • 小組項目 “基於JavaScript的讀書平臺” 正在開發中,預計年底上線。 由於之前有Flask框架的web開發經驗,產品的第一個版本我負責了web平臺搭建,技術選型: 伺服器端:nodejs-express 前端:React、Ant Design 資料庫:Mysql 之前Flask框架下的前端技 ...
  • <!DOCTYPE html><html> <!-- 圖片輪播的效果可以用bootstrap框架來實現,也可以自己直接寫,這裡採用了自己寫的方式來實現--><head><meta charset="UTF-8"><title>Insert title here</title></head><styl ...
  • 前言 今天是雙十一這個青年人同慶的日子,一年一度的剁手節又開始了,我相信正在逛著淘寶網站的同志們一定被彈出的廣告搞得不厭其煩吧...那麼,網站的廣告是怎麼使用腳本寫出來的呢? 下麵就讓我們簡單地介紹一下網站彈出廣告的這個效果吧。 一、案例介紹 首先我們想要在網站的頂部做一個能夠定時彈出廣告的東西,效 ...
  • 這是我自己早前聽課時整理的前端全套知識點,適用於初學者,也可以適用於中級的程式員,你們可以下載下來。我自認為還是比較系統全面的,可以抵得上市場上90%的學習資料。討厭那些隨便亂寫的資料還有拿出來賣錢的人!在這裡我免費的分享出來供大家使用! 在這個平臺真的可以學習到不少的東西!有很多的人都在無私的奉獻 ...
  • 關註微信公眾號《IT技術資源共用》獲取更多資源! 微信號:feng1376311650 或者掃二維碼關註獲取下麵全部資源: python: 【0001】Python安裝包,教程文檔,工具包 鏈接: http://pan.baidu.com/s/1hsnHizM 密碼:9x03 【0002】Pytho ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...