MySQL(一):基本原理

1、數據庫定義
python

數據庫,簡單來講是自己可視爲電子化的文件櫃——存儲電子文件的處所,用戶能夠對文件中的數據運行新增、截取、更新、刪除等操做。mysql

數據庫指的是以必定方式儲存在一塊兒、能爲多個用戶共享、具備儘量小的冗餘度、與應用程序彼此獨立的數據集合。正則表達式

數據庫的組織模式:sql

  • 層次型數據結構數據庫

  • 網狀型數據結構安全

  • 關係型數據結構(MySQL)服務器

  • 非關係型數據結構(NoSQL)數據結構


關係型數據結構圖示併發

wKiom1ND_GuACBuWAAG_8SBwwHU782.jpg

上圖描述了從用戶層到物理層的工做結構。less


2、數據庫基礎知識

SQL:structure query language;一種介於關係代數關係演算之間的結構化查詢語言,是一個通用的、功能極強的關係性數據庫語言。

SQL語言組成部分:

  • 數據定義語言(DDL:Data Definition Language):CREATE, DROP, ALTER

  • 數據操縱語言(DML:Data Manipulation Language):SELECT, INSERT, UPDATE, DELETE

  • 數據控制語言(DCL:Data Control Language):GRANT, REVOKE


事務(transaction):事務就是一組原子性的查詢語句;也即將多個查詢看成一個獨立的工做單元。

ACID測試:能知足ACID測試就表示其支持事務;或兼容事務。

  • 原子性(Atomic):事務做爲一個總體被執行,包含在其中的對數據庫的操做要麼所有被執行,要麼都不執行

  • 一致性(Consistency):事務應確保數據庫的狀態從一個一致狀態轉變爲另外一個一致狀態。一致狀態的含義是數據庫中的數據應知足完整性約束。

  • 隔離性(Isolation):多個事務併發執行時,一個事務所作的操做在提交以前對其餘事務是不可見的。

  • 持久性(Durability):已被提交的事務對數據庫的修改應該永久保存在數據庫中


3、MySQL基礎特性

MySQL的安裝這裏就不作介紹;Linux下編譯安裝LAMP並分離爲多臺服務器有介紹。下面來介紹mysql中部分的基礎性的特性。

鍵:key(字段)

  • 主鍵:可以惟一標識表中每個記錄的字段或字段的組合。

  • 候選鍵:可以做爲惟一標識表中每個記錄的字段。

  • 外鍵:依賴別的表當作屬性以建立彼此的關係;而這個屬性就是外鍵。

  • 惟一鍵:能夠肯定一條記錄的字段(或字段組合),一張表能夠有多個惟一鍵。


約束:constraint

  • 主鍵約束:用於定義基本表的主鍵,起唯一標識做用;對一張表來講;主鍵只能有一個;不能爲空;不能重複。

  • 外鍵約束:定義了一個表中數據與另外一個表中的數據的聯繫;對應其餘表中的字段;在本身表中沒有的不能填入。

  • 惟一鍵約束:用於指明建立唯一約束的列上的取值必須唯一;能夠爲空;不能重複;能夠有多個。

  • 檢查式約束:用戶自定義有效取值範圍;一般爲布爾表達式。

  • 非空約束:只用於定義列約束。


mysql中的比較方式、存儲空間的取值範圍以及參與的運算等都取決於mysql的數據類型;因此數據類型很是重要;具體的字段的數據類型:

字符型

char(#) 用於保存定長(size)字節的字符串數據。編碼時不區分字符大小寫。最大長度爲255字節.
varchar(#) 用於保存變長的字符串數據。其中最大字節長度由(size)指定。每行長度可變,最大長度爲65535字節。數據長度缺省爲1 ;編碼時區不分字符大小寫。
binary(#) 固定長度的二進制字符串;每行定長(不足部分補爲空格);最大長度爲255字節,缺省值爲每行1字節。編碼時區分字符大小寫。
varbinary(#) 可變長度的長度的二進制字符串。每行長度可變,最大長度爲65535字節。數據長度缺省爲1。編碼時區分字符大小寫。
text 一個BLOB或TEXT列,最大長度爲65535(2^16-1)個字符;編碼時不區分字符大小寫
blob 二進制的大對象;一個BLOB或TEXT列,最大長度爲65535(2^16-1)個字符;編碼時區分字符大小寫。

數值型

  • 精確數值型


tinyint 保存整型數據,範圍爲0到255。最大長度爲1字節。
smallint 保存整型數據,範圍爲-32767到+32767最,大長度爲2字節。
mediumint 保存整型數據,範圍爲-8388608至8388607或0至16777215。最大長度爲3字節。
int 保存整型數據,範圍爲-2147483647到+2147483647。最大長度爲4字節。
bigint 保存整型數據,範圍爲-9223372036854775808至9223372036854775807或0至18446744073709551615。最大長度爲8字節
decimal 保存精確數值數據類型,範圍爲-10E-38到+10E-38,最大長度爲2~17字節。
  • 近似數值型

float 最小非零值:±1.175494351E – 38,同double同樣適用於精度要求高的場合
double 最小非零值:±2.2250738585072014E - 308

日期時間型

date 1000-01-01~9999-12-31 3字節
time -838:59:59~838:59:59 3字節
datetime 1000-01-01 00:00:00~9999-12-31 23:59:59 8字節
timestamp 19700101000000~指定時間的某個時刻 4字節
year YYYY 格式表示的年份值

MySQL內置類型

enum 枚舉類型(指定範圍內中某一種)
set 集合型(指定範圍內任意組合)


布爾型:tinyint{0|1}

NULL


字段或字段類型的修飾符

not null 非空
null
unsigned 無符號整型(只能用於數值)
default [value] 字符須要加引號;數據絕對不能加引號
auto_increment 自動增加類型的字段必須爲主鍵或惟一鍵
primary key 定義主鍵
unique key 定義惟一鍵

Example:


mysql> create table stu1 (Id int unsigned auto_increment unique key,Name char(30) not null,Age tinyint unsigned not null,Gender enum('F','M') not null default 'M');
Query OK, 0 rows affected (0.04 sec)
mysql> desc stu1;
+--------+---------------------+------+-----+---------+----------------+
| Field  | Type                | Null | Key | Default | Extra          |
+--------+---------------------+------+-----+---------+----------------+
| Id     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| Name   | char(30)            | NO   |     | NULL    |                |
| Age    | tinyint(3) unsigned | NO   |     | NULL    |                |
| Gender | enum('F','M')       | NO   |     | M       |                |
+--------+---------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql>
mysql> insert into stu1 (Name,Age,Gender) values ('Tom',20,'M'),
    -> ('Pipi',20,'M'),    #這裏插入數據都沒有插入Id號;由於上述定義的是自增加
    -> ('Jerry',18,'F'),
    -> ('Soul',24,'M');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> select * from stu1;    #顯示錶字段信息
+----+-------+-----+--------+
| Id | Name  | Age | Gender |
+----+-------+-----+--------+
|  1 | Tom   |  20 | M      |
|  2 | Pipi  |  20 | M      |
|  3 | Jerry |  18 | F      |
|  4 | Soul  |  24 | M      |
+----+-------+-----+--------+

SQL語句能夠直接在mysql裏面幫助獲取:幫助信息顯示的也很詳細

mysql> help insert
#[]括號內的都是可省的;{}內是必選的;
Name: 'INSERT'
Description:
Syntax:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE
      col_name=expr
        [, col_name=expr] ... ]
#
#
mysql> help select
Name: 'SELECT'
Description:
Syntax:
SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
      | INTO DUMPFILE 'file_name'
      | INTO var_name [, var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]


4、布爾條件表達式操做符


= equal;等於
<=> null sale equal to;與空值比較的安全方式
<> | != not equal to;不等於
< less;小於
<=
less than or equal to;小於等於
> greater;大於
>= greater than or equal to;大於等於


is null 爲空
is not null 不爲空
like 通配;%(任意長度的任意字符), _(任意單個字符)
regexp | rlike 支持使用正則表達式
in 判斷指定字段是否在給定的列表中
between... and... 位於指定的範圍之間


組合條件測試

not | !
and | &&
or | ||


聚合函數

sum() 求和
avg() 求平均值
max() 最大值
min() 最小值
count() 計數

根據數據庫操做語言(DML)列出幾個簡單的例子;後續做詳細說明

Examples:

select:

mysql> select * from students;
+-----+-------------+-----+--------+-------------+---------+
| SID | Name        | Age | Gender | Tutor       | ClassID |
+-----+-------------+-----+--------+-------------+---------+
|   1 | Guo Jing    |  27 | M      | Song Jiang  |       2 |
|   2 | Yang Guo    |  28 | M      | Hu Sanniang |       3 |
|   3 | Guo Polu    |  21 | M      | Jia Baoyu   |       3 |
|   4 | Xue Baochai |  19 | F      | Rong Momo   |       1 |
|   5 | Xia Yuhe    |  37 | F      | Shi Qian    |       2 |
|   6 | Wu Yong     |  51 | M      | Lin Daiyu   |       1 |
|   7 | tom         |  11 | M      | jerry       |       1 |
|   8 | tomy        |  13 | M      | NULL        |       4 |
+-----+-------------+-----+--------+-------------+---------+
mysql> select Name,Age from students where Age > 20;
#查找年齡大於20的
+----------+-----+
| Name     | Age |
+----------+-----+
| Guo Jing |  27 |
| Yang Guo |  28 |
| Guo Polu |  21 |
| Xia Yuhe |  37 |
| Wu Yong  |  51 |
+----------+-----+
mysql> select Name,Gender from students where Gender = 'F';
#查找性別爲女的
+-------------+--------+
| Name        | Gender |
+-------------+--------+
| Xue Baochai | F      |
| Xia Yuhe    | F      |
+-------------+--------+
mysql> select Name,Age,Gender from students where Age > 20 and Gender = 'F';
+----------+-----+--------+
| Name     | Age | Gender |
+----------+-----+--------+
| Xia Yuhe |  37 | F      |
+----------+-----+--------+

delete:

mysql> delete from students where Name like 'X%';
Query OK, 2 rows affected (0.00 sec)
mysql> select * from students;
+-----+----------+-----+--------+-------------+---------+
| SID | Name     | Age | Gender | Tutor       | ClassID |
+-----+----------+-----+--------+-------------+---------+
|   1 | Guo Jing |  27 | M      | Song Jiang  |       2 |
|   2 | Yang Guo |  28 | M      | Hu Sanniang |       3 |
|   3 | Guo Polu |  21 | M      | Jia Baoyu   |       3 |
|   6 | Wu Yong  |  51 | M      | Lin Daiyu   |       1 |
|   7 | tom      |  11 | M      | jerry       |       1 |
|   8 | tomy     |  13 | M      | NULL        |       4 |
+-----+----------+-----+--------+-------------+---------+
6 rows in set (0.00 sec)

update:

mysql> update students set Age = 40 where Name = 'Wu yong';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from students;
+-----+----------+-----+--------+-------------+---------+
| SID | Name     | Age | Gender | Tutor       | ClassID |
+-----+----------+-----+--------+-------------+---------+
|   1 | Guo Jing |  27 | M      | Song Jiang  |       2 |
|   2 | Yang Guo |  28 | M      | Hu Sanniang |       3 |
|   3 | Guo Polu |  21 | M      | Jia Baoyu   |       3 |
|   6 | Wu Yong  |  40 | M      | Lin Daiyu   |       1 |
|   7 | tom      |  11 | M      | jerry       |       1 |
|   8 | tomy     |  13 | M      | NULL        |       4 |
|   9 | Tom      |  24 | M      | NULL        |    NULL |
|  10 | Jerry    |  23 | F      | NULL        |    NULL |
+-----+----------+-----+--------+-------------+---------+


幾個簡單show命令的用法

mysql> show create table stu1\G;
#查看建立表所使用的命令。
#\G爲客戶端命令;可使用\?來查看。
*************************** 1. row ***************************
       Table: stu1
Create Table: CREATE TABLE `stu1` (
  `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` char(30) NOT NULL,
  `Age` tinyint(3) unsigned NOT NULL,
  `Gender` enum('F','M') NOT NULL DEFAULT 'M',
  UNIQUE KEY `Id` (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql>


mysql> show engines\G;
#查看當前數據庫支持的存儲引擎
*************************** 1. row ***************************
      Engine: MRG_MYISAM
     Support: YES        #是否支持
     Comment: Collection of identical MyISAM tables
Transactions: NO         #是否支持事務
          XA: NO         #是否支持分佈式事務
  Savepoints: NO         #是否支持保存點
*************************** 2. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: MyISAM
     Support: DEFAULT
     Comment: Default engine as of MySQL 3.23 with great performance
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: InnoDB
     Support: YES
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 5. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
5 rows in set (0.00 sec)
ERROR:
No query specified
mysql>


mysql> show character set;
#顯示字符集
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                    | ascii_general_ci    |      1 |
                                                                                                                                                                                          
                                                                                                                                                                                          
mysql> show collation;
#排序規則
+--------------------------+----------+-----+---------+----------+---------+
| Collation                | Charset  | Id  | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci          | big5     |   1 | Yes     | Yes      |       1 |
| big5_bin                 | big5     |  84 |         | Yes      |       1 |
| dec8_swedish_ci          | dec8     |   3 | Yes     | Yes      |       1 |
| dec8_bin                 | dec8     |  69 |         | Yes      |       1 |
| cp850_general_ci         | cp850    |   4 | Yes     | Yes      |       1 |
| cp850_bin                | cp850    |  80 |         | Yes      |       1 |
| hp8_english_ci           | hp8      |   6 | Yes     | Yes      |       1 |
| hp8_bin                  | hp8      |  72 |         | Yes      |       1 |
| koi8r_general_ci         | koi8r    |   7 | Yes     | Yes      |       1 |
                                                                                                                                                                                          
                                                                                                                                                                                          
#查看show的幫助都有詳細說明
mysql> help show
Name: 'SHOW'
Description:
SHOW has many forms that provide information about databases, tables,
columns, or status information about the server. This section describes
those following:
SHOW AUTHORS
SHOW {BINARY | MASTER} LOGS
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
SHOW CHARACTER SET [like_or_where]
SHOW COLLATION [like_or_where]
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where]
SHOW CONTRIBUTORS
SHOW CREATE DATABASE db_name
SHOW CREATE EVENT event_name
SHOW CREATE FUNCTION func_name
SHOW CREATE PROCEDURE proc_name
SHOW CREATE TABLE tbl_name
SHOW CREATE TRIGGER trigger_name
....


關係型數據庫的基本用法到此,因爲數據庫理論等方面內容不少;沒法總結的很全面;可能存在不少遺漏的地方。後續介紹詳細用法。


若有錯誤;懇請糾正。

相關文章
相關標籤/搜索