1. 程式人生 > >進入MySQL資料庫的大門(學習筆記,有你就夠了)

進入MySQL資料庫的大門(學習筆記,有你就夠了)

一、初識資料庫

1、什麼是資料庫

資料庫叫database ,簡稱DB,是長期存放在計算機內,有組織、可共享的大量資料的集合;資料庫就是存放資料的倉庫,專業的資料庫系統具有較小的資料冗餘度,較高的資料安全性,易擴充套件性。

資料庫設計原則:

mysql主要優勢:一個應用對應一個數據庫

2、資料庫分類

關係型資料庫(保證資料的一致性,能建立關係) 非關係型資料庫(放在不同的伺服器上)
MySQL(中小型企業免費) MongoDB(文件儲存)
Oracle(大型電商網站) Redis(鍵值儲存)
SQL Server(政府網站,大學教育) Memcached(鍵值儲存)
maradb(mysql開源版本的一個分支) Hbase(列儲存)
db2(銀行系統) Neo4J(圖形)
sybase(被淘汰)

補充:ER關係圖

實體用 屬性 關係
方框 橢圓 菱形

補充:伺服器

伺服器是一臺電腦,這臺電腦安裝了伺服器軟體,這些軟體會監聽不同的埠號,根據使用者訪問的埠號提供不同的服務

3、DBMS、DBS、DBA區別

  1. DBMS是資料庫管理系統,是一種系統軟體,包括資料庫和用於資料庫訪問管理的介面系統,通常將DBMS直接稱為資料庫,嚴格意義上說mysql屬於DBMS
  2. DBS是一個實際可執行的系統,由軟體、資料庫、資料庫管理員組成
  3. DBA資料庫管理員

4、MySQL簡介

  • 概念

    是現行的開源、免費的關係型資料庫

  • 特點

    1. 執行速度快
    2. 使用成本低
    3. 容易使用
    4. 可移植性強
    5. 適用更多使用者
  • mysql語句分類

    DDL DML DQL DCL
    資料定義語言 資料操縱語言 資料查詢語言 :資料控制語言,定義訪問許可權、取消訪問許可權,安全設定
    create、drop、alter ,insert、update、delete select grant

5、mysql的安裝、解除安裝及啟動mysql服務

  • 安裝

    • 執行安裝程式、在啟動配置教程以前,一路下一步直到finish
    • 第一次finish之後啟動服務配置教程
    • 第一個induce mysql bin dinctory to windows path
    • 第二個埠號不要去修改,字符集要選擇utf-8,預設埠號:3306
  • 解除安裝

    • 開啟控制控制面板刪除軟體
    • 刪除mysql安裝目錄的所有檔案
    • 刪除mysql資料存放的檔案,C:\ProgramData\MySQL
  • 啟動mysql服務方式

    • 工作管理員開啟
    • 命令列輸入:service(檢視本地服務)
    • dos視窗輸命令:net start mysql
  • MysqlInsranceConfig:配置嚮導

    • programDate:資料檔案的儲存路徑(預設是隱藏的,在C盤下)
    • mysql的安裝目錄下的my.ini檔案:相應的一些配置,可配置編碼格式等
    • mysql -uroot -paaaaa123 進入mysql
    • show databases顯示所有的資料庫
    • select version()顯示mysql版本號

二、DDL語句建立資料庫和資料表

1、連線資料庫(在dos視窗下)

  • cmd——以管理員身份執行

  • 啟動mysql資料庫服務:net start mysql

  • 登入mysql:mysql -uroot -paaaaa123(或者:mysql -hlocalhost -uroot -paaaaa123)注意-p以後不能有空格

  • exit退出mysql

  • show databases;(顯示資料庫,一定要加分號)

  • use mysql

  • show tables(顯示資料庫中的表)

  • sql語句select * from user\G;顯示user使用者列表

  • 修改user使用者密碼:update user set password=password’(1234’ ) where user=‘root’;,flush privileges;重新整理下

  • ?尋求幫助

  • 檢視mysql所支援的引擎型別、表型別:SHOW ENGINES;

  • 檢視預設引擎:SHOW VARIABLES LIKE ‘storage_engine’;

  • 顯示變數:show variables like’auto%’

2、資料庫操作

  • 建立資料庫

    CREATE DATABASE [IF NOT EXISTS ]資料庫名;

  • 刪除資料庫

    DROP DATABASE [IF EXISTS] 資料庫名;

  • 修改資料庫字符集

    alter database 資料庫名 character set 字符集

  • 檢視資料庫

    • 檢視所有資料庫:show databases
    • 檢視資料庫定義:show create databse 資料庫名
    • 檢視當前正在使用的資料庫:select database()
  • 選中資料庫

    use 資料庫名

3、表結構操作

  • 建立表

    • create table 表名(

      ​ 列名 列的型別 列的約束,

      ​ 列名 列的型別 列的約束

      ​ )【表型別】【表字符集】【表註釋】

    • 程式碼示例:

      #建立學生表,並設定表型別、字符集
      CREATE TABLE `student` (
        `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '主鍵、學號',
        `psd` VARCHAR(20) COLLATE utf8_estonian_ci NOT NULL DEFAULT '123456' COMMENT '密碼',
        `name` VARCHAR(30) COLLATE utf8_estonian_ci NOT NULL DEFAULT '匿名' COMMENT '學生姓名',
        `sex` VARCHAR(2) COLLATE utf8_estonian_ci NOT NULL DEFAULT '男' COMMENT '性別',
        `birsday` DATETIME DEFAULT NULL,
        `email` VARCHAR(20) COLLATE utf8_estonian_ci DEFAULT NULL,
        PRIMARY KEY (`id`)
      ) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_estonian_ci
      
  • 註釋

    欄位註釋: comment'註釋的內容'
    表註釋:comment='註釋的內容'
    
  • 列的約束

    primary key 主鍵約束

    ​ unique : 唯一約束

    ​ not null 非空約束

  • 注意事項

    1. 除了最後一個列不用逗號隔開,每一列都要逗號隔開

    2. 表名如果變藍了表明和資料庫有衝突,這時候要加上反引號·

    3. 字串型別的要用單引號引起來

    4. 有多個屬性的時候用空格隔開就好

    5. commend後面加單引號註釋內容

    6. #代表整個註釋

    7. 設定嚴格檢查模式

      SET sql_mode='strict_trane_tables';
      
  • 列型別

    • 數值型
      1. tinyint:非常小的資料
      2. int:標準整數
      3. double:雙精度浮點數
      4. decimal【(M,D)】:字串形式浮點數,M表示總位數,D表示保留小數位數
    • 字串型
      1. char:固定長度
      2. vachar:可變長度,括號內代表的是字元的個數
      3. text:文字串
    • 日期和時間
      1. datetime:日期和時間,預設是null
      2. timestamp:常用於顯示當前時間,預設是當前日期和時間
    • Null值
      1. 理解為沒有值或未知值
      2. 不要用null進行算術運算
  • 表的型別

    常見的MyISAM,InnoDB

    名稱 MyISAM InnoDB
    事務處理 no yes
    外來鍵約束 no yes
    資料行鎖定 no yes
    全文索引 yes no
    表空間大小 較小 較大
  • 資料表的儲存位置

    都位於C:\ProgramData\MySQL目錄下

    MyISAM InnoDB
    只有一個frm檔案 frm、wyd、myi三個檔案
  • 資料欄位屬性

    1. unsigned:無符號,宣告該資料不允許為負數
    2. zerofill:0填充,不足位數用0填充,如int(3)5則為005
    3. auto_increment:自動增長,常用於設定主鍵,且為整數,定義起始值和步長:
      • 定義起始值:auto_increment=100(建表時在右括號右邊寫,影響的是當前表,對整個資料庫的其他表沒有影響
      • 定義自增步長:set auto_increment_ncrement=5,會對所有資料庫受影響
    4. null和not null :預設為null,若設定為not null則必須有值
    5. default:設定預設值
  • 刪除表

    drop table 表名

  • 修改表

    #修改表名
    ALTER TABLE 表名 RENAME AS test1;
    #修改表的字符集
    alter table 表名  character set 字符集
    #新增列
    ALTER TABLE 表名 ADD 列名 列型別 屬性 ;
    #修改列
    alter table 表名 modify 列名 列型別 屬性 ;
    #修改列名
    alter table 表名 change 舊列名 新列名 列型別 屬性 ;
    #刪除列
    alter table 表名 dop 列名
    
  • 查看錶

    檢視當前資料庫所有的表名
    show tables
    查看錶的定義結構/建立語句
    show create table 表名
    查看錶的結構
    desc 表名
    

4、儲存sql檔案以及開啟sql檔案

儲存Ctrl+s

新建查詢編輯器——在同一標籤中開啟檔案(在不同標籤中開啟)

對於影象聲音視訊用text、blob儲存資料

一般沒有必要直接儲存影象,而儲存的是路徑用字串


三、DML語句對錶中資料CRUD操作

1、主鍵&外來鍵

  • 主鍵咋一個表裡面可有也可以沒有,

  • 一個表裡面的外來鍵既可以有一個也可以有多個,

  • 建立主外來鍵關係的有主鍵的表為主表,有外來鍵的表成為子表或者從表

  • 能夠保證資料的完整性和 正確性

  • 對於有主外來鍵關係的表,資料插入操作要有一定順序,先放主鍵資料,再放外來鍵資料 ,先刪除子表,再刪除主表

  • 主鍵和外來鍵,列名可以不同,但是資料型別一定要相同

  • 主鍵和外來鍵建立聯絡第一種方法在建表的時候就聯絡,關鍵詞是constraint,外來鍵名一般以FK開頭 foreign key代表外來鍵,引用主鍵用關鍵詞reference

  • 主鍵&外來鍵相關的SQL語句

    建立主鍵&外來鍵
    1、建立此表的同時就建立外來鍵
    主鍵:PRIMARY KEY可寫在列後面,也可以欄位都寫完了在最後一行寫明PRIMARY KEY(欄位名 )
    外來鍵:CONSTRAINT FR_gradeId FOREIGN KEY (要新增主鍵的欄位) REFERENCES 引用表(引用表中的哪個欄位)(FR_gradeId欄位名)
    2、建立字表完畢後,修改子表增加外來鍵
    ALTER TABLE 表名
    ADD CONSTRAINT 外來鍵名 FOREIGN KEY (要新增主鍵的欄位) REFERENCES 引用表(引用表中的哪個欄位);
    刪除外來鍵
    ALTER TABLE 表名 DROP FOREIGN KEY 外來鍵名;
    (刪除了之所以還能看到外來鍵在表中,是因為外來鍵會默默的建立了一個索引,要想徹底刪除還要加上一句話刪除索引
    ALTER TABLE 表名 DROP INDEX  外來鍵名;
    刪除外來鍵要有兩句話才能徹底刪除)
    
    

2、插入資料

  • insert into 表名(列名1,列名2) values(值1,值2)

  • insert into 表名 values(值1,值2)

  • insert into 表名(列名1,列名2) values(值1,值2),(值1,值2)

    批量插入資料

  • 注意點:

    1. 批量插入比單條插入效率更高,但是更容易出現問題
    2. 插入全部列名可以省略,插入部分列的話就不能省略表名後面的列名。
    3. 有預設值的時候在values裡面可以寫預設值也可以寫default
    4. 如果不寫列名的情況下即使有些列可以為空,但是不能不寫要寫null,最好都寫上列名,如果外來鍵值超過了主表的主鍵數目,會報錯

3、刪除資料

  • delete from 表名 【where條件】
  • truncate table 表名
  • delete 和 truncate 的區別
    1. delete 是DML語句 一條一條刪除表中資料
    2. truncate是DDL 先刪除表再重建表
    3. 關於哪條執行效率高,具體要看錶中的資料量,如果資料比較少,delete高效,資料多,則truncate效率高
    4. 當使用不帶where條件的delete from刪除資料時,自增當前數值依然從原來基礎上進行,會記錄日誌,不刪除表結構,但使用truncate table刪除表中全部資料的時候,自增當前數值不從原來基礎上進行,從原來自增初始值開始。如下例子:不會記錄日誌
    5. 兩種不同村粗引擎,在使用delete from刪除全部資料後,自增列初始值表現的不同:同樣使用delete from清空資料,重啟資料庫服務後,對於INNODB的表,自增列從初始值從新開始(比如開始預設初始值是1,那就從1再開始),而對於MYISAM型的表,自增序列從上一個自增資料基礎上開始,原因是:INNODB的資料是儲存在內容中的,重啟資料可服務後,之前的也就都沒有了,而MYISAM是儲存在檔案中,就算重啟,資料依然存在。

4、修改資料

  • update 表名 set 列名=值【where條件】

四、DQL查詢語句

1、AS為欄位取別名

AS可省略

2、Dinstinct去重複項

select distinct 欄位名 from 表名

3、通用格式

select [distinct] [*] [列名1,列名2] from 表名 where 條件
group by...
having
order by 

4、基礎查詢

#查詢資料用DQL語句

#1、核心查詢(*代表查詢所有列,效率比較低)
SELECT * FROM student;

#2、查詢指定列,查詢student的學號和姓名,在mysql中列名不區分大小寫
SELECT studentno,studentname FROM student;
#3、被查出的列取別名(給列取別名as可以省略)
SELECT studentno AS 學號,studentname AS 姓名 FROM student;

SELECT studentno  學號,studentname 姓名 FROM student;

#6、給表取取別名(給表取別名as可以省略),別名不會該表原表的列名,只是為了看的
SELECT studentno  學號,studentname 姓名 FROM student AS 學生表;

SELECT studentno  學號,studentname 姓名 FROM student 學生表;
#7、as為查詢結構(如函式)取一個新的名字
SELECT CONCAT('姓名:',studentName)AS 新姓名 FROM student;

#8、檢視那些同學參加了考試(學號),去除重複項,用關鍵字distinct,預設為all代表查詢所有行
SELECT DISTINCT studentno FROM result;
注意:distinct一定寫前面
SELECT DISTINCT NAME NAME,english  FROM exam;

#9、select中可以出現表示式
SELECT @@auto_increment_increment;
SELECT VERSION();
SELECT 100*3-1 AS 計算結果

SELECT studentno,studentresult+1 AS 提分後 FROM result;

#10、滿足條件的查詢(where)  考試成績95-100
SELECT studentno,StudentResult
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;

5、模糊查詢

#13、精確查詢
SELECT studentno,StudentResult
FROM result
WHERE studentno=1000;

#15、查詢除了1000號這個學生,其他學生的考試成績!=
SELECT studentno,StudentResult
FROM result
WHERE studentno !=1000;
#16、或者用not和!=一樣
SELECT studentno,StudentResult
FROM result
WHERE NOT studentno =1000;

#17、模糊查詢between and/ like/in/null
#查詢姓李的同學的學號和姓名
#like及結合使用的萬用字元,%(0到任意一個字元) _(一個字元)

#查詢所有姓李的同學
SELECT studentno,StudentName
FROM student
WHERE StudentName LIKE '李%';
#查詢姓李的,名字是三個字的
SELECT studentno,StudentName
FROM student
WHERE StudentName LIKE '李__';

#查詢所有帶有“文字的”(不管開頭和結尾)常用
SELECT studentno,StudentName
FROM student
WHERE StudentName LIKE '%文%';
轉義字元%——\%
            _——\_

如何不想用\作為轉義字元,可以自定義轉義字元,使用自己定義的轉衣服:escape ‘你定義的轉義符’但是%和_是不可以自行設計的

#模糊查詢之  in
SELECT studentName,studentNo FROM student
WHERE studentNo IN(1000,1001,1002,1003);

SELECT studentName,studentNo FROM student
WHERE Address IN('北京','南京');


#模糊查詢之  null
注意:只有是顯示null的才為空,對於空白什麼都沒有的並不是空null而是字串為空,如:
#查詢家庭住址沒有寫的同學
#1、錯誤用法
SELECT studentname FROM student
WHERE Address IS  NULL;
#2、用空字串
SELECT studentname FROM student
WHERE Address='';
#3、一般這種型別的查詢用這種寫法
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;
#查詢出生日期沒有填寫的同學,=null是錯誤的,和null比較要用iis null
SELECT studentno FROM student
WHERE BornDate IS NULL;

#對於不是空的要用is not null
SELECT studentname FROM student
WHERE BornDate IS  NOT NULL;

6、分組查詢

#不同課程的平均分、最高分、最低分
SELECT  subjectname, AVG(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
GROUP BY r.subjectno

#分組後再篩選執行的sql語句篩選
SELECT  subjectname, AVG(StudentResult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result r
INNER JOIN `subject` sub
ON r.SubjectNo=sub.SubjectNo
GROUP BY r.subjectno
HAVING 平均分>80
ORDER BY 平均分 DESC
LIMIT 0,4

7、連線查詢

內連線 左連線 右連線 自連線 等值連線 非等值連線
nner join left join right join \ \ \
查詢兩個表結果集中的交集 以左表為基準,右邊表來一一匹配,匹配不上的返回左表記錄,右表以null填充 以右表為基準,右邊表來一一匹配,匹配不上的返回左表記錄,左表以null填充 自連線的表一定要取別名(AS)子欄目父欄目問題 和內連一樣,只是寫法不同 區別於等值連線,不加where
等值連線:
SELECT s.StudentNo,StudentName,subjectno,StudentResult
FROM student s,result r
WHERE s.StudentNo = r.StudentNo;
#自連線程式碼 
CREATE TABLE IF NOT EXISTS category(
    categoryId INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '當前欄目',
    pId INT(10) NOT NULL COMMENT '當前欄目的父欄目',
    categoryName VARCHAR(50) NOT NULL,
    PRIMARY KEY (categoryId)
)
INSERT INTO category
VALUES (2,1,'美術設計'),
(3,1,'軟體開發'),
(4,3,'資料庫基礎'),
(5,2,'ps基礎'),
(7,2,'色彩搭配'),
(8,3,'PHP基礎'),
(9,3,'java基礎');



SELECT * FROM category;
SELECT categoryName '知足上進' FROM category;

#將各個欄目的父子欄目顯示出來(父欄目名稱   子欄目名稱)
SELECT a.categoryName AS '主欄目',b.categoryName AS '子欄目'
FROM category AS a,category AS b;
WHERE a.categoryId=b.pId;
  • 一定要先寫連線查詢再寫where

  • 多重巢狀連線:

    注意:inner join ,和from以及on後面都不能用,隔開,否則會報1064錯誤

    #參加了參加了考試的同學(學號、學生姓名、科目名、分數)
    SELECT s.StudentNo,StudentName,subjectname,StudentResult
    FROM student AS s
    INNER JOIN result AS r
    ON s.StudentNo = r.StudentNo
    INNER JOIN `subject` AS sub
    ON r.SubjectNo=sub.SubjectNo;
    

8、排序

group by having

#查詢《資料庫結構—1》的所有考試的同學(學號、學生姓名、科目名、分數)
SELECT s.StudentNo,StudentName,subjectname,StudentResult
FROM student AS s
INNER JOIN result AS r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` AS sub
ON r.SubjectNo=sub.SubjectNo
WHERE SubjectName='資料庫結構-1'
ORDER BY StudentResult DESC,studentno  DESC    #1、預設升序asc  2、desc為降序
#常見錯誤:ORDER BY StudentResult ,studentno  DESC 這時候StudentResult升序,studentno降序,desc是就近原則

9、分頁查詢

  • limit 索引,頁容量
  • 當前頁碼-1)*頁容量,頁容量
#分頁查詢
##查詢《資料庫結構—1》的所有考試的同學(學號、學生姓名、科目名、分數)
#每頁顯示五條資料出來
SELECT s.StudentNo,StudentName,subjectname,StudentResult
FROM student AS s
INNER JOIN result AS r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` AS sub
ON r.SubjectNo=sub.SubjectNo
WHERE SubjectName='資料庫結構-1'
ORDER BY StudentResult DESC,studentno  DESC  
#limit 0,5  #從哪條記錄開始起始行0,要顯示幾行
LIMIT 5,5   #第二頁
LIMIT 10,5  #第三頁   (等於linit 5 offset 0)

10、子查詢

  • 定義:子查詢就是在查詢語句中的where條件子句中,又嵌套了另外一個select查詢語句
#子查詢
#分部寫簡單sql語句,然後去巢狀
SELECT studentno ,studentname FROM student WHERE studentno IN()
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=()#1\2\3\4
SELECT subjectno FROM `subject` WHERE SubjectName='高等數學-2' #2


SELECT studentno, studentname FROM student WHERE studentno IN(
SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
SELECT subjectno FROM `subject` WHERE SubjectName='高等數學-2' ))

五、mysql函式

1、數學函式

ABS() CEILING() FLOOR() RAND() RAND()
絕對值 大於等於我的最小的整數 小於等於我的最大的整數 返回0-1之間的隨機數 每次生成固定的0-1之間的隨機數(以某個數作為種子)
SELECT ABS(-8) ‘-8的絕對值’ SELECT CEILING(9.8)=10 SELECT FLOOR(9.8)=9 \ \

2、字串函式

#返回字串中包含的字元數
SELECT CHAR_LENGTH ( '好好學習資料庫')
#合併字串
SELECT CONCAT('我','愛')
#替換字串,從某個位置開始,替換某個長度,替換的內容
SELECT INSERT('我愛你婺源',1,3,'很愛')
SELECT INSERT('我愛你婺源',1,3,'很愛')  #如果起始位置超過字串長度,則返回原長度
#變小寫
SELECT LOWER('I LOVE YOU')
#變大寫
SELECT UPPER('i love you')
#從左邊擷取指定長度的字串
SELECT LEFT('我愛你中國',3)
##從右邊擷取指定長度的字串
SELECT RIGHT('我愛你中國',3)
#替換字串(要替換的字串,要替換的文字,替換的內容)
SELECT REPLACE('中國歡迎你,你好','你','你們')
#擷取(從哪個位置開始擷取,擷取多長)
SELECT SUBSTRING('中國歡迎你,你好',1,2)
#反轉
SELECT REVERSE('中國歡迎你')

3、日期和時間函式

#獲得當前日期
SELECT CURRENT_DATE()
SELECT CURDATE()
#獲得當前日期和時間
SELECT NOW()
SELECT LOCALTIME()
SELECT SYSDATE()
#分別獲取日期中的某個部分
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())

4、系統資訊的函式

SELECT VERSION()
SELECT USER()

5、聚合函式

#聚合函式:返回的是一個值,不要出現多個值
#count(欄位名) 是非空值的計數
count(*)返回所有列的統計
SELECT COUNT(StudentName) FROM student
SELECT COUNT(1) FROM student
#sum()求總和
SELECT SUM(StudentResult) AS 總分 FROM result
SELECT AVG(StudentResult) AS 平均分 FROM result
SELECT MAX(StudentResult) AS 最高分 FROM【】 result
SELECT MIN(StudentResult) AS 最低分 FROM result

count(*)儘量少用

六、MySql事務

1、事務定義

事務就是將一組sql語句放在同一批次內去執行,如果一個sql語句錯誤,則該批次的所有sql語句都將取消執行,最能理解的就是銀行轉賬

注意: mysql事務只支出innoDB和BDB資料表型別

2、事