Mysql知識總結(二)

一、數據庫操作

(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  子句;

          布爾條件表達式

     布爾條件表達式操作符:

wKiom1NE7e_yacLUAAEs_3KPFTQ115.jpg

wKioL1NE7gXCwfqPAADS780LYV4159.jpg

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>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章