SQL數據導入/導出
1.1 問題
使用SQL語句完成下列導出、導入操做:html
- 將/etc/passwd文件導入userdb庫userlist表並給每條記錄加編號
- 將userdb庫userlist表中UID小於100的前10條記錄導出,存爲/dbak/ulist.txt文件
1.2 步驟
實現此案例須要按照以下步驟進行。mysql
步驟一:將/etc/passwd文件導入MySQL數據庫正則表達式
導入後的表結構取決於/etc/passwd配置文件。若一時記不住各字段的含義,也能夠查看passwd配置文件的man手冊頁,找到格式描述相關的說明,好比:sql
- [root@dbsvr1 ~]# man 5 passwd
- .. ..
- Each line of the file describes a single user, and contains seven colon-sep‐
- arated fields:
- name:password:UID:GID:GECOS:directory:shell //各字段的順序、大體用途
- The field are as follows: //如下詳細解釋各字段的做用
- name This is the user's login name. It should not contain capital
- letters.
- password This is either the encrypted user password, an asterisk (*), or
- the letter 'x'. (See pwconv(8) for an explanation of 'x'.)
- UID The privileged root login account (superuser) has the user ID 0.
- GID This is the numeric primary group ID for this user. (Additional
- groups for the user are defined in the system group file; see
- group(5)).
- GECOS stands for "General Electric Comprehensive Operating Sys‐
- tem", which was renamed to GCOS when GE's large systems division
- was sold to Honeywell. Dennis Ritchie has reported: "Sometimes
- we sent printer output or batch jobs to the GCOS machine. The
- gcos field in the password file was a place to stash the infor‐
- mation for the $IDENTcard. Not elegant."
- directory This is the user's home directory: the initial directory where
- the user is placed after logging in. The value in this field is
- used to set the HOME environment variable.
- shell This is the program to run at login (if empty, use /bin/sh). If
- set to a nonexistent executable, the user will be unable to
- login through login(1). The value in this field is used to set
- the SHELL environment variable.
- .. ..
1)新建userdb庫、userlist表shell
以數據庫用戶root登入MySQL服務:數據庫
- [root@dbsvr1 ~]# mysql -u root -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 5
- Server version: 5.7.17 MySQL Community Server (GPL)
- Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
- mysql>
新建userdb庫,切換到userdb庫:api
- mysql> CREATE DATABASE userdb;
- Query OK, 1 row affected (0.00 sec)
- mysql> USE userdb;
- Database changed
新建userlist表,字段設置及相關操做參考以下:bash
- mysql> CREATE TABLE userlist(
- -> username varchar(24) NOT NULL,
- -> password varchar(48) DEFAULT 'x',
- -> uid int(5) NOT NULL,
- -> gid int(5) NOT NULL,
- -> fullname varchar(48),
- -> homedir varchar(64) NOT NULL,
- -> shell varchar(24) NOT NULL
- -> );
- Query OK, 0 rows affected (0.70 sec)
確認userlist表的結構:服務器
- mysql> DESC userlist;
- +----------+-------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +----------+-------------+------+-----+---------+-------+
- | username | varchar(24) | NO | | NULL | |
- | password | varchar(48) | YES | | x | |
- | uid | int(5) | NO | | NULL | |
- | gid | int(5) | NO | | NULL | |
- | fullname | varchar(48) | YES | | NULL | |
- | homedir | varchar(64) | NO | | NULL | |
- | shell | varchar(24) | NO | | NULL | |
- +----------+-------------+------+-----+---------+-------+
- 7 rows in set (0.01 sec)
2)若是直接導入會報錯。在MySQL 5.7.6版本以後,導入文件只能在secure_file_priv指定的文件夾下。執行show variables like '%secure%'命令顯示文件目錄:ssh
- mysql> LOAD DATA INFILE '/etc/passwd' INTO TABLE userlist FIELDS TERMINATED BY ':';
- ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
- mysql> show variables like '%secure%';
- +--------------------------+-----------------------+
- | Variable_name | Value |
- +--------------------------+-----------------------+
- | require_secure_transport | OFF |
- | secure_auth | ON |
- | secure_file_priv | /var/lib/mysql-files/ |
- +--------------------------+-----------------------+
- 3 rows in set (0.00 sec)
3)執行導入操做
將/etc/passwd文件複製到/var/lib/mysql-files/目錄下,
讀取/var/lib/mysql-files/passwd文件內容,以「:」爲分隔,導入到userlist表中:
- [root@dbsvr1 ~]#cp /etc/passwd /var/lib/mysql-files/
- mysql> LOAD DATA INFILE '/var/lib/mysql-files/passwd'
- -> INTO TABLE userlist
- -> FIELDS TERMINATED BY ':';
- Query OK, 39 rows affected (0.11 sec)
- Records: 39 Deleted: 0 Skipped: 0 Warnings: 0
上述操做中省略了行分隔 LINES TERMINATED BY '\n',由於這是默認的狀況(每行一條原始記錄),除非須要以其餘字符分割行,才須要用到這個。好比,如下操做指定了行分隔爲'\n',將/var /lib/mysql-files/passwd文件的內容導入另外一個表userlist2,最終userlist2表的內容與userlsit的內容是 同樣的:
4)確認導入結果
分別統計userlist、userlist2表內的記錄個數:
- mysql> SELECT COUNT(*) FROM userlist;
- +----------+
- | COUNT(*) |
- +----------+
- | 39 | //userlist表有39條記錄
- +----------+
- 1 row in set (0.00 sec)
- mysql> SELECT COUNT(*) FROM userlist2;
- +----------+
- | COUNT(*) |
- +----------+
- | 39 | //userlist表也有39條記錄
- +----------+
- 1 row in set (0.00 sec)
查看userlist表的前10條記錄,列出用戶名、UID、GID、宿主目錄、登陸Shell:
- mysql> SELECT username,uid,gid,homedir,shell
- -> FROM userlist LIMIT 10;
- +----------+-----+-----+-----------------+----------------+
- | username | uid | gid | homedir | shell |
- +----------+-----+-----+-----------------+----------------+
- | root | 0 | 0 | /root | /bin/bash |
- | bin | 1 | 1 | /bin | /sbin/nologin |
- | daemon | 2 | 2 | /sbin | /sbin/nologin |
- | adm | 3 | 4 | /var/adm | /sbin/nologin |
- | lp | 4 | 7 | /var/spool/lpd | /sbin/nologin |
- | sync | 5 | 0 | /sbin | /bin/sync |
- | shutdown | 6 | 0 | /sbin | /sbin/shutdown |
- | halt | 7 | 0 | /sbin | /sbin/halt |
- | mail | 8 | 12 | /var/spool/mail | /sbin/nologin |
- | operator | 11 | 0 | /root | /sbin/nologin |
- +----------+-----+-----+-----------------+----------------+
- 10 rows in set (0.00 sec)
查看userlist2表的前10條記錄,一樣列出用戶名、UID、GID、宿主目錄、登陸Shell:
- mysql> SELECT username,uid,gid,homedir,shell
- -> FROM userlist2 LIMIT 10;
- +----------+-----+-----+-----------------+----------------+
- | username | uid | gid | homedir | shell |
- +----------+-----+-----+-----------------+----------------+
- | root | 0 | 0 | /root | /bin/bash |
- | bin | 1 | 1 | /bin | /sbin/nologin |
- | daemon | 2 | 2 | /sbin | /sbin/nologin |
- | adm | 3 | 4 | /var/adm | /sbin/nologin |
- | lp | 4 | 7 | /var/spool/lpd | /sbin/nologin |
- | sync | 5 | 0 | /sbin | /bin/sync |
- | shutdown | 6 | 0 | /sbin | /sbin/shutdown |
- | halt | 7 | 0 | /sbin | /sbin/halt |
- | mail | 8 | 12 | /var/spool/mail | /sbin/nologin |
- | operator | 11 | 0 | /root | /sbin/nologin |
- +----------+-----+-----+-----------------+----------------+
- 10 rows in set (0.00 sec)
步驟二:爲userlist表中的每條記錄添加自動編號
這個只要修改userlist表結構,添加一個自增字段便可。
好比,添加一個名爲sn的序號列,做爲userlist表的第一個字段:
1)添加自增主鍵字段sn
- mysql> ALTER TABLE userlist
- -> ADD sn int(4) AUTO_INCREMENT PRIMARY KEY FIRST;
- Query OK, 0 rows affected (0.62 sec)
- Records: 0 Duplicates: 0 Warnings: 0
2)驗證自動編號結果
查看userlist表的前10條記錄,列出序號、用戶名、UID、GID、宿主目錄:
- mysql> SELECT sn,username,uid,gid,homedir
- -> FROM userlist LIMIT 10;
- +----+----------+-----+-----+-----------------+
- | sn | username | uid | gid | homedir |
- +----+----------+-----+-----+-----------------+
- | 1 | root | 0 | 0 | /root |
- | 2 | bin | 1 | 1 | /bin |
- | 3 | daemon | 2 | 2 | /sbin |
- | 4 | adm | 3 | 4 | /var/adm |
- | 5 | lp | 4 | 7 | /var/spool/lpd |
- | 6 | sync | 5 | 0 | /sbin |
- | 7 | shutdown | 6 | 0 | /sbin |
- | 8 | halt | 7 | 0 | /sbin |
- | 9 | mail | 8 | 12 | /var/spool/mail |
- | 10 | operator | 11 | 0 | /root |
- +----+----------+-----+-----+-----------------+
- 10 rows in set (0.00 sec)
步驟三:從MySQL數據庫中導出查詢結果
以將userdb庫userlist表中UID小於100的前10條記錄導出爲/var/lib/mysql-files/ulist.txt文件爲例。
1)確認存放導出數據的文件夾
- [root@dbsvr1 ~]# ls -ld /var/lib/mysql-files/
- drwxr-x---. 2 mysql mysql 19 4月 7 11:15 /var/lib/mysql-files/
2)導出userlsit表中UID小於100的前10條記錄
若是以默認的'\n' 爲行分隔,導出操做一樣可不指定LINES TERMINATED BY:
- mysql> SELECT * FROM userdb.userlist WHERE uid<100
- -> INTO OUTFILE '/var/lib/mysql-files/ulist.txt'
- -> FIELDS TERMINATED BY ':';
- Query OK, 24 rows affected (0.00 sec)
3)確認導出結果
返回到Shell命令行,查看/var/lib/mysql-files/ulist.txt文件的行數:
- [root@dbsvr1 ~]# wc -l /var/lib/mysql-files/ulist.txt
- 24 /var/lib/mysql-files/ulist.txt
查看/var/lib/mysql-files/ulist.txt文件的最後10行內容:
- [root@dbsvr1 ~]# tail /var/lib/mysql-files/ulist.txt
- 19:avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
- 24:rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
- 25:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
- 28:radvd:x:75:75:radvd user:/:/sbin/nologin
- 29:ntp:x:38:38::/etc/ntp:/sbin/nologin
- 33:gdm:x:42:42::/var/lib/gdm:/sbin/nologin
- 35:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
- 36:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
- 37:tcpdump:x:72:72::/:/sbin/nologin
- 39:mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
2 操做表記錄
2.1 問題
練習表記錄的操做
- 表記錄的插入
- 表記錄的更新
- 表記錄的查詢
- 表記錄的刪除
2.2 步驟
實現此案例須要按照以下步驟進行。
步驟一:建立stu_info表,並確保stu_info表記錄爲空。
在userdb庫中建立stu_info表:
- [root@dbsvr1 ~]# mysql -uroot -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 19
- Server version: 5.7.17 MySQL Community Server (GPL)
- Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
- mysql> use userdb;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
- Database changed
- mysql> CREATE TABLE stu_info(
- -> name varchar(12) NOT NULL,
- -> gender enum('boy','girl') DEFAULT 'boy',
- -> age int(3) NOT NULL
- -> );
- Query OK, 0 rows affected (0.23 sec)
刪除stu_info表的全部記錄:
- mysql> DELETE FROM stu_info;
- Query OK, 0 rows affected (0.00 sec) //stu_info表剛創建 刪除零條記錄
確認刪除結果:
- mysql> SELECT * FROM stu_info;
- Empty set (0.00 sec)
步驟二:練習表記錄的操做
1)插入記錄時,指定記錄的每個字段的值
這種狀況下,不須要明確指出字段,但每條記錄的值的順序、類型都必須與表格結構向一致,不然可能沒法正確插入記錄。
好比,如下操做將向stu_info表插入3條表記錄:
- mysql> INSERT stu_info VALUES
- -> ('Jim','girl',24),
- -> ('Tom','boy',21),
- -> ('Lily','girl',20);
- Query OK, 3 rows affected (0.15 sec)
- Records: 3 Duplicates: 0 Warnings: 0
完成插入後確認表記錄:
- mysql> SELECT * FROM stu_info;
- +------+--------+-----+
- | name | gender | age |
- +------+--------+-----+
- | Jim | girl | 24 |
- | Tom | boy | 21 |
- | Lily | girl | 20 |
- +------+--------+-----+
- 3 rows in set (0.00 sec)
2)插入記錄時,只指定記錄的部分字段的值
這種狀況下,必須指出各項值所對應的字段;並且,未賦值的字段應設置有默認值或者有自增填充屬性或者容許爲空,不然插入操做將會失敗。
好比,向stu_info表插入Jerry的年齡信息,性別爲默認的「boy」,自動編號,相關操做以下:
- mysql> INSERT INTO stu_info(name,age)
- -> VALUES('Jerry',27);
- Query OK, 1 row affected (0.04 sec)
相似的,再插入用戶Mike的年齡信息:
- mysql> INSERT INTO stu_info(name,age)
- -> VALUES('Mike',21);
- Query OK, 1 row affected (0.05 sec)
確認目前stu_info表的全部記錄:
- mysql> SELECT * FROM stu_info;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jim | girl | 24 |
- | Tom | boy | 21 |
- | Lily | girl | 20 |
- | Jerry | boy | 27 |
- | Mike | boy | 21 |
- +-------+--------+-----+
- 5 rows in set (0.00 sec)
3)更新表記錄時,若未限制條件,則適用於全部記錄
將stu_info表中全部記錄的age設置爲10:
- mysql> UPDATE stu_info SET age=10;
- Query OK, 5 rows affected (0.04 sec)
- Rows matched: 5 Changed: 5 Warnings: 0
確認更新結果:
- mysql> SELECT * FROM stu_info;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jim | girl | 10 |
- | Tom | boy | 10 |
- | Lily | girl | 10 |
- | Jerry | boy | 10 |
- | Mike | boy | 10 |
- +-------+--------+-----+
- 5 rows in set (0.00 sec)
4)更新表記錄時,能夠限制條件,只對符合條件的記錄有效
將stu_info表中全部性別爲「boy」的記錄的age設置爲20:
- mysql> UPDATE stu_info SET age=20
- -> WHERE gender='boy';
- Query OK, 3 rows affected (0.04 sec)
- Rows matched: 3 Changed: 3 Warnings: 0
確認更新結果:
- mysql> SELECT * FROM stu_info;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jim | girl | 10 |
- | Tom | boy | 20 |
- | Lily | girl | 10 |
- | Jerry | boy | 20 |
- | Mike | boy | 20 |
- +-------+--------+-----+
- 5 rows in set (0.00 sec)
5)刪除表記錄時,能夠限制條件,只刪除符合條件的記錄
刪除stu_info表中年齡小於18的記錄:
- mysql> DELETE FROM stu_info WHERE age < 18;
- Query OK, 2 rows affected (0.03 sec)
確認刪除結果:
- mysql> SELECT * FROM stu_info;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Tom | boy | 20 |
- | Jerry | boy | 20 |
- | Mike | boy | 20 |
- +-------+--------+-----+
- 3 rows in set (0.00 sec)
6)刪除表記錄時,若是未限制條件,則會刪除全部的表記錄
刪除stu_info表的全部記錄:
- mysql> DELETE FROM stu_info;
- Query OK, 3 rows affected (0.00 sec)
確認刪除結果:
- mysql> SELECT * FROM stu_info;
- Empty set (0.00 sec)
3 查詢及匹配條件
3.1 問題
練習常見的SQL查詢及條件設置
- 建立stu_info表,並插入數據
- 練習常見SQL查詢及條件設置
3.2 步驟
實現此案例須要按照以下步驟進行。
步驟一:根據任務要求創建員工檔案表stu_info(如上個實驗已建立,可將上個實驗stu_info表中記錄清除後繼續使用)
1)在userdb庫中建立stu_info表
以root用戶登入MySQL服務器:
- [root@dbsvr1 ~]# mysql -u root -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 5
- Server version: 5.6.15 MySQL Community Server (GPL)
- Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
- Oracle is a registered trademark of Oracle Corporation and/or its
- affiliates. Other names may be trademarks of their respective
- owners.
- Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
- mysql>
打開test庫:
- mysql> USE userdb;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
- Database changed
建立stu_info表,包括name、gender、age三個字段:
- mysql> CREATE TABLE stu_info(
- -> name varchar(12) NOT NULL,
- -> gender enum('boy','girl') DEFAULT 'boy',
- -> age int(3) NOT NULL
- -> );
- Query OK, 0 rows affected (0.03 sec)
確認表結構:
- mysql> DESC stu_info;
- +--------+--------------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +--------+--------------------+------+-----+---------+-------+
- | name | varchar(12) | NO | | NULL | |
- | gender | enum('boy','girl') | YES | | boy | |
- | age | int(3) | NO | | NULL | |
- +--------+--------------------+------+-----+---------+-------+
- 3 rows in set (0.01 sec)
2)準備測試表格
向創建的stu_info表插入幾條測試記錄
- mysql> INSERT INTO stu_info VALUES
- -> ('Jim','girl',24),
- -> ('Tom','boy',21),
- -> ('Lily','girl',20),
- -> ('Jerry','boy',27),
- -> ('Mike','boy',21)
- -> ;
- Query OK, 5 rows affected (0.06 sec)
- Records: 5 Duplicates: 0 Warnings: 0
確認stu_info表的全部記錄內容:
- mysql> SELECT * FROM stu_info;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jim | girl | 24 |
- | Tom | boy | 21 |
- | Lily | girl | 20 |
- | Jerry | boy | 27 |
- | Mike | boy | 21 |
- +-------+--------+-----+
- 5 rows in set (0.00 sec)
步驟二:練習常見SQL查詢及條件設置
1)經常使用的表記錄統計函數
查詢stu_info表一共有多少條記錄(本例中爲5條):
- mysql> SELECT count(*) FROM stu_info;
- +----------+
- | count(*) |
- +----------+
- | 5 |
- +----------+
- 1 row in set (0.00 sec)
計算stu_info表中各學員的平均年齡、最大年齡、最小年齡:
- mysql> SELECT avg(age),max(age),min(age) FROM stu_info;
- +----------+----------+----------+
- | avg(age) | max(age) | min(age) |
- +----------+----------+----------+
- | 22.6000 | 27 | 20 |
- +----------+----------+----------+
- 1 row in set (0.00 sec)
計算stu_info表中男學員的個數:
- mysql> SELECT count(gender) FROM stu_info WHERE gender='boy';
- +---------------+
- | count(gender) |
- +---------------+
- | 3 |
- +---------------+
- 1 row in set (0.00 sec)
2)字段值的數值比較
列出stu_info表中年齡爲21歲的學員記錄:
- mysql> SELECT * FROM stu_info WHERE age=21;
- +------+--------+-----+
- | name | gender | age |
- +------+--------+-----+
- | Tom | boy | 21 |
- | Mike | boy | 21 |
- +------+--------+-----+
- 2 rows in set (0.00 sec)
列出stu_info表中年齡超過21歲的學員記錄:
- mysql> SELECT * FROM stu_info WHERE age>21;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jim | girl | 24 |
- | Jerry | boy | 27 |
- +-------+--------+-----+
- 2 rows in set (0.00 sec)
列出stu_info表中年齡大於或等於21歲的學員記錄:
- mysql> SELECT * FROM stu_info WHERE age>=21;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jim | girl | 24 |
- | Tom | boy | 21 |
- | Jerry | boy | 27 |
- | Mike | boy | 21 |
- +-------+--------+-----+
- 4 rows in set (0.00 sec)
列出stu_info表中年齡在20歲和24歲之間的學員記錄:
- mysql> SELECT * FROM stu_info WHERE age BETWEEN 20 and 24;
- +------+--------+-----+
- | name | gender | age |
- +------+--------+-----+
- | Jim | girl | 24 |
- | Tom | boy | 21 |
- | Lily | girl | 20 |
- | Mike | boy | 21 |
- +------+--------+-----+
- 4 rows in set (0.00 sec)
3)多個條件的組合
列出stu_info表中年齡小於23歲的女學員記錄:
- mysql> SELECT * FROM stu_info WHERE age < 23 AND gender='girl';
- +------+--------+-----+
- | name | gender | age |
- +------+--------+-----+
- | Lily | girl | 20 |
- +------+--------+-----+
- 1 row in set (0.00 sec)
列出stu_info表中年齡小於23歲的學員,或者女學員的記錄:
- mysql> SELECT * FROM stu_info WHERE age < 23 OR gender='girl';
- +------+--------+-----+
- | name | gender | age |
- +------+--------+-----+
- | Jim | girl | 24 |
- | Tom | boy | 21 |
- | Lily | girl | 20 |
- | Mike | boy | 21 |
- +------+--------+-----+
- 4 rows in set (0.00 sec)
若是某個記錄的姓名屬於指定範圍內的一個,則將其列出:
- mysql> SELECT * FROM stu_info WHERE name IN
- -> ('Jim','Tom','Mickey','Minnie');
- +------+--------+-----+
- | name | gender | age |
- +------+--------+-----+
- | Jim | girl | 24 |
- | Tom | boy | 21 |
- +------+--------+-----+
- 2 rows in set (0.00 sec)
4)使用SELECT作數學計算
計算1234與5678的和:
- mysql> SELECT 1234+5678;
- +-----------+
- | 1234+5678 |
- +-----------+
- | 6912 |
- +-----------+
- 1 row in set (0.00 sec)
計算1234與5678的乘積:
- mysql> SELECT 1234*5678;
- +-----------+
- | 1234*5678 |
- +-----------+
- | 7006652 |
- +-----------+
- 1 row in set (0.00 sec)
計算1.23456789除以3的結果:
- mysql> SELECT 1.23456789/3;
- +----------------+
- | 1.23456789/3 |
- +----------------+
- | 0.411522630000 |
- +----------------+
- 1 row in set (0.00 sec)
輸出stu_info表各學員的姓名、15年後的年齡:
- mysql> SELECT name,age+15 FROM stu_info;
- +-------+--------+
- | name | age+15 |
- +-------+--------+
- | Jim | 39 |
- | Tom | 36 |
- | Lily | 35 |
- | Jerry | 42 |
- | Mike | 36 |
- +-------+--------+
- 5 rows in set (0.00 sec)
5)使用模糊查詢,LIKE引領
如下劃線 _ 匹配單個字符,% 可匹配任意多個字符。
列出stu_info表中姓名以「J」開頭的學員記錄:
- mysql> SELECT * FROM stu_info WHERE name LIKE 'J%';
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jim | girl | 24 |
- | Jerry | boy | 27 |
- +-------+--------+-----+
- 2 rows in set (0.00 sec)
列出stu_info表中姓名以「J」開頭且只有3個字母的學員記錄:
- mysql> SELECT * FROM stu_info WHERE name LIKE 'J__';
- +------+--------+-----+
- | name | gender | age |
- +------+--------+-----+
- | Jim | girl | 24 |
- +------+--------+-----+
- 1 row in set (0.00 sec)
6)使用正則表達式,REGEXP引領
列出stu_info表中姓名以「J」開頭且以「y」結尾的學員記錄:
- mysql> SELECT * FROM stu_info WHERE name REGEXP '^J.*y$';
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jerry | boy | 27 |
- +-------+--------+-----+
- 1 row in set (0.00 sec)
效果等同於:
- mysql> SELECT * FROM stu_info WHERE name Like 'J%y';
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jerry | boy | 27 |
- +-------+--------+-----+
- 1 row in set (0.00 sec)
列出stu_info表中姓名以「J」開頭或者以「y」結尾的學員記錄:
- mysql> SELECT * FROM stu_info WHERE name REGEXP '^J|y$';
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jim | girl | 24 |
- | Lily | girl | 20 |
- | Jerry | boy | 27 |
- +-------+--------+-----+
- 3 rows in set (0.00 sec)
效果等同於:
- mysql> SELECT * FROM stu_info WHERE name Like 'J%' OR name Like '%y';
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jim | girl | 24 |
- | Lily | girl | 20 |
- | Jerry | boy | 27 |
- +-------+--------+-----+
- 3 rows in set (0.00 sec)
7)按指定的字段排序,ORDER BY
列出stu_info表的全部記錄,按年齡排序:
- mysql> SELECT * FROM stu_info GROUP BY age;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Lily | girl | 20 |
- | Tom | boy | 21 |
- | Jim | girl | 24 |
- | Jerry | boy | 27 |
- +-------+--------+-----+
- 4 rows in set (0.00 sec)
因默認爲升序(Ascend)排列,因此上述操做等效於:
- mysql> SELECT * FROM stu_info GROUP BY age ASC;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Lily | girl | 20 |
- | Tom | boy | 21 |
- | Jim | girl | 24 |
- | Jerry | boy | 27 |
- +-------+--------+-----+
- 4 rows in set (0.00 sec)
若要按降序(Descend)排列,則將ASC改成DESC便可:
- mysql> SELECT * FROM stu_info GROUP BY age DESC;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jerry | boy | 27 |
- | Jim | girl | 24 |
- | Tom | boy | 21 |
- | Lily | girl | 20 |
- +-------+--------+-----+
- 4 rows in set (0.00 sec)
8)限制查詢結果的輸出條數,LIMIT
查詢stu_info表的全部記錄,只列出前3條:
- mysql> SELECT * FROM stu_info LIMIT 3;
- +------+--------+-----+
- | name | gender | age |
- +------+--------+-----+
- | Jim | girl | 24 |
- | Tom | boy | 21 |
- | Lily | girl | 20 |
- +------+--------+-----+
- 3 rows in set (0.00 sec)
列出stu_info表中年齡最大的3條學員記錄:
- mysql> SELECT * FROM stu_info GROUP BY age DESC LIMIT 3;
- +-------+--------+-----+
- | name | gender | age |
- +-------+--------+-----+
- | Jerry | boy | 27 |
- | Jim | girl | 24 |
- | Tom | boy | 21 |
- +-------+--------+-----+
- 3 rows in set (0.00 sec)
9)分組查詢結果,GROUP BY
針對stu_info表,按性別分組,分別統計出男、女學員的人數:
- mysql> SELECT gender,count(gender) FROM stu_info GROUP BY gender;
- +--------+---------------+
- | gender | count(gender) |
- +--------+---------------+
- | boy | 3 |
- | girl | 2 |
- +--------+---------------+
- 2 rows in set (0.00 sec)
列出查詢字段時,能夠經過AS關鍵字來指定顯示別名,好比上述操做可改成:
- mysql> SELECT gender AS '性別',count(gender) AS '人數'
- -> FROM stu_info GROUP BY gender;
- +--------+--------+
- | 性別 | 人數 |
- +--------+--------+
- | boy | 3 |
- | girl | 2 |
- +--------+--------+
- 2 rows in set (0.00 sec)