1、數據庫操做mysql
(1)查看當前系統上已有的數據庫:正則表達式
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) mysql>
(2)新建數據庫:sql
mysql> CREATE DATABASE test; ERROR 1007 (HY000): Can't create database 'test'; database exists mysql>
在建立數據庫時,若是這個數據庫存在,那麼系統會報錯;數據庫
假使咱們將這個語句寫到腳本中,那麼我腳本將會終止執行,爲了不這樣的事情,能夠事先進行判斷該數據看是否存在緩存
例如:bash
mysql> CREATE DATABASE IF NOT EXISTS test; Query OK, 1 row affected, 1 warning (0.00 sec) mysql>
加入判斷(IF NOT EXISTS)這樣就忽略掉了提示也就不會中斷腳本的執行ide
,可是咱們能夠看到有一個警告:函數
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掉表
2、表結構:
對於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後添加此項)
3、表查詢操做:
單表查詢:
多表查詢:
選擇和投影
選擇:挑選符合條件的行
投影:挑選要現實的字段
投影: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>
一、新增字段:
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>
二、將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>
三、將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>
一、以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>
二、以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>
三、以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>
四、以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>