mysql基本使用

安裝mysql

Ubuntu上安裝MySQL很是簡單隻須要幾條命令就能夠完成。mysql

sudo apt-get install mysql-server sudo apt-get isntall mysql-client sudo apt-get install libmysqlclient-dev

安裝過程當中會提示設置密碼什麼的,注意設置了不要忘了,安裝完成以後可使用以下命令來檢查是否安裝成功:
sudo netstat -tap | grep mysql
經過上述命令檢查以後,若是看到有mysql 的socket處於 listen 狀態則表示安裝成功。
登錄mysql數據庫能夠經過以下命令:
mysql -u root -p
-u 表示選擇登錄的用戶名, -p 表示登錄的用戶密碼,上面命令輸入以後會提示輸入密碼,此時輸入密碼就能夠登陸到mysql。web

MySQL

MySQL 是應用最普遍的關係數據庫。關係數據庫使用關係模型做爲數據組織存儲的的方式,能夠分爲四級結構:sql

  • 數據庫,好比一個應用對應一個數據庫;
  • 表,一個數據庫包含若干張表;
  • 記錄,一個表包含多條記錄;
  • 字段,一條記錄包含若干字段;

一張表的結構能夠想象成一張 Excel 表,有多個字段組成,每個字段均可以存儲特定類型的數據,好比字符串或者數字,在建立表的時能夠指定類型。表與表之間經過關係鏈接(邏輯上的關係),查詢數據時能夠經過關係跨越多張表進行查詢。shell

關係數據庫最重要的特性是是知足 ACID 性質:數據庫

  • A atomicity 表明原子性;
  • C consistency 表明一致性;
  • I isolation 表明隔離性;
  • D durability 表明持久性;

ACID 可以保證事務的可靠性,什麼意思呢?就是說可以保證一系列的數據庫操做組成的一個完整邏輯過程,要麼所有被執行,要麼完全不執行,不會出現執行一半的狀況。例如銀行轉賬,從原帳戶扣除金額,以及向目標帳戶添加金額,這兩個數據庫操做的總和,構成一個完整的邏輯過程,不可拆分。ruby

爲了知足 ACID 性質,MySQL 支持各類約束,好比插入一條數據時,須要檢查外鍵是否存在,這些操做雖然能確保數據的一致性,可是不少時候卻下降了併發操做的能力,因此在現在的互聯網網站中,若是有高併發的需求每每再也不使用關係數據庫的 ACID 性質,更有的直接使用非關係數據庫。bash

除此以外,這裏再補充幾點關係數據庫中關係鍵的基本概念知識,以幫助理解下文內容。併發

  • 主鍵(英語:primary key)。數據庫表中對儲存數據對象予以惟一和完整標識的數據列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能爲空值(Null)。
  • 外鍵(英語:foreign key)。其實在關係數據庫中,每一個數據表都是由關係來連繫彼此的關係,父數據表(Parent Entity)的主鍵(primary key)會放在另外一個數據表,當作屬性以建立彼此的關係,而這個屬性就是外鍵。

好比,學生跟老師之間對應着教學關係,學生數據表會有個屬性叫指導老師(外鍵),而這個值就是對應到老師數據表的老師代號(主鍵)。app

mysql基本操做

啓動/中止mysqlsocket

sudo service mysql start sudo service mysql stop

數據庫的建立和刪除

建立數據庫很是簡單,只須要輸入 create database <db_name>; 就能夠了,其中 <db_name> 表明數據庫名稱,查看全部的數據庫能夠經過 show databases; (注意,這裏多了一個 s) 命令,而刪除一個數據庫則能夠經過 drop database <db_name>; ,

  • 建立
mysql> create database news;
Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | news | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
  • 刪除
mysql> drop database news;
Query OK, 0 rows affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)

表的基本操做

  1. 表建立和刪除

數據庫建立成功之後,就能夠建立表了。在建立表以前,須要經過 use shiyanlou; 命令鏈接到 shiyanlou 數據庫。

建立表的基本命令以下:

CREATE TABLE 表的名字 ( 列名a 數據類型(數據長度), 列名b 數據類型(數據長度), 列名c 數據類型(數據長度) );
數據類型 大小(字節) 用途 格式
FLOAT 4 單精度浮點數  
DOUBLE 8 雙精度浮點數  
INT 4 整數  
SET 4 多選 SET('1','2','3')
DATE 3 日期 YYYY-MM-DD
TIME 3 時間點或持續時間 HH:MM:SS
YEAR 1 年份值 YYYY
CHAR 0~255 定長字符串  
VARCHAR 0~255 變長字符串  
TEXT 0~65535 長文本數據  
ENUM   單選,好比性別 ENUM('a','b','c')

下面嘗試建立一張表名爲 user 的表,該表有 3 個字段:

  • id 編號,整數類型,使用 int 類型;
  • name 用戶名,字符串,使用 varchar 可變字符類型;
  • email 郵箱,字符串, 使用 varchar 可變字符型;
mysql> use pyclass; Database changed mysql> create table user( -> id int(10), -> name varchar(20), -> email varchar(64) -> ); Query OK, 0 rows affected (0.47 sec)  mysql> show tables; +-------------------+ | Tables_in_pyclass | +-------------------+ | user | +-------------------+ 1 row in set (0.00 sec)

經過以上命令就能夠建立出 user 表,須要注意的是當輸入 create table user 回車之後,客戶端會自動識別出這是一個未完成的命令,因此會出現提示符 -> 。表建立成功之後,能夠經過 show tables; 查看全部的表, 刪除表能夠經過 drop table <table_name>; 。

若是想查看一張表的字段信息,能夠經過 show create table <table_name>; 或者 describe <table_name>; 指令,以下所示:

mysql> show create table user;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | user | CREATE TABLE `user` ( `id` int(10) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `email` varchar(64) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.01 sec) mysql> describe user; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(10) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | email | varchar(64) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
  1. 插入數據

表建立成功之後,就能夠插入數據了。可使用 insert 指令插入數據,完整的命令格式以下:

INSERT INTO 表的名字(列名a,列名b,列名c) VALUES(值1,值2,值3);

當插入的值和和表定義的字段數量一致且順序一致時,能夠忽略列名信息,經過如下命令往 user 表中插入數據:

mysql> insert into user(id,name,email) values(1,'mmm','mmm@qq.com'); Query OK, 1 row affected (0.46 sec) mysql> insert into user values(2,'zzz','zzz@qq.com'); Query OK, 1 row affected (0.01 sec)

查看插入的數據:

mysql> select * from user;
+------+------+------------+
| id | name | email | +------+------+------------+ | 1 | mmm | mmm@qq.com | | 2 | zzz | zzz@qq.com | +------+------+------------+ 2 rows in set (0.00 sec)
  1. 修改表名

重命名一張表的語句有多種形式,如下 3 種格式效果是同樣的:

RENAME TABLE 原名 TO 新名字; ALTER TABLE 原名 RENAME 新名; ALTER TABLE 原名 RENAME TO 新名;

使用命令嘗試修改 user 的名字爲 user1 :

mysql> rename table user to user1; Query OK, 0 rows affected (0.44 sec)  mysql> show tables; +-------------------+ | Tables_in_pyclass | +-------------------+ | user1 | +-------------------+ 1 row in set (0.00 sec)  mysql> alter table user1 rename user; Query OK, 0 rows affected (0.01 sec)  mysql> show tables; +-------------------+ | Tables_in_pyclass | +-------------------+ | user | +-------------------+ 1 row in set (0.00 sec)
  1. 修改表結構

在表中增長一列的語句格式爲:

ALTER TABLE 表名字 ADD COLUMN 列名字 數據類型 約束; ALTER TABLE 表名字 ADD 列名字 數據類型 約束;

增長age字段,默認值18:

mysql> alter table user add age int(4) default 18; Query OK, 0 rows affected (0.56 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select * from user; +------+------+------------+------+ | id | name | email | age | +------+------+------------+------+ | 1 | mmm | mmm@qq.com | 18 | | 2 | zzz | zzz@qq.com | 18 | +------+------+------------+------+ 2 rows in set (0.00 sec)

能夠發現:新增長的列,被默認放置在這張表的最右邊。若是要把增長的列插入在指定位置,則須要在語句的最後使用AFTER關鍵詞(「AFTER 列1」 表示新增的列被放置在 「列1」 的後面)。

好比咱們新增一列 weight (體重)放置在 name 的後面:

mysql> alter table user add weight int(4) default 120 after name; Query OK, 0 rows affected (0.60 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select * from user; +------+------+--------+------------+------+ | id | name | weight | email | age | +------+------+--------+------------+------+ | 1 | mmm | 120 | mmm@qq.com | 18 | | 2 | zzz | 120 | zzz@qq.com | 18 | +------+------+--------+------------+------+ 2 rows in set (0.00 sec)

上面的效果是把新增的列加在某位置的後面,若是想放在第一列的位置,則使用 FIRST 關鍵詞,如語句:

ALTER TABLE employee ADD test INT(10) DEFAULT 11 FIRST;

刪除表中的一列和剛纔使用的新增一列的語句格式十分類似,只是把關鍵詞 ADD 改成 DROP ,語句後面不須要有數據類型、約束或位置信息。具體語句格式:

ALTER TABLE 表名字 DROP COLUMN 列名字;

或: ALTER TABLE 表名字 DROP 列名字;
咱們把剛纔新增的 age 刪除:

mysql> alter table user drop age;
Query OK, 0 rows affected (0.52 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select * from user; +------+------+--------+------------+ | id | name | weight | email | +------+------+--------+------------+ | 1 | mmm | 120 | mmm@qq.com | | 2 | zzz | 120 | zzz@qq.com | +------+------+--------+------------+ 2 rows in set (0.00 sec)

重命名一列,這條語句其實不僅可用於重命名一列,準確地說,它是對一個列作修改(CHANGE) :
ALTER TABLE 表名字 CHANGE 原列名 新列名 數據類型 約束;
注意:這條重命名語句後面的 「數據類型」 不能省略,不然重命名失敗。

當原列名和新列名相同的時候,指定新的數據類型或約束,就能夠用於修改數據類型或約束。須要注意的是,修改數據類型可能會致使數據丟失,因此要慎重使用。

咱們用這條語句將 「weight」 一列重命名爲漢語拼音 「tizhong」 ,效果以下:

mysql> alter table user change weight tizhong int(4) default 125; Query OK, 0 rows affected (0.47 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select * from user; +------+------+---------+------------+ | id | name | tizhong | email | +------+------+---------+------------+ | 1 | mmm | 120 | mmm@qq.com | | 2 | zzz | 120 | zzz@qq.com | +------+------+---------+------------+ 2 rows in set (0.00 sec)

要修改一列的數據類型,除了使用剛纔的CHANGE語句外,還能夠用這樣的MODIFY語句:
ALTER TABLE 表名字 MODIFY 列名字 新數據類型;
再次提醒,修改數據類型必須當心,由於這可能會致使數據丟失。在嘗試修改數據類型以前,請慎重考慮。

大多數時候咱們須要作修改的不會是整個數據庫或整張表,而是表中的某一個或幾個數據,這就須要咱們用下面這條命令達到精確的修改:
UPDATE 表名字 SET 列1=值1,列2=值2 WHERE 條件;
好比,咱們要把 zzz 的 tizhong 改成125,email 改成 zzz@163.com:

mysql> update user set tizhong=125,email='zzz@163.com' where name = 'zzz'; Query OK, 1 row affected (0.43 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from user; +------+------+---------+-------------+ | id | name | tizhong | email | +------+------+---------+-------------+ | 1 | mmm | 120 | mmm@qq.com | | 2 | zzz | 125 | zzz@163.com | +------+------+---------+-------------+ 2 rows in set (0.00 sec)

刪除表中的一行數據,也必須加上WHERE條件,不然整列的數據都會被刪除。刪除語句:
DELETE FROM 表名字 WHERE 條件;

約束

約束分類
聽名字就知道,約束是一種限制,它經過對錶的行或列的數據作出限制,來確保表的數據的完整性、惟一性。

在MySQL中,一般有這幾種約束:

約束類型 主鍵 默認值 惟一 外鍵 非空
關鍵字 PRIMARY KEY DEFAULT UNIQUE FOREIGN KEY NOT NULL

eg:

CREATE DATABASE mysql_shiyan; use mysql_shiyan; CREATE TABLE department ( dpt_name CHAR(20) NOT NULL, people_num INT(10) DEFAULT '10', CONSTRAINT dpt_pk PRIMARY KEY (dpt_name) ); CREATE TABLE employee ( id INT(10) PRIMARY KEY, name CHAR(20), age INT(10), salary INT(10) NOT NULL, phone INT(12) NOT NULL, in_dpt CHAR(20) NOT NULL, UNIQUE (phone), CONSTRAINT emp_fk FOREIGN KEY (in_dpt) REFERENCES department(dpt_name) ); CREATE TABLE project ( proj_num INT(10) NOT NULL, proj_name CHAR(20) NOT NULL, start_date DATE NOT NULL, end_date DATE DEFAULT '2015-04-01', of_dpt CHAR(20) REFERENCES department(dpt_name), CONSTRAINT proj_pk PRIMARY KEY (proj_num,proj_name) );
  • 主鍵
    主鍵 (PRIMARY KEY)是用於約束表中的一行,做爲這一行的惟一標識符,在一張表中經過主鍵就能準肯定位到一行,所以主鍵十分重要。主鍵不能有重複且不能爲空。
    定義主鍵:
    mysql基本使用
    也能夠這樣定義:
    mysql基本使用
    還有一種特殊的主鍵——複合主鍵。主鍵不只能夠是表中的一列,也能夠由表中的兩列或多列來共同標識,好比:
    mysql基本使用

  • 默認值約束
    默認值約束 (DEFAULT) 規定,當有 DEFAULT 約束的列,插入數據爲空時,將使用默認值。
    people_num INT(10) DEFAULT '10' 默認值爲10
    DEFAULT 約束只會在使用 INSERT 語句(上一實驗介紹過)時體現出來,INSERT語句中,若是被 DEFAULT 約束的位置沒有值,那麼這個位置將會被 DEFAULT 的值填充,如語句:

    INSERT INTO department(dpt_name,people_num) VALUES('dpt1',11);# 正常插入數據 INSERT INTO department(dpt_name) VALUES('dpt2');#插入新的數據,people_num 爲空,使用默認值
  • 惟一約束
    惟一約束 (UNIQUE) 比較簡單,它規定一張表中指定的一列的值必須不能有重複值,即這一列每一個值都是惟一的。
    mysql基本使用
    當 INSERT 語句新插入的數據和已有數據重複的時候,若是有 UNIQUE約束,則 INSERT 失敗,好比:
INSERT INTO employee VALUES(01,'Tom',25,3000,110110,'dpt1'); INSERT INTO employee VALUES(02,'Jack',30,3500,110110,'dpt2');
  • 外鍵約束
    外鍵 (FOREIGN KEY) 既能確保數據完整性,也能表現表之間的關係。
    一個表能夠有多個外鍵,每一個外鍵必須 REFERENCES (參考) 另外一個表的主鍵,被外鍵約束的列,取值必須在它參考的列中有對應值。
    mysql基本使用
    在 INSERT 時,若是被外鍵約束的值沒有在參考列中有對應,則INSERT 失敗

  • 非空約束
    非空約束 (NOT NULL),聽名字就能理解,被非空約束的列,在插入值時必須非空。
    mysql基本使用在MySQL中違反非空約束,不會報錯,只會有警告
相關文章
相關標籤/搜索