由瑞典MySQL AB公司開發,後被Oracle收購。html
開源工具,不具備正版和盜版之分。分爲社區辦和企業版。mysql
是世界上最流行的開源數據庫。全稱爲My structured query language,用於存儲數據、數據的查詢、更新和管理關係數據庫系統(relational database management system)sql
數據庫:電子化的文件櫃;數據庫
關係型數據庫:採用二位表格結構來組織數據的數據庫,有行和列。即將數據組織爲相關的行和列;數組
表能夠當作一個文件櫃,將其中的一行數據看作一個文件,也稱之爲記錄;服務器
列:即一個字段;函數
主鍵:爲了確保表中每一條記錄的惟一性,可對多個字段進行主鍵設置;工具
索引:對錶中數據進行排序,以快速查找信息;ui
外鍵:若是表中的一個字段是另一個表中的主鍵,則該字段爲外鍵。能夠創建兩個表之間的聯繫。spa
bin: 存儲可執行文件;
data: 存儲數據文件;
docs: 存儲文檔;
include: 存儲包含的頭文件;
lib: 存儲庫文件;
share: 錯誤消息和字符集文件
1. 經過【計算機-服務-MySQL】右擊進行關閉/啓動;
2. 經過win+R 呼出cmd ,使用管理員權限,輸入命令行:
啓動:net start mysql
關閉:net stop mysql
2.mysql>exit mysql>quit mysql>\q 登出數據庫。
3.能夠用鍵盤的上下鍵翻閱歷史命令行。
4.使用cls回車進行命令行清屏。
1. mysql -uroot -ppassword --prompt \h
用戶名 密碼 修改命令 指定爲localhost
2. mysql>PROMPT 提示符。
mysql>CREATE DATABASE test1;
show databases;
show create database test;
alter database test character set = utf8;
drop database test;
整型、 浮點型、日期格式、字符型
C:\Windows\system32>mysql -uroot -proot -P3306 -h127.0.0.1
mysql>SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test1 |
+--------------------+
mysql> USE test1; //打開數據庫
mysql>SELECT DATABASE(); //顯示當前選擇的數據庫名稱
CREATE TABLE[IF NOT EXIT] table_name(
column_name data_type,
...
)
mysql> CREATE TABLE table1(
-> username VARCHAR(20),
-> age TINYINT UNSIGNED,
-> salary FLOAT(8,2) UNSIGNED //最後一個字段後面不須要加逗號
-> );
DROP TABLE table1;
ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]
在不指定新加入列位置的狀況下,將會默認建在數據表的最下方。
mysql> ALTER TABLE user1 ADD password VARCHAR(32) NOT NULL AFTER id;
Query OK, 0 rows affected (1.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW COLUMNS FROM user1;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| password | varchar(32) | NO | | NULL | |
| username | varchar(10) | NO | | NULL | |
| pid | smallint(5) unsigned | YES | MUL | NULL | |
| age | tinyint(3) unsigned | NO | | 10 | |
+----------+----------------------+------+-----+---------+----------------+
ALTER TABLE tbl_name ADD [COLUMN]( col_name column_definition, ...)
不能指定位置關係,默認建立在數據表的最下方。
ALTER TABLE tbl_name DROP col_name
mysql> ALTER TABLE user1 DROP id,DROP age;
ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
mysql> ALTER TABLE user2 MODIFY id SMALLINT UNSIGNED NOT NULL FIRST;
//將大類型的數據改成小類型時,可能會發生數據丟失,須要注意。
ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
mysql> ALTER TABLE user2 CHANGE pid p_id TINYINT UNSIGNED NOT NULL;
ALTER TABLE tbl_name RENAME TO new_tbl_name;
ALTER TABLE uer2 RENAME TO user2gogogo;
SHOW TABLES [ FROM db_name]
mysql> SHOW TABLES FROM mysql; //當前數據庫位置不會發生改變
若是用戶當前在test1的數據庫中,選擇查看其它數據庫中的數據表,是不會改變當前所在的位置的。
SHOW COLUMNS FROM table1; //接上述2.1.5.2
INSERT [INTO] table1_name[(col_name,...)] VALUES(val,...)
當省略上述col_name所對應的字段名時,默認要對全部的字段都進行賦值。
mysql> INSERT table1 VALUES("Tom",27,5566.23); //對全部的字段進行賦值
mysql> INSERT table1(username,age) VALUES("Kate",23); //部分字段賦值
SELECT expr, ... FROM tb1_name
mysql> SELECT * FROM table1;
上述*號指的是全部的字段,而不是全部的記錄。
NULL:容許爲空值;
NOT NULL:不容許爲空值;
mysql> CREATE TABLE table2(
-> username VARCHAR(20) NOT NULL,
-> age TINYINT UNSIGNED NULL
-> );
mysql> INSERT table2 VALUES(NULL,23);
ERROR 1048 (23000): Column 'username' cannot be null //此時不容許名字爲空
自動編號,必須與主鍵結合使用;
默認狀況下,起始值爲1,增量爲1;
必須爲數值型,能夠爲float和double型,可是其小數位數必須爲0。例如float(6,0)
自動編號中間被刪除後,即時不連續,也不會再自動補充
mysql> CREATE TABLE table3(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, //自動編號
-> username VARCHAR(30) NOT NULL
-> );
mysql> INSERT table3(username) VALUES("Jerry"); //爲uername賦值,自動編號無論
Query OK, 1 row affected (0.38 sec)
mysql> INSERT table3(username) VALUES("Mary");
Query OK, 1 row affected (0.05 sec)
mysql> INSERT table3(username) VALUES("Mike");
Query OK, 1 row affected (0.04 sec)
mysql> SELECT* FROM table3;
+----+----------+
| id | username |
+----+----------+
| 1 | Jerry |
| 2 | Mary |
| 3 | Mike |
+----+----------+
一張數據表中只能有一個主鍵;
主鍵保持記錄的惟一性;
自動爲NOT NULL,不容許爲空;
接上述2.6章節中的內容,因爲建立的table3中,指定id爲主鍵PRIMARY_KEY。
mysql>SHOW COLUMNS FROM table3;
+----------+--------------------------------------+-------+-------+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------------------------------+-------+-------+------------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(30) | NO | | NULL | |
+----------+--------------------------------------+--------+-------+------------+----------------+
2 rows in set (0.00 sec)
主鍵表示在該數據表中,該條記錄的惟一性。在一個數據表中,2條記錄的主鍵不容許相同。
保證記錄的惟一性;
字段能夠爲空值,爲NULL;
一張數據表上能夠存多個unique key;
mysql> CREATE TABLE table5(
-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(20) UNIQUE KEY,
-> age TINYINT UNSIGNED NOT NULL
-> );
mysql> SHOW COLUMNS FROM table5;
+-------------+-------------------------------+----------+--------+-----------+----------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------------------------+---------+---------+-----------+----------------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(20) | YES | UNI | NULL | |
| age | tinyint(3) unsigned | NO | | NULL | |
+--------------+-------------------------------+---------+---------+-----------+-----------------------+
mysql> INSERT table5 (username,age) VALUES("Tom",23);
Query OK, 1 row affected (0.37 sec)
mysql> INSERT table5 (username,age) VALUES("Tom",23);
ERROR 1062 (23000): Duplicate entry 'Tom' for key 'username'
//限制數值惟一。雖然能夠爲空值,可是unique key每每整個數據表中只有一條記錄的unique key爲空。
當插入記錄時,若是沒有明確爲字段賦值,則自動賦予其默認值。
保持數據完整性,一致性;
實現數據一對一或者一對多的關係;
決定了MySQL是一種關係型數據庫(Relational database management system)。
外鍵約束的要求:
1.父表和子表必須使用相同的存儲引擎,並且禁止使用臨時表;
(注:具備外鍵鏈的表稱爲子表,子表所參照的表稱爲父表)
2.數據表的存儲引擎必須是InnoDB;
3.外鍵列和參照列必須具備類似的數據類型。其中數字的長度或是否有符號位必須相同;而字符的長度則能夠不一樣;
4.外鍵列和參照列必須建立索引。若是參照列不存在索引的話,MySQL將會自動建立索引。
在MySQL編輯文件my.ini中找到
default-storage-engine = INNODB
修改完成後重啓MySQL
mysql> CREATE TABLE province(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(20) NOT NULL
-> );
mysql> CREATE TABLE users(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(20) NOT NULL,
-> pid SMALLINT UNSIGNED, //數值類型和有無符號必須與父表相同
-> FOREIGN KEY (pid) REFERENCES province (id) //指定pid爲外鍵,並連接到province表
-> );
上述代碼中,包含外鍵的user表爲子表,而子表所參照的表province爲父表。
mysql> SHOW INDEXES FROM province\G;
*************************** 1. row ***************************
Table: province
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
即:建立主鍵時,會自動建立索引。
即:在外鍵約束建立之後,在更新表的時候,子表是否也進行相應的操做。
mysql> CREATE TABLE user1(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(10) NOT NULL,
-> pid SMALLINT UNSIGNED,
-> FOREIGN KEY (pid) REFERENCES province (id) ON DELETE CASCADE //指定pid爲外鍵
-> );
mysql> INSERT province (name) VALUES("Apple");
mysql> INSERT province (name) VALUES("Watermallon");
mysql> INSERT province (name) VALUES("Banana");
mysql> SELECT* FROM province;
+------+-------------+
| id | name |
+------+-------------+
| 1 | Apple |
| 2 | Watermallon |
| 3 | Banana |
+----+-------------+
mysql> INSERT user1(username,pid) VALUES("Huawei",3);
mysql> INSERT user1(username,pid) VALUES("iPhone",1);
mysql> INSERT user1(username,pid) VALUES("OPPO",2);
mysql> SELECT* FROM user1;
+----+--------------+---------+
| id | username | pid |
+----+--------------+----------+
| 2 | Huawei | 3 |
| 3 | iPhone | 1 |
| 4 | OPPO | 2 |
+----+---------------+---------+
mysql> DELETE FROM province WHERE id=3; //從父表中刪除id=3的記錄
mysql> SELECT* FROM province;
+----+-------------+
| id | name |
+----+-------------+
| 1 | Apple |
| 2 | Watermallon |
+----+-------------+
2 rows in set (0.00 sec) //父表中id=3的記錄被刪除了
mysql> SELECT* FROM user1;
+----+----------+------+
| id | username | pid |
+----+----------+------+
| 3 | iPhone | 1 |
| 4 | OPPO | 2 |
+----+----------+------+
2 rows in set (0.00 sec) //子表中也被刪除
保證數據的完整性和一致性;
約束分爲表級約束和列級約束:針對1個字段的成爲列級約束;針對2個及以上字段來進行使用,稱爲表級約束;
列級約束:既能夠在列定義時聲明,也能夠在列定義後聲明;
表級約束:只能在列定義之後再聲明;表級約束在實際開發過程當中幾乎不多用到。
按照功能劃分,分爲:
NOT NULL 非空約束;
PRIMARY KEY 主鍵約束;
UNIQUE KEY 惟一約束;
DEFAULT 默認約束;
FOREIGN KEY 外鍵約束;
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY[index_type](index_col_name, ...)
mysql> ALTER TABLE user2 ADD CONSTRAINT PK_user2_id PRIMARY KEY(id); //添加主鍵約束
mysql>ALTER TABLE user2 DROP PRIMARY KEY; //刪除主鍵約束
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY][index_name][index_type](index_col_name, ...)
ALTER TABLE tbl_name DROP {INDEX|KEY}index_name
ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY[index_type](index_col_name, ...) reference_definition
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol
ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFULT literal | DROP DEFAULT}
mysql> ALTER TABLE user2 ALTER id SET DEFAULT 15; //設定默認值
mysql> ALTER TABLE user2 ALTER id DROP DEFAULT; //去除默認值
INSERT [INTO] tbl_name [(col_name,...)] {VALUES |VALUE}({expr|DEFAULT},...),(...),...
單條插入:
mysql> INSERT user4 VALUES(NULL,"Jerry","password",34,1);
多條插入:
mysql> INSERT user4 VALUES(NULL,"Alin","11223344",19,0),(NULL,"Bob","12345677",DEFAULT,1);
//多條數據之間使用逗號做爲分隔符,使用DEFAULT賦值時默認使用默認值。
INSERT [INTO] tbl_name SET col_name = {expr|DEFAULT},...
與上述直接使用INSERT語句插入的區別在於,此方法能夠使用子查詢(SubQuery)。在實際開發過程當中,這種方式使用較少,一次只能插入一條記錄。
mysql> INSERT user4 SET username="Cherry",password="password";
INSERT [INTO] tbl_name [(col_name, ... )] SELECT ...
先按照select語句查找出結果,再將新的記錄添加在查找到的數據附近。
DELETE FROM tbl_name [WHERE where_condition]
mysql> DELETE FROM user4 WHERE id=3;
UPDATE [LOW PROIRITY] [IGNORE] table_reference SET col_name1 = {expr1 | DEFAULT}[col_name2 = {expr2 | DEFAULT}]...[WHERE where condition]
mysql> UPDATE user4 SET age=age+5;
mysql>UPDATE user4 SET age=age+id WHERE id%2=0;
數據表的操做中,查找操做幾乎佔到了80%,本節是重中之重。
查詢表達式:
每一個表達式表示想要的一列,必須至少有一個;
多個列之間以英文逗號分隔;
星號(*)表示全部列。tbl_name.*能夠表示命名錶的全部列; //user4.id,user4.username
查詢表達式能夠使用[AS]alias_name爲其賦予別名,別名可用於BROUP BY,ORDER BY,或HAVING子句;
SELECT id,username,password FROM user4;
查詢時,列顯示的前後順序能夠和原表有所不一樣。
2.關於別名:
mysql> SELECT username AS name,password AS mima FROM user4;
+-----------+--------------+
| name | mima |
+-----------+--------------+
| Jerry | password |
| Alin | 11223344 |
| Cherry | password |
+-----------+-------------+
使用別名時,必定要加上AS關鍵詞,不然若是忘記了逗號,數據表會錯把第二個名字當作別名顯示。
where用於對條件的過濾,若是沒有使用where則默認顯示全部的記錄
在where表達式中,能夠使用MySQL支持的函數或運算符
SELECT sex FROM user4 GROUP BY sex;
對查詢到的結果依據by後面的條件進行分組。
對查詢到結果進行分組時,使用having對分組進行條件的指定。
[ORDER BY {col_name | expr |position}[ASC | DESC], ... ]
用於對查詢結果進行排序。
mysql> SELECT* FROM user4 ORDER BY id DESC;
依次按照第一個條件、第二個條件進行排序。
限制查詢結果返回的數量。默認狀況是返回查詢到的全部記錄的。
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
SELECT* FROM user4 LIMIT 3; //從查詢結果中返回3條數據
SELECT* FROM user4 LIMIT 3,2; //從查詢到的第4條記錄開始,返回2條記錄。和數組相同從0開始計數。