MySQL學習(一)-基本知識

目標

  • 如何使用Mysql
  • 如何設計MySQL

簡介

什麼是數據庫?

DB, DBMS, DBApython

定義: 對大量信息進行高效管理的解決方案,按照必定數據結構進行數據的組織、存儲和管理數據的庫。mysql

關係型數據庫?

創建在關係模型上的數據庫系統sql

關係模型

定義
  • 數據結構能夠規定,同類數據,結構一致,就是一個二維表格
  • 數據之間的關係能夠設置,實體之間能夠聯繫

如平常生活中,學生管理系統,將實體(學生)和實體屬性(學號、性別、姓名)保存在數據中,應該如何處理實體結構數據庫

基本概念
  1. 數據庫
    數據的倉庫

  2. 數據保存在表內,同一個表內的數據,具備相同的數據格式
  3. 行&列
    行用於記錄數據
    列用於定義數據格式
  4. 記錄
    行裏面的數據
  5. 字段
    數據的某一個列
  6. SQL
    數據庫管理系統用於管理數據的語言,結構化查詢語言
MySQL
  1. 數據庫
  2. 如何向數據庫系統發送指令

MySQL是基於C/S架構的。安全

Nosql

Not Only SQL, 非關係型數據庫系統,如mongoDB,MemBase服務器

ORM

面向對象模型的關係映射數據結構

安裝使用

安裝

  1. 選擇Custom

配置嚮導

啓動

  1. 啓動和中止服務
net start service-name
net stop service-name
  1. 直接使用mysqld.exe直接運行mysql程序

鏈接認證

C:\Users\GeneJiang>mysql -hlocalhost -P3306 -uroot -p

-h: 服務器名
-P: 端口號
-u:用戶名
-p:密碼架構

SQL

分類

  • DML, 數據操做語言(操做數據)
    • 查詢 DQL
    • 管理: 增、刪、改 DML
  • DDL, 數據定義語言(定義格式)
  • DCL, 數據庫控制語言(對數據庫軟件服務進行操做)

數據庫操做

建立數據庫
  1. 語法
Create database db_name(數據庫選項);
  1. 幾點說明
  • 分號結束
  • 命名規則
    • 見名知意
    • 使用下劃線方式
    • 可使用任意字符,可是一些特殊的,如純數字、特殊符號, 如用特殊符號和關鍵字要加上 限定符:反引號 `
    • 關鍵字注意區分
    • 中文能夠,可是不建議使用
  1. 存儲方式

在硬盤上,建立數據庫就是建立一個目錄,目錄名就是數據庫名。目錄內存在一個db.opt文件,用於保存數據庫屬性選項信息。nosql

  1. Example
-- 建立數據庫

CREATE DATABASE php_1;
CREATE DATABASE `1234`;
CREATE DATABASE `CREATE`;
CREATE DATABASE `傳播智客`;
數據庫查詢

1.語法

SHOW DATABASES;

mysql也有用於維護本身的數據庫

數據庫內容查看

1.語法

SHOW CREATED db_name;
數據庫刪除
  1. 語法
DROP DATABASE db_name;
數據庫修改
  1. 語法
ALTER DATABASE db_name [修改指令];
數據庫重命名-沒有命令直接操做
  • 直接修改目錄名
  • 新建數據庫,將數據庫內容直接備份一份

表操做

簡介

表是數據的容器,數據庫是是表的容器,表必須屬於一個數據庫,進行表操做時候,必需要指定數據庫

建立表
  1. 語法
CREATE TABALE table_name(列結構) 表選項();
  1. 說明
  • 先分析實體的屬性,這些屬性如何保存
  • 如班級:班級班號,班級的日期
  • 列定義
    • 列名 數據類型(列的屬性 約束)
    • 簡單數據類型
      • vchar(字符數)
      • 時間類型 date
  • 指定數據庫
    • db_name.table_name();
    • use db_name;
  • 特殊字符的數據庫名,用``標識
  • 同一個數據庫中,若是要使用兩個應用,建議用前綴進行區分。
  1. example
CREATE TABLE python_class(
    class_no varchar(20),
    date_start date
);
查看錶
  1. 語法
SHOW TABLES table_name;
SHOW TABLES [like 'Pattern'];

SHOW CREATE TABLE table_name;
SHOW CREATE TABLE table_name\G

DESCRIBE table_name;
DESC table_name;
  1. 說明
  • 用pattern來快速的查找表
  • 通配符
    • % - 任意字符的任意次數的組合
  • 存儲結構以*.frm關鍵字結束
  1. example
CREATE TABLE info_student(
    name varchar(20),
    stu_no varchar(2)
);

CREATE TABLE exam_student(
    name varchar(20),
    stu_no varchar(2),
    score int
);

CREATE TABLE exam_question(
    content varchar(100), 
    answer varchar(20)
);

SHOW TABLE like 'exam_%';

-----------------------------------------------------------
-- Result
SHOW CREATE TABLE exam_student;
SHOW CREATE TABLE exam_student\G
------------------------------------------------------------

DESCRIBE table_name;
DESC table_name;
刪除表
  1. 語法
DROP TABLE [if exists] table_name;
  1. 說明
  • 若是沒有表,能夠用if exists進行判斷
  • 操做系統的安全限制,有時候不能刪除,須要如今硬盤刪除,而後使用命令進行刪除
  • 刪除操做,必定要謹慎操做
修改表
  1. 語法
-- 重命名錶:修改表名,支持同時修改多個表,支持跨數據庫重命名

RENAME TABLE old_tb_name to new_tb_name[, old_tb_name to new_tb_name];

--- 修改列的定義

ALTER TABLE table_name new_options;

-- 1. 增長一個列

ALTER TABLE tb_name ADD col_name col_type;
-- 2. 修改一個列
ALTER TABLE tb_name MODIFY col_name col_type;
-- 3. 刪除一個列
ALTER TABLE tb_name DROP col_name;
-- 4. 重命名一個列
ALTER TABLE tb_name CHANGE old_col_name new_col_name;

--- 修改表的屬性
ALTER TABLE tb_name CHARACTER SET gbk/utf8;
  1. example
-- 表的列修改

-- 1.增長一個列
ALTER TABLE exam_student ADD height int;

-- 2. 刪除一個列
ALTER TABLE exam_student DROP height;

-- 3. 修改一個列
ALTER TABLE exam_student MODIFY stu_no varchar(40);

-- 4. 重命名一個列
ALTER TABLE exam_student CHANGE score int_score int;

-- 表的屬性修改

ALTER TABLE exam_student CHARACTER SET utf8;

數據操做 - CRUD(create, Read, Update, Delete)

建立數據(插入數據)
  1. 語法
INSERT INTO tb_name( 字段列表)VALUES (值列表);
  • 若是插入時,給全部字段值進行插入相應的值,能夠省略字段列表。要求值得順序應該與表中的字段的順序一致。
  1. Example
INSERT INTO exam_student (name, stu_no) VALUES ('jack', 1);
得到數據(查詢數據)
  1. 語法
SELECT 字段列表 FROM tb_name 查詢條件;
  • 字段列表,能夠用*代替,表示全部列表;
  • 查詢條件能夠省略,至關於WHERE 1。
  1. Example
SELECT name, stu_no FROM exam_student WHERE 1;
SELECT * FROM exam_student WHERE 1;
修改數據
  1. 語法
UPDATE tb_name SET 字段=新值,... 條件
  1. Example
 
刪除數據
  1. 語法
DELETE FROM tb_name 條件
  1. Example
DELETE FROM exam_student WHERE score <=90;

字符集操做及校對規則

字符集操做
  1. 語法
SHOW VARIABLES LIKE 'character_%';
  • 顯示當前數據庫服務器端和系統端的字符集格式
  1. Example
mysql> SHOW VARIABLES LIKE 'character_%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | gbk                                                     |
| character_set_connection | gbk                                                     |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | gbk                                                     |
| character_set_server     | utf8                                                    |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.01 sec)
字符集的校對規則
  1. 簡介

當前字符集內,字符之間的比較關係,如ASCI碼的比較,97=>'a'
每一個字符集都支持不定數量的校對規則。

  1. 語法
SHOW COLLATION;
SHOW COLLATION LIKE 'characterset_zone_ci/cs/bin'
  • 比較的規則
    • 字符集_地區名_比較規則
    • ci:不區分大小寫
    • cs:區分大小寫
    • bin:字節比較
  • 校隊規則根據默認的字符集進行變化,若是不設置校對規則,有默認的校對規則
  • 影響字符的存儲,是字符集;影響字符排序的,是校隊規則
  1. Example
  • 顯示校隊規則
SHOW COLLATION LIKE 'gbk%';
  • 校隊規則具體體現

具體操做

-- 建立不一樣校隊規則的表

CREATE TABLE tb_first(
    name varchar(10)
) CHARACTER SET gbk COLLATE gbk_chinese_ci;

CREATE TABLE tb_second(
    name varchar(10)
) CHARACTER SET gbk COLLATE gbk_bin;

-- 分別插入數據
INSERT INTO tb_first VALUES('a');
INSERT INTO tb_first VALUES('B');
INSERT INTO tb_first VALUES('C');

INSERT INTO tb_second VALUES('a');
INSERT INTO tb_second VALUES('B');
INSERT INTO tb_second VALUES('C');

-- 顯示數據進行排序
SELECT * FROM tb_first ORDER BY name;
SELECT * FROM tb_second ORDER BY name;

結果

mysql> select * from tb_first order by name;
+------+
| name |
+------+
| a    |
| B    |
| C    |
+------+
3 rows in set (0.01 sec)

mysql> select * from tb_second order by name;
+------+
| name |
+------+
| B    |
| C    |
| a    |
+------+
3 rows in set (0.00 sec)

列類型

數值類型
  1. 整數型
類型 字節 值範圍
TINYINT 1 -128/127 or 0-255(無符號)
SMALLINT 2
MEDIUMINT 3
INT 4
BIGINT 8
  • 使用unsigned控制正負
  • 使用zerofil進行零填充, 類型(M), M表示字符顯示的最小寬度
  • 布爾型,就是tinyint(1)
CREATE TABLE tb_int(
    a TINYINT UNSIGNED, 
    b TINYINT
);

INSERT INTO tb_int VALUES (255, 127);
INSERT INTO tb_int VALUES (256, 128);
mysql> INSERT INTO tb_int VALUES (256, 128);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
ALTER TABLE tb_int add c TINYINT(3) ZEROFILL;

INSERT INTO tb_int VALUES (0, 111, 1);
INSERT INTO tb_int VALUES (0, 111, 11);
INSERT INTO tb_int VALUES (0, 111, 12);
INSERT INTO tb_int VALUES (0, 111, 113);

SELECT * FROM tb_int;
mysql> SELECT * FROM tb_int;
+------+------+------+
| a    | b    | c    |
+------+------+------+
|  255 |  127 | NULL |
|    0 |  111 |  001 |
|    0 |  111 |  011 |
|    0 |  111 |  012 |
|    0 |  111 |  113 |
+------+------+------+
5 rows in set (0.00 sec)
  1. 小數型
  • 簡介
類型 字節
float 4
double 8
DECIMAL (M,D),默認M是10, D是2
  • 說明
    • 精度不一樣,範圍不一樣
    • 單精度大概保留7位左右,雙精度大概16位左右
    • Type(M,D), M總共的位數,不包括符號和小數點;D表示小數位
    • 支持科學計數法
    • 支持zerofill和unsigned, 如 c DECIMAL(10,2) zerofill;
  • Example
CREATE TABLE tb_float(
    a float, 
    b double
);

INSERT INTO tb_float VALUES (12345678.123, 1234567890.12345678);

SELECT * FROM tb_float;

結果1:

mysql> SELECT * FROM tb_float;
+----------+--------------------+
| a        | b                  |
+----------+--------------------+
| 12345700 | 1234567890.1234567 |
+----------+--------------------+
1 row in set (0.00 sec)
ALTER TABLE tb_float ADD c DECIMAL(10,2);

INSERT INTO tb_float VALUES(123, 123.44, 11111111.222);

SELECT * FROM tb_float;

結果2:

mysql> SELECT * FROM tb_float;
+----------+--------------------+-------------+
| a        | b                  | c           |
+----------+--------------------+-------------+
| 12345700 | 1234567890.1234567 |        NULL |
|      123 |             123.44 | 11111111.22 |
+----------+--------------------+-------------+
2 rows in set (0.00 sec)
日期型
  • 年月日時分秒 DATETIME
    • 範圍:'1000-01-01 00:00:00'到'9999-12-31 23:59:59'
    • 能夠是任意格式的字符
    • 若是出現歧義,不建議使用特殊的分隔符,會形成邏輯不清晰
    • 支持2位年份,1970-2069,不建議使用
    • 支持0年0月0日0時0分0秒,表示當前沒有規定,2013-04-0表示4月整月(邏輯想法)
  • 時間戳 TIMESTAMP
    • 存儲是整型
    • 表示範圍是:‘1970-01-01 00:00:00’到’2038-01-19 03:14:07‘
    • 檢索是用+0,能夠檢索時間戳

Example:

CREATE TABLE tb_datetime(
    a DATETIME, 
    b TIMESTAMP
);

INSERT INTO tb_datetime VALUES ('2018-02-27 12:34:08', '2018-02-27 12:34:09');

SELECT * FROM tb_datetime;

結果:

mysql> SELECT * FROM tb_datetime;
+---------------------+---------------------+
| a                   | b                   |
+---------------------+---------------------+
| 2018-02-27 12:34:08 | 2018-02-27 12:34:09 |
+---------------------+---------------------+
1 row in set (0.00 sec)
  • 年月日 DATE
    • 範圍:'1000-01-01'到'9999-12-31
    • 3個字節
  • TIME HH:MM:SS
    • 範圍:-838:59:59'到'838:59:59'
    • 表示一天中的時間
    • 表示時間的間隔,能夠用天來表示,格式:D HH:MM:SS

example:

-- time的格式

CREATE TABLE tb_datetime_1(
    ago time
);

INSERT INTO tb_datetime_1 VALUES ('23:12:12');
INSERT INTO tb_datetime_1 VALUES ('211212');
INSERT INTO tb_datetime_1 VALUES ('5 20:15:13');

結果:

mysql> SELECT * FROM tb_datetime_1;
+-----------+
| ago       |
+-----------+
| 23:12:12  |
| 21:12:12  |
| 140:15:13 |
+-----------+
3 rows in set (0.00 sec)
  • YEAR
    • 範圍:1901到2155

總結:

  • php中,使用unix的整型時間戳來保存時間,不適用mysql中date的類型。
字符串型
  • char(M)/varchar(M)
    • M 表示容許的字符串長度
    • char中M,表示嚴格規定的長度
    • varchar中M,是容許的最大長度
    • M表示的字符數,不是字節數
    • 注意:字段的最大長度,除了類型自己的限制,記錄的總長度也有限制
    • 真實的varchar的長度:總的長度65535,當類型數據超過255個字符時,採用兩個字節來表示長度,655355-2=65533,
    • 整條記錄須要一個額外字節,來記錄null值,除非全部的字段不是null值,則不須要額外的字節,來記錄null值
    • 一個記錄,若是有字段是非null,那就須要一個字節來存儲null的值
    字符 Char(5) VarChar(5) 解釋
    "" 5個字節 1個字節
    'a' 5個字節 2個字節
    'ab' 5個字節 3個字節
  • tinyText,text,mediumText,longtext
    • L + n。L爲最大長度2^8+1, 2^16+2, 2^24+3, 2^32+4
    • 如何知道,字符串很大的時候,用text代替varchar
  • enum 枚舉
    • 用於單獨的選項, 如gender enum('female', 'male')
    • 枚舉是整型的一種
    • 最多65535個變量,2個字節

    example:
    ```
    -- enum type
    CREATE TABLE tb_enum(
    gender ENUM('female', 'male')
    );

    INSERT INTO tb_enum VALUES ('male');
    INSERT INTO tb_enum VALUES ('female');

    -- error
    INSERT INTO tb_enum VALUES ('other');

    SELECT gender FROM tb_enum;
    SELECT gender+0 FROM tb_enum;
    ```

  • Set 集合
    • 用於不定項的設置
    • 元素數量:64, 1,2, 3, 4, 8, 最多保存65535元素。

Example:

-- set type
    CREATE TABLE  tb_set(
        hobby SET('basket', 'football', 'pingpang')
    );
    
    INSERT INTO tb_set VALUES('basket');
    INSERT INTO tb_set VALUES('basket, football');
mysql> SELECT hobby FROM tb_set;
    +--------+
    | hobby  |
    +--------+
    | basket |
    +--------+
    1 row in set (0.00 sec)
    
    mysql> SELECT hobby+0 FROM tb_set;
    +---------+
    | hobby+0 |
    +---------+
    |       1 |
    +---------+
    1 row in set (0.00 sec)
Bindary/Varbinary/Blob

在數據庫中能夠保存二進制,可是不會直接在數據庫中直接保存圖片

總結

經常使用類型:

1.int/tinyint

  1. float/double/decimal
  2. char/varchar/text
  3. date
相關文章
相關標籤/搜索