MySQL基本操作

MySQL From Ubuntu

Preface *Jack Lee*

首先MySQL是一種數據庫(Database)管理軟件.

所以MySQL是用來管理若干數據庫, 數據庫中存放的是若干數據表(Table),

數據表以一種類似於Execl表格的形式來存放數據. 數據表中的每一條數據都是一行.

一張數據表中每一列可以存放一種類型的數據, 那麼數據表就能夠存放各種類型的數據, 如存放用戶信息, 用戶的名字, 用戶的年齡, 用戶的聯繫方式等.

而數據表中的每一列稱爲字段(Column), 我們可以在創建表的時候設置上對應的字段名和字段類型來應對需要存入的各種數據的類型.

  • 語句結束符: 每個語句都以 ; 或 \G 結束.

  • 大小寫: MySQL不嚴格區分大小寫.

  • 類型: 強制數據類型, 任何數據都有自己的類型.

  • 逗號: 最後一列不需要逗號, 換行繼續輸入可以使用逗號.

Install & Deploy

# 獲取更新.
sudo apt-get update
# get MySQL
sudo apt-get instal mysql-server
# 配置信息, 配置密碼, 禁止默認登陸.
sudo mysql_secure_installation
# 查看服務狀態.
sudo /etc/init.d/mysql status

Getting Start

# 進入MySQL
mysql -uusername -pppassword
# 進入遠程MySQL
mysql -hip -Pport -uusername -ppassword
# 退出MySQL or quit;
exit;
# 創建用戶, %表示任意遠程鏈接.
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
# 設置用戶權限, 將幾乎所有庫表權限都給username.
GRANT ALL ON *.* TO 'username'@'%';
# 查看MySQL用戶.
SELECT host, user FROM mysql.user;
# 查看當前登陸用戶.
SELECT USER();
# 刷新.
FLUSH PRIVILEGES:
# 查看當前的時間.
SELECT NOW();

Library Operation

# 查看MySQL的庫.
SHOW DATABASES;
# 創建庫.
CREATE DATABASE base_name;
# 查看庫的創建信息.
SHOW CREATE DATABASE base_name;
# 創建庫時指定編碼.
CREATE DATABASE base_name CHARSET utf8;
# 刪除庫(當然一般不會這麼做).
DROP DATABASE base_name;
# 先判斷庫是否存在再刪除.
DROP DATABASE IF EXISTS base_name;
# 在任意位置切換到指定庫中.
USE base_name;
# 查看當前所在庫. 如果是null, 表示爲根.
SELECT DATABASE();

Table Operation

# 查看數據庫中的表.
SHOW TABLES;
# 創建表.
CREATE TABLE tb_name(column_name1 INT, ...);
# 查看錶創建時的結構.
SHOW CREATE TABLE tb_name;
# 刪除表(當然一般也不會這麼做).
DROP TABLE tb_name;

字段常用類型:

  • INT: 整型.
  • DOUBLE(4, 2): 雙精度浮點型. 4表總長, 2表小數位.
  • DATETIME: 時間日期類型.
  • VARCHAR(20): 不定長字符類型. 20表接收數據的最長長度.
  • CHAR(4): 定長字符類型. 4表接收數據的最長長度.
  • TEXT: 不定長文本類型.
  • DATE: 日期類型.
  • BOOL: bool類型.

DATA CRUD

  • C(Create): 插入數據.
# 多次插入數據不如一次插入快.
# 指定字段名插入單條數據.
INSERT INTO tb_name(col_name1, ...) VALUE (col_value1, ...);
# 不指定字段名插入單條數據即爲表中的每個字段插入數據.
INSERT INTO tb_name VALUE (col_value1, ...);
# 插入多條數據.
INSERT INTO tb_name VALUES (col_value1, ...), (col_value1, ...), ...;
# 細緻插入單條數據.
INSERT INTO tb_name SET col_name1=col_value1, ...;
  • R(Read): 查詢數據.
# 查看指定表全部數據.
SELECT * FROM tb_name;
# 查看指定表的指定字段的數據.
SELECT col_name1, ... FROM tb_name;
# 對數據進行篩選. condition: col_name1=value1
SELECT col_name1, ... FROM tb_name WHERE condition1;
  • U(Update): 更新數據.
# 更新數據, 更細的時候需要有最基本的篩選條件, 不然會更新全表指定字段數據.
UPDATE tb_name SET col_name1=col_value1 WHERE condition1;
  • D(Delete): 刪除數據.
# 刪除數據, 當然正常情況我們寧願寫明廢棄數據也不會刪除.
DELETE FROM tb_name WHERE condition1;

條件(condition): 如col_name1=‘hah’

條件符 含義 實例
= 等於 name=‘Stephen’
<=, >= 小於等於, 大於等於 id<=20
<, > 小於, 大於 age<18
!=, <> 不等於 gender<>‘man’
IS NULL 判斷爲空 name IS NULL
IS NOT NULL 判斷爲非空 name IS NOT NULL
AND, OR, NOT 邏輯與或非 name=‘Stephan’ OR name=‘Jack Lee’

Subquery & JOIN Query

# 我們可把查詢返回的結果當成另一張表(雖然只是數據, 但是可以這樣去使用).
# 子查詢是把一條SQL語句返回的結果來當作條件或者表使用.
# MySQL中表和表之間是可以有關係.
# 如果我們通過表關係來查詢一些信息出來可以使用子查詢.
SELECT * FROM tb_name1 WHERE col1=(SELECT col2 FROM tb_name2 WHERE condition1);
# 查詢出col1等於col2的tb_name1的數據.

JOIN:

# 連接查詢是把一個表裏的每一條數據和另一個表裏的每一條數據進行匹對.
# 所以如果A, B表有10條數據, 那麼整合後就是100條數據.
# 連接查詢.
SELECT * FROM tb_name1 JOIN tb_name2;
# 連接查詢加篩選.
SELECT * FROM tb_name1 JOIN tb_name2 ON tb_name1.name1=tb_name2.name2;
# 嵌套連接查詢.
SELECT * FROM (tb_name1 JOIN tb_name2 ON tb_name1.name1=tb_name2.name2) JOIN tb_name3;

篩選條件優先級:

  • WHERE: 最高
  • ON: 其次
  • HAVING: 最後

Column & Constraint

  • DEFAULT value: 設置字段默認值
CREATE TABLE tb_name(id INT DEFAULT 10);
  • NOT NULL: 默認非空
CREATE TABLE tb_name(name VARCHAR(20) NOT NULL);
  • UNIQUE KEY: 唯一鍵, 不重複.
CREATE TABLE tb_name(
    age CHAR(4),
    UNIQUE KEY (age)
);
  • PRIMARY KEY: 主鍵, 非空且唯一.
CREATE TABLE tb_name(
	id INT,
    PRIMARY KEY (id)
);
  • AUTO_INCREMENT: 自增長, 配合主鍵使用.
CREATE TABLE tb_name(
	auto_id INT AUTO_INCREMENT,
    PRIMARY KEY (auto_id)
);
  • 外鍵(FOREIGN KEY (col1) REFERENCES tb_name(col2)): 將兩個表的字段進行聯繫. 外國的(foreign), 參考(references).
CREATE TABLE tb_c(
	c_col INT,
    PRIMARY KEY (c_col)
);
CREATE TABLE tb_d(
	d_col INT,
    FOREIGN KEY (d_col) REFERENCES tb_c(c_col)
);
  • 表結構查看
    • DESC tb_name;: 查看錶中的字段及其類型.
    • SHOW KEYS FROM tb_name;: 查看錶中設置的鍵.

DATA Filter

  • 篩選: BETWEEN和IN
# 獲取數值17到20之間的數據. 等同16<=col_name1<=20
SELECT * FROM td_name WHERE col_name1 BETWEEN 17 AND 20;
# 第二種形式.
SELECT * FROM td_name WHERE col_name1 in (17, 20);
  • LIKE: 模糊匹配
    • %: 匹配任意多個字符.
    • _: 匹配一個字符.
# 如果name字段中有'傑克.李'這樣的一條數據.
# 匹配這個名字.
SELECT * FROM tb_name WHERE name LIKE '傑克%';
# 或者這樣
SELECT * FROM tb_name WHERE name LIKE '傑克__';
  • ORDER BY: 排序.
    • ASC: 正序(默認).
    • DESC: 倒序.
# 更具某個字段進行倒序.
SELECT * FROM tb_name ORDER BY col1 DESC;
  • DISTINCT: 去重.
# 以每條數據爲標準, 去除重複的數據.
SELECT DISTINCT col1, col2 FROM tb_name;
  • 聚合
    • COUNT(*): 計算數據總量.
    • MAX(column): 數據中最大值.
    • MIN(column): 數據中最小值.
    • SUM(column): 數據數值和.
    • AVG(column): 數據數值平均值.
SELECT COUNT(*) FROM tb_name;
  • GROUP BY: 分組
# 將每表中的某字段中的數據進行分組即數據相同的分在一起.
SELECT col1, AVG(col2) FROM tb_name GROUP BY col1;
# 上面這條語句是把col1字段的數據進行分組, 然後把分組了的數據對應的col2字段的數據進行求平均值.
# 給分組加上條件.
SELECT col1, COUNT(*) FROM tb_name GROUP BY col1 HAVING COUNT(*)>4;
# 上面這個語句表示將col1字段中的數據進行分組, 然後計算分組的數據總數, 並把總數大於4的分組返回回來.

DATA LIMIT

# 可以使用限制來進行分頁等功能.
# 返回前3條數據.
SELECT * FROM tb_name LIMIT 3;
# 從位置爲3(前)的位置開始取3(後)條數據. 第一條數據的位置爲0.
SELECT * FROM tb_name LIMIT 3, 3;

DATA AS

  • AS: 別名, 有各種用途.
# 將查詢出來的字段進行別名.
SELECT col1 AS 字段1 FROM tb_name;
# 能不能將子查詢的結果再進行查詢返回呢?
# SELECT * FROM (SELECT * FROM tb_name WHERE condition1);
# 然後會報錯, 需要我們給別名, 因爲我們想要查詢的子查詢的結果並沒有名字, 所以需要我們給.
SELECT * FROM (SELECT * FROM tb_name WHERE condition1) AS new_name;

DATA VIEW

  • VIEW: 視圖類似於鏡子, 將表的數據映射出來, 表發生變化那麼視圖就會發生變化, 視圖不是真的表.
# 將條件查詢得到的結果映射到視圖, 需要給視圖名字.
# 簡單來說就是視圖會映射一條SQL語句的結果.
# 通常我們也不會給視圖添加數據或者修改.
CREATE VIEW view_name AS SELECT * FROM tb_name;
# 查看視圖.
SELECT * FROM view_name;

TABLE MODIFY

  • ALTER TBALE: 正常情況下, 我們創建一個表的時候就應該定義好結構, 而不是在後面大量的整改.
# 添加一列(字段)到表結構中.
ALTER TABLE tb_name ADD COLUMN new_col INT;
# 將新的字段添加到開頭.
ALTER TABLE tb_name ADD COLUMN new_col BOOL NOT NULL DEFAULT TRUE FIRST;
# 將新的字段添加到指定字段的後面.
ALTER TABLE tb_name ADD COLUMN new_col VARCHAR(20) AFTER col1_name;
# 刪除指定字段(當然我們一般不會刪除).
ALTER TABLE tb_name DROP COLUMN old_col;
# 修改字段的類型或者約束, 甚至是位置.
ALTER TABLE tb_name MODIFY COLUMN old_col INT NOT NULL AFTER col1_name;
# 修改字段的名字, 當然在修改的時候需要指定其類型或約束.
ALTER TABLE tb_name CHANGE COLUMN old_col_name new_col_name CHAR(4) NOT NULL;
  • 添加或者刪除約束鍵.
# 給字段添加主鍵.
ALTER TABLE tb_name ADD PRIMARY KEY (col1_name);
# 給字段添加唯一鍵.
ALTER TABLE tb_name ADD UNIQUE KEY (col1_name);
# 刪除主鍵.
ALTER TABLE tb_name DROP PRIMARY KEY;
# 刪除唯一鍵. 這裏的key_name是鍵名, 通過查看錶結構可以知曉.
ALTER TABLE tb_name DROP KEY key_name;
  • 無功能鍵(索引): 給字段添加索引, 在查詢的時候會加快速度, 但是添加索引會消耗資源.
# 給字段添加索引
ALTER TABLE tb_name ADD KEY (col_name);
# 刪除字段索引, 這裏的key_name是索引的名字, 可以用過表結構知曉
ALTER TABLE tb_name DROP KEY key_name;

Python & MySQL >>> PyMySQL

import pymysql


db_config = {
    'host': '127.0.0.1', 	# 需要連接ip
    'port': 3306			# 默認端口3306
    'user': 'username',		# 用戶名.
    'password': 'password',	# 用戶密碼
    'db': 'db_name',		# 進入的數據庫名.
    'charset': 'utf8'		# 編碼方式.
}
							# 解包.
conn = pymysql.connect(**db_config)
cur = conn.cursor()			# create cursor.
try:
	sql = 'SELECT * FROM students'	
	rv = cur.execute(sql)	# execute, rv接收行數.
	resp = cur.fetchall()	# 接收展示內容.
	a = [print(entry) for entry in resp]
except Exception as e:
	print(e)
	conn.rollback()			# 相當於撤銷, 如果失敗就回滾. 
finally:
	conn.commit()			# 提交修改的數據.
	cur.close()				# 關閉遊標. 
	conn.close()			# 關閉conn.

Ubuntu To Remote MySQL

# 網絡互通, mysql服務正常.
# 但是win的mysql無法遠程到ubuntu.
# 創建好mysql的用戶和權限.
# 然後修改一個文件.
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 重啓mysql服務.
sudo /etc/init.d/mysql restart

mysqld.cnf修改內容:

  • bind-address修改爲0.0.0.0: 表示爲任何IP訪問.
  • bind-address註釋掉: 簡單粗暴.
  • bind-address修改爲指定IP: 表示指定的IP是可以訪問的.
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address		= 127.0.0.1

Ubuntu MySQL ENCODE

# 在MySQL中查看默認編碼.
SHOW VARIABLES LIKE '%character%';
# 來把MySQL的編碼修改爲UTF-8.
# 修改好了後, 重啓mysql服務.
# sudo /etc/init.d/mysql restart
  • 通過查看/etc/mysql/my.cnf可以看到兩個目錄.
    • (1) 修改/etc/mysql/mysql.conf.d/mysqld.cnf文件
    • (2) 修改/etc/mysql/conf.d/mysql.cnf文件
# (1)
[mysqld]
skip-external-locking
# 添加下面這行配置.
character-set-server = utf8
# (2)
[mysql]
# 添加下面這行配置.
default-character-set = utf8

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章