1. 程式人生 > 實用技巧 >MySQL資料庫簡單應用

MySQL資料庫簡單應用

MySQL資料庫簡單應用

1、資料庫概述

1.1、什麼是資料庫

  • 提供儲存資料的介質,能夠持久化處理資料

1.2、什麼是持久化資料

  • 將資料從記憶體儲存到磁碟檔案

1.3、資料庫型別

  • 關係型資料庫

  • 面向物件型資料庫

  • nosql資料庫

  • ......

2、關係型資料庫

  • mysql(重點)

  • oracle(重點)

  • mssql

  • db2

  • 其他

2.1、什麼是關係型資料庫

資料庫就是一個按照資料結構來組織,儲存和管理資料的倉庫

  • 關係型資料庫的組成結構

    • 資料庫

    • 資料表

3、MySQL資料庫

3.1、概述

MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB公司開發,目前屬於Oracle公司。MySQL是一種關聯資料庫管理系統,關聯資料庫將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

3.2、特點

  • mysql有開源版本和收費版本,你使用開源版本是不收費的

  • mysql支援大型資料庫,可以處理上千萬記錄的大型資料庫

  • Mysql使用標準的SQL資料庫語言形式

  • Mysql在很多系統上面都支援

  • Mysql對PHP,PYTHON都有很好的支援當然其他的語言也支援比如JAVA,C

  • Mysql是可以定製的,採用了GPL協議,你可以修改原始碼來開發自己的Mysql系統。

4、MySQL的安裝

  • 下載安裝壓縮包解壓(解壓目錄不要帶空格和中文)

  • 配置環境變數

    • 變數名:MYSQL_HOME

    • 變數值:解壓的安裝包路徑(eg:C:\mysql\mysql-8.0.15-winx64)

    • path裡新增:%MYSQL_HOME%\bin(注意:沒有分號)

  • 生成data檔案

    • 以管理員身份執行cmd,進入C:\mysql\mysql-8.0.15-winx64\bin 下執行命令:mysqld --initialize-insecure --user=mysql,在C:\mysql\mysql-8.0.15-winx64目錄下生成data目錄

  • 啟動服務

    • net start mysql

  • 以超級管理員身份登入

    • mysql -uroot -p

參考資料https://www.cnblogs.com/reyinever/p/8551977.html

  • MySQL如何設定密碼

    • 用UPDATE直接編輯user表

      • 首先登入MySQL。

      • mysql> use mysql;

      • mysql> update user set password=password('123') where user='root' and host='localhost';

      • mysql> flush privileges;

參考資料https://www.cnblogs.com/mrhonest/p/10881646.html

5、MySQL解決中文亂碼問題(5.0版本)

預設情況下,mysql不支援中文,需要將mysql的預設的編碼集改為:utf-8

如何修改編碼集

  • 直接將my.ini檔案(檔案已存網盤)複製到mysql的安裝目錄

  • 重啟mysql服務

6、MySQL的解除安裝

  • 通過mysqld -remove解除安裝MySQL服務

7、sql語句基礎

7.1、sql的分類

  • DML:資料操作語言,它是對錶記錄的操作(增、刪、改)!)

  • DCL:資料控制語言(理解)

  • DDL:資料定義語言:主要由create、 alter、 drop和truncate四個關鍵字完成

  • DQL:資料查詢語言

7.2、DQL語句

  • 查詢所有列

 SELECT * FROM 表名;/*其中*表示查詢所有列*/
  • 查詢指定列

 SELECT 列1 [, 列2, ... 列N] FROM 表名;
  • 完全重複的記錄只一次

    當查詢結果中的多行記錄一模一樣時,只顯示一行。一般查詢所有列時很少會有這種情況,但只查詢一列(或幾列)時,這總可能就大了!

 SELECT DISTINCT * | 列1 [, 列2, ... 列N] FROM 表名;
/*查詢員工表的工資,如果存在相同的工資只顯示一次!*/
SELECT DISTINCT sal FROM emp;
  • 列運算:數量型別的列可以做加、減、乘、除運算

 SELECT sal*1.5 FROM emp;
SELECT sal+comm FROM emp;
  • 字串型別可以做連續運算

 SELECT CONCAT('$', sal) FROM emp;
  • 轉換NULL值

    有時需要把NULL轉換成其它值,例如com+1000時,如果com列存在NULL值,那麼NULL+1000還是NULL,而我們這時希望把NULL當前0來運算。

 SELECT IFNULL(comm, 0)+1000 FROM emp;
--> IFNULL(comm, 0):如果comm中存在NULL值,那麼當成0來運算。

  • 給列起別名

    你也許已經注意到了,當使用列運算後,查詢出的結果集中的列名稱很不好看,這時我們需要給列名起個別名,這樣在結果集中列名就顯示別名了

 SELECT IFNULL(comm, 0)+1000 AS 獎金 FROM emp;
--> 其中AS可以省略
  • 條件控制(條件查詢)

    與UPDATE和DELETE語句一樣,SELECT語句也可以使用WHERE子句來控制記錄

SELECT empno,ename,sal,comm FROM emp WHERE sal > 10000 AND comm IS NOT NULL;
SELECT empno,ename,sal FROM emp WHERE sal BETWEEN 20000 AND 30000;
SELECT empno,ename,job FROM emp WHERE job IN ('經理', '董事長');
  • 模糊查詢 當你想查詢姓張,並且姓名一共兩個字的員工時,這時就可以使用模糊查詢

SELECT * FROM emp WHERE ename LIKE '張_';
--> 模糊查詢需要使用運算子:LIKE,其中_匹配一個任意字元,注意,只匹配一個字元而不是多個。
--> 上面語句查詢的是姓張,名字由兩個字組成的員工。
SELECT * FROM emp WHERE ename LIKE '___'; //姓名由3個字組成的員工
  • 如果我們想查詢姓張,名字幾個字的員工時就要使用“%”了。

SELECT * FROM emp WHERE ename LIKE '張%';
--> 其中%匹配0~N個任意字元,所以上面語句查詢的是姓張的所有員工
SELECT * FROM emp WHERE ename LIKE '%阿%';
--> 千萬不要認為上面語句是在查詢姓名中間帶有阿字的員工,因為%匹配0~N個字元,所以姓名以阿開頭和結尾的員工也都會查詢到。
SELECT * FROM emp WHERE ename LIKE '%';
--> 這個條件等同與不存在,但如果姓名為NULL的查詢不出來!
  • 排序

    • 升序

     SELECT * FROM WHERE emp ORDER BY sal ASC;
      --> 按sal排序,升序!
      --> 其中ASC是可以省略的
    • 降序

     SELECT * FROM WHERE emp ORDER BY comm DESC;
      --> 按comm排序,降序!
      --> 其中DESC不能省略
    • 使用多列作為排序條件

    SELECT * FROM WHERE emp ORDER BY sal ASC, comm DESC;
      --> 使用sal升序排,如果sal相同時,使用comm的降序排
  • 聚合函式:聚合函式用來做某列的縱向運算。

  • COUNT

SELECT COUNT(*) FROM emp;
--> 計算emp表中所有列都不為NULL的記錄的行數
SELECT COUNT(comm) FROM emp;
--> 雲端計算emp表中comm列不為NULL的記錄的行數
  • MAX

 SELECT MAX(sal) FROM emp;/*查詢最高工資*/
  • MIN

SELECT MIN(sal) FROM emp;/*查詢最低工資*/
  • SUM

 SELECT SUM(sal) FROM emp;/*查詢工資合*/
  • AVG

SELECT AVG(sal) FROM emp;/*查詢平均工資*/
  • 分組查詢 分組查詢是把記錄使用某一列進行分組,然後查詢組資訊。

 //檢視所有部門的記錄數。
 SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
  --> 使用deptno分組,查詢部門編號和每個部門的記錄數
 SELECT job, MAX(SAL) FROM emp GROUP BY job;
 --> 使用job分組,查詢每種工作的最高工資
  • 組條件

    組條件只能是分組欄位或分組函式

 /*以部門分組,查詢每組記錄數。條件為記錄數大於3*/
 SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;
  • limit子句(方言): LIMIT用來限定查詢結果的起始行,以及總行數。

//查詢起始行為第5行,一共查詢3行記錄,其中4表示從第5行開始,其中3表示一共查詢3    行。即第5、6、7行記錄。
SELECT * FROM emp LIMIT 4, 3;
// 一頁的記錄數:10行,查詢第3頁(公式:(當前頁-1) * 每頁記錄數)
select * from emp limit 20, 10;
  • 補充

7.3、DML語句

  1. 插入資料

  • INTERT INTO 表名(列名1,列名2, ...) VALUES(列值1, 列值2, ...);

在表名後給出要插入的列名,其他沒有指定的列等同與插入null值。所以插入記錄總是插入一行,不可能是半行。 在VALUES後給出列值,值的順序和個數必須與前面指定的列對應

  • INTERT INTO 表名 VALUES(列值1, 列值2)

沒有給出要插入的列,那麼表示插入所有列。 值的個數必須是該表列的個數。 值的順序,必須與表建立時給出的列的順序相同。

  • 批量新增資料,條件:資料表結構要一致

    • insert into 表名 select * from 表名;

在資料庫中所有的字串型別,必須使用單引,不能使用雙引!日期型別也要使用單引!

/*插入所有列*/
INSERT INTO stu(
  number, name, age, gender
)
VALUES(
  'ITCAST_0001', 'zhangSan', 28, 'male'
);

/* 插入部分列,沒有指定的列預設為NULL值*/
INSERT INTO stu(
  number, name
) VAKLUES(
  'ITCAST_0002', 'liSi'
)

/*不給出插入列,那麼預設為插入所有列!值的順序要與建立表時列的順序相同*/
INSERT INTO stu VALUES(
  'ITCAST_0003', 'wangWu', 82, 'female'
);
  1. 修改資料

  • UPDATE 表名 SET 列名1=列值1, 列名2=列值2, ... [WHERE 條件]

  • 條件(條件可選的):

條件必須是一個boolean型別的值或表示式:UPDATE t_person SET gender='男', age=age+1 WHERE sid='1'; 運算子:=、!=、<>、>、<、>=、<=、BETWEEN...AND、IN(...)、IS NULL、NOT、OR、AND

  1. 刪除資料

  • DELETE FROM 表名 [WHERE 條件];

  • TRUNCATE TABLE 表名:TRUNCATE是DDL語句,它是先刪除drop該表,再create該表。而且無法回滾!!!

7.4、DDL語句

1、資料庫

  • 檢視所有資料庫:SHOW DATABASES

  • 切換(選擇要操作的)資料庫:USE 資料庫名

  • 建立資料庫:CREATE DATABASE [IF NOT EXISTS] 資料庫名[CHARSET=utf8]

  • 刪除資料庫:DROP DATABASE [IF EXISTS] 資料庫名

  • 修改資料庫編碼:ALTER DATABASE mydb1 CHARACTER SET utf8

2、表

  • 建立表: CREATE TABLE [IF NOT EXISTS] 表名( 欄位名 資料型別 約束條件, 欄位名 資料型別 約束條件, ... 欄位名 資料型別 約束條件, );

  • 檢視當前資料庫中所有表名稱:SHOW TABLES;

  • 檢視指定表的建立語句:SHOW CREATE TABLE 表名(瞭解);

  • 查看錶結構:DESC 表名;

  • 刪除表:DROP TABLE 表名;

  • 修改表:字首:ALTER TABLE 表名

    • 修改之新增列: ALTER TABLE 表名 ADD ( 列名 列型別, 列名 列型別, ... );

    • 修改之修改列型別(如果被修改的列已存在資料,那麼新的型別可能會影響到已存在資料):ALTER TABLE 表名 MODIFY 列名 列型別;

    • 修改之修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 列型別;

    • 修改之刪除列:ALTER TABLE 表名 DROP 列名;

    • 修改表名稱:ALTER TABLE 原表名 RENAME TO 新表名;

7.5、資料庫約束

  • 作用:保證資料的完整性和合理性

  • MySQL支援四種約束

    • NOTNULL:非空約束,指定某列不能為空

    • UNIQUE:唯一 約束,指定某列或者幾列組合不能為空

    • PRIMARY KEY:主鍵約束,指定該列的值唯一地標識該條記錄

      • 主鍵必須包含唯一的值

      • 主鍵列不能包含NULL值

      • 每個表應該都一個主鍵,並且每個表只能有一個主鍵

      • 主鍵約束既可以使用列級約束,也可以使用表級約束

    • FOREIGN KEY:外來鍵約束,指定該行記錄從屬於主表中的一條記錄,主要用於保證參照完整性,語法:CONSTRAINT 外來鍵名 FOREIGN KEY(外來鍵列名) REFERENCES 關聯表名(關聯表的主鍵) ,eg:

      /*
      *教師表
      */
      CREATE TABLE Teacher(
      Tid VARCHAR(10) PRIMARY KEY,
      Tname VARCHAR(10));*
      
      /*
      *學生表
      */
      CREATE TABLE Student(
      Sid VARCHAR(6) PRIMARY KEY,
      Sname VARCHAR(10),
      Sage DATETIME,
      Ssex VARCHAR(10),
      STid VARCHAR(10),
      CONSTRAINT fk_Student_Teacher FOREIGN KEY(STid) REFERENCES Teacher(Tid) 
      );
      • 外來鍵必須是另一表的主鍵的值(外來鍵要引用主鍵!)

      • 外來鍵可以重複

      • 外來鍵可以為空

      • 一張表中可以有多個外來鍵

  • 約束寫法

    • 列級約束

    • 表級約束

7.6檢視用法

概述

檢視是一個虛擬表,是sql的查詢結果,其內容由查詢定義。同真實的表一樣,檢視包含一系列帶有名稱的列和行資料,在使用檢視時動態生成。

建立檢視

create view 檢視名 as select 欄位名 from 表名;

參考資料https://www.cnblogs.com/zzwlovegfj/archive/2012/06/23/2559596.html

7.7、索引用法

MySQL索引的建立對於MySQL的高效執行是很重要的,索引可以大大提高MySQL的檢索速度。

建立索引

CREATE INDEX 索引名 ON 表名 (column_name);

8、多表查詢

8.1、多表查詢分類

  • 合併結果集(瞭解)

  • 連線查詢

  • 子查詢

合併結果集

  • 要求被合併的表中,列的型別和列數相同

  • UNION,去除重複行

  • UNION ALL,不去除重複行

連線查詢分類

8.2、內連線

* 方言:SELECT * FROM 表1 別名1, 表2 別名2 WHERE 別名1.xx=別名2.xx
* 標準:SELECT * FROM 表1 別名1 INNER JOIN 表2 別名2 ON 別名1.xx=別名2.xx
* 自然:SELECT * FROM 表1 別名1 NATURAL JOIN 表2 別名2
* 內連線查詢出的所有記錄都滿足條件。

8.3、外連線

  • 左外

SELECT * FROM 表1 別名1 LEFT OUTER JOIN 表2 別名2 ON 別名1.xx=別名2.xx

左表記錄無論是否滿足條件都會查詢出來,而右表只有滿足條件才能出來。左表中不滿足條件的記錄,右表部分都為NULL

  • 左外自然

SELECT * FROM 表1 別名1 NATURAL LEFT OUTER JOIN 表2 別名2 ON 別名1.xx=別名2.xx
  • 右外

SELECT * FROM 表1 別名1 RIGHT OUTER JOIN 表2 別名2 ON 別名1.xx=別名2.xx

右表記錄無論是否滿足條件都會查詢出來,而左表只有滿足條件才能出來。右表不滿足條件的記錄,其左表部分都為NULL

  • 右外自然

SELECT * FROM 表1 別名1 NATURAL RIGHT OUTER JOIN 表2 別名2 ON 別名1.xx=別名2.xx
  • 全連結:可以使用UNION來完成全連結

8.4、子查詢

查詢中有查詢(檢視select關鍵字的個數!)

1、子查詢出現的位置:

* where後作為條件存在
* from後作為表存在(多行多列)

2、子查詢條件

  • 單行單列

SELECT * FROM 表1 別名1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 別名2 WHERE 條件)
  • 多行單列

SELECT * FROM 表1 別名1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 別名2 WHERE 條件)
  • 單行多列

SELECT * FROM 表1 別名1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 別名2 WHERE 條件)
  • 多行多列

SELECT * FROM 表1 別名1 , (SELECT ....) 別名2 WHERE 條件
  • 多表查詢時的條件順序

    • where

    • group by

    • having

    • order by

    • limit

9、事務管理

MySQL 事務主要用於處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你刪除一個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!

9.1、事務的四大特徵(ACID)

  • 原子性(atomicity):一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

  • 一致性(consistency):在事務處理執行前後,資料庫是一致的(資料庫資料完整性約束)。

  • 隔離性(isolcation): 資料庫允許多個併發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致資料的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(Serializable)。

  • 持續性(durability):事務處理結束後,對資料的修改就是永久的,即便系統故障也不會丟失。

9.2、MYSQL 事務處理的兩種方法

在 MySQL 命令列的預設設定下,事務都是自動提交的,即執行 SQL 語句後就會馬上執行 COMMIT 操作。因此要顯式地開啟一個事務務須使用命令 BEGIN 或 START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。

1、用 BEGIN, ROLLBACK, COMMIT來實現

  • BEGIN 開始一個事務

  • ROLLBACK 事務回滾

  • COMMIT 事務確認

2、直接用 SET 來改變 MySQL 的自動提交模式:

  • SET AUTOCOMMIT=0 禁止自動提交

  • SET AUTOCOMMIT=1 開啟自動提交