一、數據庫操作
(1)查看當前系統上已有的數據庫:
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) mysql>
(2)新建數據庫:
mysql> CREATE DATABASE test; ERROR 1007 (HY000): Can't create database 'test'; database exists mysql>
在創建數據庫時,如果這個數據庫存在,那麼系統會報錯;
假使我們將這個語句寫到腳本中,那麼我腳本將會終止執行,爲了避免這樣的事情,可以事先進行判斷該數據看是否存在
例如:
mysql> CREATE DATABASE IF NOT EXISTS test; Query OK, 1 row affected, 1 warning (0.00 sec) mysql>
加入判斷(IF NOT EXISTS)這樣就忽略掉了提示也就不會中斷腳本的執行
,但是我們可以看到有一個警告:
mysql> SHOW WARNINGS; +-------+------+-----------------------------------------------+ | Level | Code | Message | +-------+------+-----------------------------------------------+ | Note | 1007 | Can't create database 'test'; database exists | +-------+------+-----------------------------------------------+ 1 row in set (0.00 sec) mysql>
例如:
mysql> CREATE DATABASE mydb; Query OK, 1 row affected (0.00 sec) mysql> SHOW DATABASES;; +--------------------+ | Database | +--------------------+ | information_schema | | mydb | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) ERROR: No query specified mysql>
2.刪除數據庫
在刪除前判斷這個數據庫是否存在,存在的話執行才成功,如果在腳本中那麼一樣會被中斷執行
mysql> DROP DATABASE testdb; ERROR 1008 (HY000): Can't drop database 'testdb'; database doesn't exist
所以還是需要事先判斷:
mysql> DROP DATABASE IF EXISTS testdb; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +-------+------+------------------------------------------------------+ | Level | Code | Message | +-------+------+------------------------------------------------------+ | Note | 1008 | Can't drop database 'testdb'; database doesn't exist | +-------+------+------------------------------------------------------+ 1 row in set (0.00 sec) mysql>
3.設定字符集或者排序規則
在我們把一個數據庫從一個低版本升級到一個高版本以後,有時有需要手動的將有些特定庫的數據字典升級
具體用法如下:
ALTER {DATABASE | SCHEMA} [db_name] alter_specification ... ALTER {DATABASE | SCHEMA} db_name UPGRADE DATA DIRECTORY NAME alter_specification: [DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name
4.修改數據名
唯一做法:將數據庫備份後,刪除庫,待新建好後導入表
5.創建表:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,......) [table_options] (create_definition,......)
字段的定義:字段名、類型和類型修飾符
鍵、約束或索引
PRIMARY KEY, UNIQUE KEY, FROEIGN KEY, CHECK {INDEX|KEY}
[table_options]
ENGINE [=] engine_name AUTO_INCREMENT [=] value [DEFAULT] COMMONT [=] DELAY_KEY_WRITE [=] {0 | 1} 對提高性能有所幫助 INDEX_DIRECTORY [=] 'PATH' 索引位置 DATA DIRECTORY [=] 'PATH' ROW_FORMAT
表創建第二種方式: 基於某張表創建一張表,複製表數據
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,......) [table_options] select_statement
表創建第三種方式: 基於某張表創建一張表,複製表結構
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name {LIKE old_tbl_name | (LIKE old_tbl_name)}
6.刪除表:
DROP [TEMPORARY] TABLE [IF EXTSTS] tbl_name [,tbl_name...]
7.表修改:
ALTER TABLE tbl_name [alter_specification [, alter_specification]...]
修改字段定義:
插入新字段
刪除字段 ALTER TABLE tb_name DROP col_name
修改字段
修改字段名稱
修改字段類型及屬性等
MODIFY
修改約束、鍵或索引:
8.表改名:
mysql>RENAME TABLE old_tbl_name TO new_tbl_name
9.表插入(3種方式)
1.{INSERT|REPLACE} INTO tb_name [(col1, col2,....)] {VAULES|VALUE}(val, val2,...) [,(val21, val22,....),.....] 2.{INSERT|REPLACE} INTO tb_naem SET col1=val1, clo2=val2,..... 3.INSERT INTO tb_name SELECT clause
REPLACE的工作機制:與INSERT相同,除了在新插入的數據與表中的主鍵或者惟一鍵索引定義的數據相同會替換老的行
10.表更新
UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1=val1 [, col_name2=val2] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
通常情況下,必須要使用WHERE字句,或者使用LIMIT限制要修改的行數
11.表中字段刪除:
--safe-updates DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
如果目的是清空整張表,則可使用mysql>TUNCATE tb_name
或者是將表結構複製出來後DROP掉表
二、表結構:
對於MyISAM,每個表有三個文件
tb_name.frm:表結構定義
tb_name.MYD:數據文件
tb_name.MYI:索引文件
對於InnoDB表,有兩種存儲方式
1.innodb_file_per_table=OFF
默認:每表有一個獨立文件和一個多表共享的文件
tb_name.frm:表結構定義,位於數據庫目錄中
ibdata#:共享的表空間,默認位於數據目錄(datadir指向)
2.innodb_file_per_table=ON
獨立的表空間:
每個表在數據庫目錄下存儲兩個文件
tb_name.frm:每表有一個表結構文件
tb_name.ibd:一個獨有的表空間
開啓獨立的表空間功能:
配置文件/etc/my.cnf中[mysqld]字段中添加:innodb_file_per_table=ON(建議安裝完mysql後添加此項)
三、表查詢操作:
單表查詢:
多表查詢:
選擇和投影
選擇:挑選符合條件的行
投影:挑選要現實的字段
投影:SELECT 字段1, 字段2, ......FROM tb_name;
SELECT * FROM tb_name;
選擇:SELECT 字段1,......FROM tb_name WHERE 子句;
布爾條件表達式
布爾條件表達式操作符:
IS NOLL
mysql>SELECT * FROM tb_name WHERE 字段 IS NOLL;
IS NOT NULL
字符串比較
LIKE {% | _ } 支持通配符
%:任意長度的任意字符
_ :任意單個字符
RLIKE,REGEXP 支持使用正則表達式()
IN :用於判斷指定字段的值是否在給定的列表中;
BETWEEN....AND.... :用於判斷指定的字段的值表示在某個字段值之間
A>=20 AND X<40
X BETWEEN 20 AND 40
組合條件測試:
NOT, !
AND, &&
OR, ||
ORDER BY ..(默認升序)
ASC 升序
DESC 降序
聚合函數:
SUM( ), 求和
AVG( ), 平均值
MAX( ), 最大值
MIN( ), 最小值
COUNT( ), 統計
mysql>SELECT XXX(字段) FROM tb_name [WHERE 子句]
分組:
GROUP BY
對GROUP BY過濾的子句
HAVING
LIMIT N[,M]
N:指定哪行
M:偏移
SELECT語句的執行流程:
FROM Clause --> WHERE clause -->GROUP BY -->HAVING clause --> ORDER BY ... --> SELECT --> LIMIT -->END
SELECT常用結合使用方式
SELECT ... SELECT ... FROM ... ORDER BY ... SELECT ... FROM ... GROUP BY ... HAVING ... SELECT ... FROM ... WHERE ... SELECT ... FROM ... WHERE ... GROUP BY ... LIMIT SELECT ... FROM ... HAVING
SELECT 常用修飾符:
DISTINCT: 指定的結果想通過的只顯示一次;
SQL_CACHE: 明確說明需要將執行結果緩存於查詢緩存中;
SQL_NO_CACHE: 明確說明不需要將執行結果緩存於查詢緩存中;
MySQL多表查詢和子查詢:
交叉聯結 (笛卡爾乘積) 避免使用
內聯結(Inner Jion):通過匹配兩個表之間的等值關係,建立的聯結
例如:
SELECT * FROM student,cources WHERE students.CID1=cources.CID;
外聯結(Outer Jion) 兩個表之間不是等值關係,一個表中可能沒有值。
左外 SELECT...FROM...LEFT JION...ON...
以左表爲基準,右表沒有就顯示爲空。 (不需要where)
例如:
SELECT name,cname FROM student LEFT JION courses ON student.CID1=courses.CID
右外 SELECT...FROM...RIGHT JION...ON... 以右表爲基準,左表可能爲空。(不需要where)
完全外
自聯結 (SELF JION): 同一個表的兩個字段建立聯繫。
例如:
SELECT s1.name,s2.name FROM students AS s1,students AS s2 WHERE s1.TID=s2.SID
聯合(UNION):將兩個字段的查詢結果聯結在一起(也就是將兩個查詢語句用UNION聯合起來)
子查詢:在查詢中嵌套的查詢
用於Where中的子查詢
1.用於比較表達式中的子查詢 子查詢的返回值只能有一個 2.用於EXISTS中的子查詢 判斷存在與否,可以返回多個值 3.用於IN中的子查詢 判斷存在指定列表中,可以返回多個值
用於FROM中的子查詢:
SELECT alias.col,....from (SELECT clause) AS alias WHERE condition
MySQL的聯合查詢:
把兩個或多個查詢語句的結果合併成一個結果進行輸出:
SELECT clauase UNBION SELECT clauase UNION ...
在整個查詢語句前面使用"EXPLAIN"顯示語句執行過程
查詢表的索引
mysql>SHOW INDEXES FROM tb_name
MySQL視圖
創建視圖:CREATE VIEW view_name AS select_statemen; select_statement表示SELECT語句,將SELECT語句查詢得到的表建立爲一個視圖。
刪除視圖:DROP VIEW view_name
顯示創建view的命令:SHOW CREATE VIEW view_name
虛表中插入數據時查看基表是否允許,但mysql中不允許向視圖中插入數據。
對視圖的查詢就是一種子查詢,在實際操作中應避免子查詢。
練習題:
新建如下表(包括結構和內容):
ID Name Age Gender Course 1 Ling Huchong 24 Male Hamogong 2 Huang Rong 19 Female Chilian Shenzhang 3 Lu Wushaung 18 Female Jiuyang Shenggong 4 Zhu Ziliu 52 Male Pixie Jianfa 5 Chen Jialuo 22 Male Xianglong Shiba Zhang 6 Ou Yangfeng 70 Male Shenxiang Bannuo Gong
操作步驟:
#創建庫 mysql> CREATE DATABASE mydb Query OK, 1 row affected (0.00 sec) mysql> USE mydb Database changed #創建表 mysql> CREATE TABLE students ( -> ID INT AUTO_INCREMENT UNIQUE KEY, -> Name CHAR(30), -> Age TINYINT UNSIGNED NOT NULL, -> GENDER ENUM('Male','Female') NOT NULL, -> Corse VARCHAR(50) NOT NULL); Query OK, 0 rows affected (0.02 sec) #查看錶 mysql> SHOW TABLES ; +----------------+ | Tables_in_mydb | +----------------+ | students | +----------------+ 1 row in set (0.00 sec) #查看錶結構 mysql> DESC students; +--------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+-----------------------+------+-----+---------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | Name | char(30) | YES | | NULL | | | Age | tinyint(3) unsigned | NO | | NULL | | | GENDER | enum('Male','Female') | NO | | NULL | | | Corse | varchar(50) | NO | | NULL | | +--------+-----------------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec) #添加表內容 mysql> INSERT INTO students (ID,Name,Age,Gender,Course) VALUES -> (1,'Ling Huchong',24,'Male','Hamogong'), -> (2,'Huang Rong',19,'Female','Chilian Shenzhang'), -> (3,'Lu Wushaung',18,'Female','Jiuyang Shenggong'), -> (4,'Zhu Ziliu',52,'Male','Pixie Jianfa'), -> (5,'Chen Jialuo',22,'Male','Xianglong Shiba Zhang'), -> (6,'Ou Yangfeng',70,'Male','Shenxiang Bannuo Gong'); Query OK, 6 rows affected (0.01 sec) Records: 6 Duplicates: 0 Warnings: 0 #查看錶內容: mysql> SELECT * FROM students; +----+--------------+-----+--------+-----------------------+ | ID | Name | Age | GENDER | Course | +----+--------------+-----+--------+-----------------------+ | 1 | Ling Huchong | 24 | Male | Hamogong | | 2 | Huang Rong | 19 | Female | Chilian Shenzhang | | 3 | Lu Wushaung | 18 | Female | Jiuyang Shenggong | | 4 | Zhu Ziliu | 52 | Male | Pixie Jianfa | | 5 | Chen Jialuo | 22 | Male | Xianglong Shiba Zhang | | 6 | Ou Yangfeng | 70 | Male | Shenxiang Bannuo Gong | +----+--------------+-----+--------+-----------------------+ 6 rows in set (0.00 sec) mysql>
1、新增字段:
Class 字段定義自行選擇;放置於Name字段後;
mysql> ALTER TABLE students ADD Class INT NULL AFTER Name; Query OK, 6 rows affected (0.02 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM students; +----+--------------+-------+-----+--------+-----------------------+ | ID | Name | Class | Age | GENDER | Course | +----+--------------+-------+-----+--------+-----------------------+ | 1 | Ling Huchong | NULL | 24 | Male | Hamogong | | 2 | Huang Rong | NULL | 19 | Female | Chilian Shenzhang | | 3 | Lu Wushaung | NULL | 18 | Female | Jiuyang Shenggong | | 4 | Zhu Ziliu | NULL | 52 | Male | Pixie Jianfa | | 5 | Chen Jialuo | NULL | 22 | Male | Xianglong Shiba Zhang | | 6 | Ou Yangfeng | NULL | 70 | Male | Shenxiang Bannuo Gong | +----+--------------+-------+-----+--------+-----------------------+ 6 rows in set (0.00 sec) mysql>
2、將ID字段名稱修改爲TID;
mysql> ALTER TABLE students CHANGE ID TID INT AUTO_INCREMENT UNIQUE KEY; Query OK, 6 rows affected (0.02 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM students; +-----+--------------+-------+--------+-----------------------+-----+ | TID | Name | Class | GENDER | Course | Age | +-----+--------------+-------+--------+-----------------------+-----+ | 1 | Ling Huchong | NULL | Male | Hamogong | 24 | | 2 | Huang Rong | NULL | Female | Chilian Shenzhang | 19 | | 3 | Lu Wushaung | NULL | Female | Jiuyang Shenggong | 18 | | 4 | Zhu Ziliu | NULL | Male | Pixie Jianfa | 52 | | 5 | Chen Jialuo | NULL | Male | Xianglong Shiba Zhang | 22 | | 6 | Ou Yangfeng | NULL | Male | Shenxiang Bannuo Gong | 70 | +-----+--------------+-------+--------+-----------------------+-----+ 6 rows in set (0.00 sec) mysql>
3、將Age字段放置最後;
mysql> ALTER TABLE students MODIFY Age TINYINT UNSIGNED NOT NULL AFTER Course; Query OK, 6 rows affected (0.02 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM students; +----+--------------+-------+--------+-----------------------+-----+ | ID | Name | Class | GENDER | Course | Age | +----+--------------+-------+--------+-----------------------+-----+ | 1 | Ling Huchong | NULL | Male | Hamogong | 24 | | 2 | Huang Rong | NULL | Female | Chilian Shenzhang | 19 | | 3 | Lu Wushaung | NULL | Female | Jiuyang Shenggong | 18 | | 4 | Zhu Ziliu | NULL | Male | Pixie Jianfa | 52 | | 5 | Chen Jialuo | NULL | Male | Xianglong Shiba Zhang | 22 | | 6 | Ou Yangfeng | NULL | Male | Shenxiang Bannuo Gong | 70 | +----+--------------+-------+--------+-----------------------+-----+ 6 rows in set (0.00 sec) mysql>
練習二:以下操作在students表上執行
mysql> select * from students; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 7 | Xi Ren | 19 | F | 3 | NULL | | 8 | Lin Daiyu | 17 | F | 7 | NULL | | 9 | Ren Yingying | 20 | F | 6 | NULL | | 10 | Yue Lingshan | 19 | F | 3 | NULL | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | | 12 | Wen Qingqing | 19 | F | 1 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | | 15 | Duan Yu | 19 | M | 4 | NULL | | 16 | Xu Zhu | 21 | M | 1 | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | | 19 | Xue Baochai | 18 | F | 6 | NULL | | 20 | Diao Chan | 19 | F | 7 | NULL | | 21 | Huang Yueying | 22 | F | 6 | NULL | | 22 | Xiao Qiao | 20 | F | 1 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | +-------+---------------+-----+--------+---------+-----------+ 25 rows in set (0.00 sec) mysql>
1、以ClassID分組,顯示每班的同學的人數,除了空組;
mysql> SELECT ClassID ,Count(Name) FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID; +---------+-------------+ | ClassID | Count(Name) | +---------+-------------+ | 1 | 4 | | 2 | 3 | | 3 | 4 | | 4 | 4 | | 5 | 1 | | 6 | 4 | | 7 | 3 | +---------+-------------+ 7 rows in set (0.00 sec) mysql>
2、以Gender分組,顯示其年齡之和;
mysql> SELECT Gender,SUM(Age) FROM students GROUP BY Gender; +--------+----------+ | Gender | SUM(Age) | +--------+----------+ | F | 190 | | M | 495 | +--------+----------+ 2 rows in set (0.00 sec) mysql>
3、以ClassID分組,顯示其平均年齡大於25的班級,除了空組;
mysql> SELECT ClassID,AVG(Age) FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID HAVING AVG(Age) >25; +---------+----------+ | ClassID | AVG(Age) | +---------+----------+ | 2 | 36.0000 | | 5 | 46.0000 | +---------+----------+ 2 rows in set (0.00 sec) mysql>
4、以Gender分組,顯示各組中年齡大於25的學員的年齡之和;
mysql> SELECT Gender,SUM(Age) FROM students WHERE Age >25 GROUP BY Gender ; +--------+----------+ | Gender | SUM(Age) | +--------+----------+ | M | 317 | +--------+----------+ 1 row in set (0.00 sec) mysql>