MySQL學習記錄

什麼是數據庫?

數據庫Database是按照數據結構來組織、存儲和管理數據的倉庫。常見的數據庫有OracleDB2SQL ServerMySQL等...php

MySQL是一個關係型數據庫管理系統,開源免費,由瑞典MySQL AB公司開發,目前屬於Oracle旗下產品。mysql

相關術語
DB(Database):數據庫是存儲數據的集合。
DBS(Database System):數據庫系統,由數據庫和數據庫管理軟件組成。
DBMS(Database Management System):數據庫管理系統,是操做和管理數據庫的一個系統。
SQL(Structured Query Language):結構化查詢語言,是數據庫的程序設計語言sql

MySQL相關命令行操做數據庫

配置文件:my.cnf
登陸信息中須要注意的:
---命令行須要以';'或者是'\g'結尾,否則沒法結束;
---能夠經過'help'或者'\h'或者'?'加上相關關鍵字來查看手冊;
---'\c'能夠取消當前命令的執行;

mysql -uroot -p[密碼]            #登陸MySQL
mysql -uroot -p -D db_name      #登陸MySQL的同時打開數據庫
exit;                        #退出MySQL
quit;                        #退出MySQL
\q;                            #退出MySQL
ctrl+c                        #退出MySQL

#獲取當前MySQL的版本號
mysql -V;
mysql --version;

SQL語句語法規範數組

  • 經常使用MySQL的關鍵字須要大寫,庫名、表名、字段名稱等使用小寫;
  • SQL語句支持折行操做,拆分的時候不能把完整單詞拆開;
  • 數據庫名稱、表名稱、字段名稱不能使用MySQL的保留字,若是必需要使用,須要用反引號;

經常使用SQL語句
SELECT USER(); #獲得登陸的用戶
SELECT VERSION(); #獲得MySQL的版本信息
SELECT NOW(); #獲得當前的日期時間
SELECT DATABASE(); #獲得當前打開的數據庫緩存

SQL的註釋數據結構

#註釋內容
--註釋內容

數據庫SQL操做併發

#建立數據庫
CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name;
CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name DEFAULT CHARACTER SET [=] 'charset'; #指定編碼格式
--注意:數據庫名稱最好有意義,名稱不要包含特殊字符或者是MySQL關鍵字。

#修改數據庫的編碼方式
ALTER DATABASE db_name DEFAULT CHARACTER SET [=] 'charset';

#刪除數據庫
DROP DATABASE [IF EXISTS] db_name;

#打開指定數據庫
USE db_name;    #在操做數據庫裏面的表以前須要先打開數據庫

#SHOW方法
SHOW DATABASES|SCHEMAS;                            #查看所有的數據庫
SHOW CREATE DATABASE db_name;                 #查看數據庫的詳細信息(編碼格式)
SHOW WARNINGS;                                   #查看上一步操做產生的警告信息


#MySQL註釋
'#'註釋內容
'--'註釋內容

數據表SQL操做
數據庫表是一系列二維數組的集合,用來表明和存儲數據對象之間的關係,是數據庫最重要的組成部分之一。
數據保存在表中,表名要求惟一,不要包含特殊字符,最好含義明確函數

  • 主鍵:指的是一個列或多列的組合,其值能惟一地標識表中的每一行,一個表中只能有一個主鍵。主鍵主要是用於其餘表的外鍵關聯,以及本記錄的修改與刪除。
  • 外鍵:若是公共字段在一個表中是主鍵,那麼這個字段被稱爲另外一個表的外鍵,一個表中能夠有多個外鍵。外鍵保持數據一致性和完整性,主要目的是控制存儲在外鍵表中數據,使兩張表造成關聯,外鍵只能引用外表中的列的值或者使用空值。
  • 索引:對錶中一列或者多列的值進行排序的一種結構,使用索引可快速訪問表中的特定信息,一個表中能夠有多個索引。索引的主要目的是加快檢索表中數據的方法。

表結構相關操做:工具

#建立表
CREATE TABLE[IF NOT EXISTS] table_name( 
   字段名稱1 字段類型[完整性約束條件],
   字段名稱2 字段類型[完整性約束條件],
   ...
)ENGINE=存儲引擎 CHARSET=編碼方式;
    
#刪除表
DROP TABLE [IF EXISTS] table_name;
    
#查看錶的建立信息
SHOW CREATE TABLE table_name;
    
#查看當前數據庫下全部的表
SHOW [FULL] TABLES [{FROM|IN} db_name];
    
#查看錶結構
DESC table_name;                      
DESCRIBE table_name;
SHOW COLUMNS FROM table_name;
    
#添加字段
ALTER TABLE table_name ADD 字段名稱 字段屬性[完整性約束條件] [FIRST|AFTER 字段名稱]; 
    
#刪除字段
ALTER TABLE table_name DROP 字段名稱;
    
#添加默認值
ALTER TABLE table_name ALTER 字段名稱 SET DEFAULT 默認值;
    
#刪除默認值
ALTER TABLE table_name ALTER 字段名稱 DROP DEFAULT;
    
#修改字段類型、字段屬性
ALTER TABLE table_name MODIFY 字段名稱 字段類型[字段屬性] [FIRST|AFTER 字段名稱]
    
#修改字段名稱、字段類型、字段屬性
ALTER TABLE table_name CHANGE 原字段名稱 新字段名稱 字段屬性 [FIRST|AFTER 字段名稱]
    
#添加主鍵
ALTER TABLE table_name ADD PRIMARY KEY(字段名稱)
    
#刪除主鍵
ALTER TABLE table_name DROP PRIMARY KEY;
    
#添加惟一
ALTER TABLE table_name ADD UNIQUE KEY|INDEX [index_name](字段名稱)  --若是不添加index_name,則索引名稱默認爲字段名稱
    
#刪除惟一
ALTER TABLE table_name DROP INDEX index_name;
    
#修改數據表名稱
ALTER TABLE table_name RENAME [TO|AS] new_table_name;
RENAME TABLE table_name TO new_table_name;

關鍵字含義
UNSIGNED:無符號,沒有負數,從0開始
ZEROFILL:零填充,當數據顯示長度不夠的時候可使用前補0的效果填充至指定長度
NOT NULL:非空約束,也就是插入值的時候這個字段必需要給值
DEFAULT:默認值,若是插入記錄的時候沒有給字段賦值,則會使用默認值
PRIAMARY KEY:主鍵,標識記錄的惟一性,值不能重複,一個表只能有一個主鍵
UNIQUE KEY:惟一性索引,一個表中能夠有多個字段是惟一索引,一樣的值不能重複,可是NULL除外
AUTO_INCREASE:自動增加,只能用於數值列,並且配合索引或主鍵使用
FOREIGN KEY:外鍵約束
COMMENT:添加註釋

#設置主鍵的兩種方式
CREATE TABLE test_primarykey(id INT UNSIGNED PRIMARY KEY, username VARCHAR(20));        #直接在字段後面設置屬性
CREATE TABLE test_primarykey1(id INT UNSIGNED, username VARCHAR(20), PRIMARY KEY(id));     #利用函數設置字段

MySQL數據類型

  • 數值型

    • 整數型TINYINT SMALLINT MEDIUMINT INT BIGINT BOOL/BOOLEAN
    • 浮點數FLOAT DOUBLE DECIMAL
    • 定點數
  • 字符串類型CHAR(M) VARCHAR(M) TINYTEXT TEXT MEDIUMTEXT LONGTEXT ENUM('', ''...) SET('', ''...)
  • 日期時間類型

CHARVARCHAR的比較:
CHAR是定長,VARCHAR變長;
CHAR效率高於VARCHARCHAR至關於拿空間換時間,VARCHAR拿時間換空間;
CHAR默認存儲數據的時候,後面會用空格填充到指定長度,而在檢索的時候會去掉後面空格,VARCHAR不會進行填充,檢索的時候尾部的空格會留下。
注意:TEXT類型的字段不能有默認值,檢索的時候不存在大小寫轉換。

MySQL中經常使用函數
COUNT()語法:
COUNT(column_name):返回指定列的值的數目
COUNT(*):返回表中的記錄數目
COUNT(DISTINCT column_name):返回指定列的不一樣值的數目

CONCAT()語法:
CONCAT():用於將多個字符串鏈接成一個字符串。
用法:CONCAT(str1, str2, …),返回結果爲鏈接參數產生的字符串,若是任何一個參數爲NULL,則返回爲NULL
CONCAT_WS():用一個分隔符將多個字符串鏈接成一個字符串
用法:CONCAT_WS(separator, str1, str2, …),若是分隔符爲NULL,則返回爲NULL

MySQL存儲引擎
MyISAM存儲引擎

  • 默認MyISAM的表會在磁盤中產生三個文件:.frm .MYD .MYI
  • 能夠在建立表的時候指定數據文件和索引文件存儲位置
  • MyISAM單表最大支持的數據量2的64次方條記錄
  • 每一個表最多能夠創建64個索引
  • 若是是複合索引,每一個複合索引最多包涵16個列,索引值最大長度是1000B
  • MyISAM引擎的存儲格式:定長FIXED、動態DYNAMIC、壓縮COMPRESSED

InnoDB存儲引擎

  • 設計遵循ACID模型Atomicity原子性、Consistency一致性、Isolation隔離性、Durability持久性,支持事務,具備從服務崩潰中恢復的能力,可以最大限度保護用戶的數據
  • 支持行級鎖,能夠提高多用戶併發時的讀寫性能
  • 支持外鍵,保證數據的一致性和完整性
  • InnoDB擁有本身獨立的緩衝池,經常使用的數據和索引都在緩存中

記錄SQL操做

添加記錄

#一條記錄用VALUE,多條記錄用VALUES
INSERT [INTO] table_name[(col_name1, col_name2...)] VALUE|VALUES(value1, value2...);

#不列出字段名稱[須要按照建表時的字段順序給每個字段賦值]
INSERT [INTO] table_name VALUE(value1, value2...);

#一次添加多條記錄
INSERT [INTO] table_name[(col_name1, col_name2...)] VALUES(value1, value2...), (value1, value2...),...;

#INSERT...SET語句
INSERT [INTO] table_name SET 字段名稱=值,...;

#INSERT...SELECT語句
INSERT [INTO] table_name SELECT 字段名稱,... FROM table_name [WHERE條件語句];

修改記錄

UPDATE table_name SET 字段名稱1=值1, 字段名稱2=值2,... [WHERE條件語句];

刪除記錄

DELETE FROM table_name [WHERE條件語句];

查詢記錄

# DESC:指定列按降序排列  ASC:指定列按升序排列
# GROUP BY:分組,把值相同放到一個組裏,最終查詢出的結果只會顯示組中一條記錄,分組配合GROUP_CONCAT()查看組中某個字段的詳細信息
# ORDER BY:設置記錄按照某字段的值進行排序,默認ASC升序
# LIMIT:限制結果集的顯示條數,能夠用來實現分頁
        LIMIT 數字:顯示結果集的前幾條記錄
        LIMIT offset, row_count:從offset開始[offset從0開始],顯示幾條記錄
SELECT 字段1, 字段2,... FROM table_name [WHERE條件語句] [GROUP BY(col_name) Having 二次篩選] [ORDER BY(col_name) DESC|ASC] [LIMIT 限制結果集的顯示條數];

#查詢全部記錄的全部字段
SELECT * FROM table_name;

#查詢指定字段的信息
SELECT 字段名稱1, 字段名稱2,... FROM table_name [WHERE條件語句];

#查詢某數據庫下某表的記錄[這樣能夠不用打開該數據庫就能操做該表]
SELECT 字段名稱1, 字段名稱2,... FROM db_name.table_name [WHERE條件語句];

#給字段取別名[別名名稱可使用中文]
SELECT 字段名稱 [AS] 別名名稱,... FROM table_name [WHERE條件語句];

#給表取別名[單張表沒有太大做用,多張表才體現]
SELECT 字段名稱1, 字段名稱2,... FROM table_name [AS] 別名 [WHERE條件語句];

#表名.字段名稱[單張表沒有太大做用,多張表才體現]
SELECT table_name.字段名稱,... FROM table_name [WHERE條件語句]

#WHERE條件[篩選符合條件的記錄]
比較運算符:> < >= <= != <> <=>
邏輯運算符:AND(邏輯與) OR(邏輯或)
IS [NOT] NULL:檢測值是否爲NULL或者NOT NULL
指定範圍:[NOT] BETWEEN...AND
指定集合:[NOT] IN(值1, 值2,..)
匹配字符:[NOT] LIKE
        %:任意長度的字符串
        _:任意一個字符
        
#模糊查詢
在執行數據庫查詢時,分爲完整查詢和模糊查詢。
格式:SELECT 字段1, 字段2,.. FROM table_name WHERE 某字段 LIKE 條件;

模糊查詢包涵兩種通配符:
%:表示0個或多個字符,能夠匹配任意類型或任意長度的字符。
LIKE '%王':匹配的是字段結尾爲'王'的全部記錄;
LIKE '王%':匹配的是字段開頭爲'王'的全部記錄;
LIKE '%王%':匹配的是字段包含'王'的全部記錄;

_:表示任何單個字符,匹配單個任意字符,它經常使用來限制表達式的字符長度。
LIKE '_王':匹配的是字段長度爲2,而且結尾爲'王'的全部記錄;
LIKE '王_':匹配的是字段長度爲2,而且開頭爲'王'的全部記錄;
LIKE '_王_':匹配的是字段長度爲3,而且中間爲'王'的全部記錄;

#經常使用聚合函數
COUNT():統計記錄總數
SUM():求和
MAX():求最大值
MIN():求最小值
AVG():求平均值

#產生隨機數
SELECT RAND();

#實現隨機記錄[出現的記錄排序是隨機的]
SELECT * FROM table_name ORDER BY RAND();


#測試完整SELECT語句的形式
MariaDB [test004]> SELECT GROUP_CONCAT(name) AS '姓名', COUNT(*) AS '人數', SUM(age) AS '總和', MAX(age) AS '最大', MIN(age) AS '最小', AVG(age) AS '平均' FROM user WHERE id >=1 GROUP BY address ORDER BY '總和';

多表查詢

1. 笛卡爾積形式
笛卡爾積是多表鏈接組成一個新表的狀況,全部的鏈接方式都會先生成臨時笛卡爾積表,笛卡爾積是關係代數裏的一個概念,表示兩個表中的每一行數據任意組合,新表的記錄數爲多張表的記錄條數的乘積,實際應用中通常不知足需求,只有在兩個錶鏈接時加上限制條件,纔有實際的意義。

test1                   test2
+------+--------+        +------+--------+
| id   | name   |        | id   | name   |
+------+--------+        +------+--------+
|    1 | 小紅   |           |    1 | 張三   |
|    2 | 小明   |           |    2 | 李四   |
+------+--------+        +------+--------+

MariaDB [test005]> select a.*, b.* from test1 a, test2 b;
+------+--------+------+--------+
| id   | name   | id   | name   |
+------+--------+------+--------+
|    1 | 張三   |    1 | 小紅   |
|    2 | 李四   |    1 | 小紅   |
|    1 | 張三   |    2 | 小明   |
|    2 | 李四   |    2 | 小明   |
+------+--------+------+--------+


2. 內鏈接形式(經常使用)
利用內鏈接可獲取兩表的公共部分的記錄
SELECT 字段名稱,... FROM  table_name1 INNER JOIN table_name2 ON 鏈接條件

3. 外鏈接形式
左外鏈接:以左表爲主,先顯示左表中的所有記錄,再去右表中查詢知足複合條件的記錄,不符合的以NULL代替
SELECT 字段名稱,... FROM table_name1 LEFT [OUTER] JOIN table_name2 ON 鏈接條件

右外鏈接:以右表爲主,先顯示右表中的所有記錄,再去左表中查詢知足複合條件的記錄,不符合的以NULL代替
SELECT 字段名稱,... FROM table_name1 RIGHT [OUTER] JOIN table_name2 ON 鏈接條件

圖形化工具管理數據庫

B/S結構
phpMyAdmin

C/S結構
Sequel Pro
Navicat for MySQL
MySQL workbench
相關文章
相關標籤/搜索