前提條件
首先創建SQL測試文件,其中創建了一個庫兩個表,用於測試。
文件名稱:test.sql
/*------------員工信息庫-------------*/
create database staff;
use staff;
create table yunwei(id int not null primary key,name char(4) not null,age tinyint(3) unsigned not null,sex enum('man','woman') not null);
create table caiwu(id int not null primary key,name char(4) not null,age tinyint(3) unsigned not null,sex enum('man','woman') not null);
insert into yunwei values(1,'張三',20,'man'),(2,'張四',21,'man'),(3,'張莉',22,'woman'),(4,'張五',23,'man'),(5,'張六',24,'man'),(6,'張麗',25,'woman');
insert into caiwu values(1,'李一',24,'man'),(2,'李莉',23,'woman'),(3,'李二',22,'man'),(4,'李三',21,'man'),(5,'李四',20,'man'),(6,'李麗',19,'woman');
將SQL文件導入到數據庫中
mysql < test.sql
導入完成後,在staff庫下有兩張表,分別是yunwei和caiwu
mysql> select * from staff.yunwei;
+----+--------+-----+-------+
| id | name | age | sex |
+----+--------+-----+-------+
| 1 | 張三 | 20 | man |
| 2 | 張四 | 21 | man |
| 3 | 張莉 | 22 | woman |
| 4 | 張五 | 23 | man |
| 5 | 張六 | 24 | man |
| 6 | 張麗 | 25 | woman |
+----+--------+-----+-------+
mysql> select * from staff.caiwu;
+----+--------+-----+-------+
| id | name | age | sex |
+----+--------+-----+-------+
| 1 | 李一 | 24 | man |
| 2 | 李莉 | 23 | woman |
| 3 | 李二 | 22 | man |
| 4 | 李三 | 21 | man |
| 5 | 李四 | 20 | man |
| 6 | 李麗 | 19 | woman |
+----+--------+-----+-------+
簡單查詢
直接查詢
語法:select 字段 from 表名;
最簡單的一種查詢方式,可查看多個字段或整張表。
例如:查詢運維表姓名及年齡
mysql> select name,age from yunwei;
+--------+-----+
| name | age |
+--------+-----+
| 張三 | 20 |
| 張四 | 21 |
| 張莉 | 22 |
| 張五 | 23 |
| 張六 | 24 |
| 張麗 | 25 |
+--------+-----+
條件查詢
關鍵字爲where,通常位於表名後面
語法:select 字段 from 表名 where 條件;
根據條件,查詢指定條件的字段。
例如:查詢財務表中年齡爲20的員工
mysql> select * from caiwu where age=20;
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 5 | 李四 | 20 | man |
+----+--------+-----+-----+
模糊查詢
關鍵字是like,通常位於條件字段後面
語法:select 字段 from 表名 where 字段 like ‘%數據%’;
通過輸入具體的數據,來對記錄進行查詢
例如:模糊查詢caiwu表中姓名字段還有三的記錄
mysql> select * from caiwu where name like '%三%';
+----+--------+-----+-----+
| id | name | age | sex |
+----+--------+-----+-----+
| 4 | 李三 | 21 | man |
+----+--------+-----+-----+
算數運算符
運算符一般配合邏輯運算符一起使用,可以使條件限制更加具體。
符號 | 作用 |
---|---|
> | 大於 |
< | 小於 |
= | 等於 |
!= | 不等於 |
<> | 與!=同義,不等於 |
>= | 大於等於 |
<= | 小於等於 |
通過邏輯運算符可以將條件限制在一個範圍內。
例如:查看caiwu表中id不等於1的記錄
mysql> select * from caiwu where id!=1;
+----+--------+-----+-------+
| id | name | age | sex |
+----+--------+-----+-------+
| 2 | 李莉 | 23 | woman |
| 3 | 李二 | 22 | man |
| 4 | 李三 | 21 | man |
| 5 | 李四 | 20 | man |
| 6 | 李麗 | 19 | woman |
+----+--------+-----+-------+
邏輯運算符
可以將查詢的單個條件改爲多個條件或滿足多個條件中的一個。
符號 | 作用 |
---|---|
and | 與,同時滿足多個條件 |
or | 或,滿足多個條件中的一個即可 |
not | 否,不滿足條件 |
和算數運算符一起使用,可以將條件更加具體。
例如:查詢yunwei表中性別爲女,或年齡爲23的記錄
mysql> select * from yunwei where sex='woman' or age=23;
+----+--------+-----+-------+
| id | name | age | sex |
+----+--------+-----+-------+
| 3 | 張莉 | 22 | woman |
| 4 | 張五 | 23 | man |
| 6 | 張麗 | 25 | woman |
+----+--------+-----+-------+
in與not in運算符
關鍵字爲in,通常位於條件字段後面
語法:select 字段 from 表名 where 字段 in (列表);
符號 | 作用 |
---|---|
in | 在一個條件列表中 |
not in | 不在一個條件列表中 |
例如:查詢yunwei表中,年齡爲22-25之間的記錄
mysql> select * from yunwei where age in(22,23,24,25);
+----+--------+-----+-------+
| id | name | age | sex |
+----+--------+-----+-------+
| 3 | 張莉 | 22 | woman |
| 4 | 張五 | 23 | man |
| 5 | 張六 | 24 | man |
| 6 | 張麗 | 25 | woman |
+----+--------+-----+-------+
排序查詢
關鍵字爲order by與asc,desc,通常位於表名之後
排序分爲兩種,升序(asc)和降序(desc)
語法:select 字段 from 表名 order by 字段 排序方式;
例如:將caiwu表中記錄按年齡從大到小查詢
mysql> select * from caiwu order by age desc;
+----+--------+-----+-------+
| id | name | age | sex |
+----+--------+-----+-------+
| 1 | 李一 | 24 | man |
| 2 | 李莉 | 23 | woman |
| 3 | 李二 | 22 | man |
| 4 | 李三 | 21 | man |
| 5 | 李四 | 20 | man |
| 6 | 李麗 | 19 | woman |
+----+--------+-----+-------+
高級查詢
範圍運算
關鍵字爲between…and…,通常位於條件字段後面。
語法:select 字段 from 表名 where 字段 between 範圍1 and 範圍2;
也是用來限制查詢範圍,作爲算數運算符的一種替換。
例如:查詢caiwu表中,年齡爲21-23的記錄,使用算數運算符表示爲age>=21 and age<=23,使用範圍運算嘖表示爲age between 21 and 23。
mysql> select *from caiwu where age >=21 and age<=23;
+----+--------+-----+-------+
| id | name | age | sex |
+----+--------+-----+-------+
| 2 | 李莉 | 23 | woman |
| 3 | 李二 | 22 | man |
| 4 | 李三 | 21 | man |
+----+--------+-----+-------+
mysql> select *from caiwu where age between 21 and 23;
+----+--------+-----+-------+
| id | name | age | sex |
+----+--------+-----+-------+
| 2 | 李莉 | 23 | woman |
| 3 | 李二 | 22 | man |
| 4 | 李三 | 21 | man |
+----+--------+-----+-------+
限制查詢
關鍵字爲limit,通常位於表名後面。
語法:select 字段 from 表名 limit n,m;
limit可以強制指定查詢結果的記錄條數。
n是開始記錄行,0表示第一條記錄,m表示顯示行,從n開始,共顯示幾行記錄。
時刻注意開始範圍時從0開始的,1表示的是第二行,而非第一行。
顯示範圍就是共顯示幾條記錄,並不是結束範圍。
例如:查詢yunwei表中第2-4行記錄
mysql> select * from yunwei limit 1,3;
+----+--------+-----+-------+
| id | name | age | sex |
+----+--------+-----+-------+
| 2 | 張四 | 21 | man |
| 3 | 張莉 | 22 | woman |
| 4 | 張五 | 23 | man |
+----+--------+-----+-------+
命令解讀:查詢yunwei表中記錄,從第二行開始,共顯示三行。
嵌套查詢
沒有關鍵字,嵌套查詢分爲查詢語句和子查詢語句,在查詢語句中含有子查詢語句,所以叫做嵌套查詢。
嵌套子查詢通常位於查詢語句的條件之後。
例如:在caiwu表中查詢名稱爲張三的字段。
先在caiwu表中添加一個張三字段,並且年齡不同
mysql> insert into caiwu values(7,'張三',25,'man');
通過子查詢的方式,查詢caiwu和yunwei表中名稱字段相同的字段
mysql> select name,age from caiwu where name=(select name from yunwei where age=20);
+--------+-----+
| name | age |
+--------+-----+
| 張三 | 25 |
+--------+-----+
前半段是正常的查詢語句,name=()中爲子查詢語句,查詢的字段爲name,查找yunwei表中age爲20的name,結果爲張三,將結果執行外部的查詢語句,就完成了。
使用嵌套查詢,兩個表必須要有一個關聯字段,否則無法實現。
測試完成後,將添加的字段刪除即可。
多表連查
多表連查全稱多表連接查詢,和嵌套子查詢一樣,都需要有一個共同的字段,然後將多個表連接在一起查詢,將符合條件的組成一個合集。
常見連接:內連接,外連接
內連接
根據兩個表中共有的字段進行匹配,然後將符合條件的合集進行拼接。
關鍵字爲inner join…on…,通常位於表名後面。
語法:select 字段 from 表1 inner join 表2 on 表1.字段=表2.字段;
on後面的是連接條件,也就是表1和表2共有的字段
例如:將yunwei和caiwu表連接在一起
mysql> select * from yunwei inner join caiwu on caiwu.id=yunwei.id ;
+----+--------+-----+-------+----+--------+-----+-------+
| id | name | age | sex | id | name | age | sex |
+----+--------+-----+-------+----+--------+-----+-------+
| 1 | 張三 | 20 | man | 1 | 李一 | 24 | man |
| 2 | 張四 | 21 | man | 2 | 李莉 | 23 | woman |
| 3 | 張莉 | 22 | woman | 3 | 李二 | 22 | man |
| 4 | 張五 | 23 | man | 4 | 李三 | 21 | man |
| 5 | 張六 | 24 | man | 5 | 李四 | 20 | man |
| 6 | 張麗 | 25 | woman | 6 | 李麗 | 19 | woman |
+----+--------+-----+-------+----+--------+-----+-------+
左連接
關鍵字爲left join…on,通常位於表名後面
語法:select 字段 from 表1 left join 表2 on 連接條件;
左連接是左表爲主表,指定字段都顯示,右表爲從表,沒內容顯示null。
使用左連接將兩個表連接到一起
mysql> select * from yunwei left join caiwu on yunwei.id=caiwu.id;
+----+--------+-----+-------+------+--------+------+-------+
| id | name | age | sex | id | name | age | sex |
+----+--------+-----+-------+------+--------+------+-------+
| 1 | 張三 | 20 | man | 1 | 李一 | 24 | man |
| 2 | 張四 | 21 | man | 2 | 李莉 | 23 | woman |
| 3 | 張莉 | 22 | woman | 3 | 李二 | 22 | man |
| 4 | 張五 | 23 | man | 4 | 李三 | 21 | man |
| 5 | 張六 | 24 | man | 5 | 李四 | 20 | man |
| 6 | 張麗 | 25 | woman | 6 | 李麗 | 19 | woman |
+----+--------+-----+-------+------+--------+------+-------+
右連接
關鍵字爲right join,通常位於表名後面
語法:select 字段 from 表1 right join 表2 on 連接條件
右連接是以右表爲主表,指定字段都顯示,左表爲從表,沒內容顯示null。
使用右連接將兩個表連接在一起
mysql> select * from yunwei right join caiwu on yunwei.id=caiwu.id;
+------+--------+------+-------+----+--------+-----+-------+
| id | name | age | sex | id | name | age | sex |
+------+--------+------+-------+----+--------+-----+-------+
| 1 | 張三 | 20 | man | 1 | 李一 | 24 | man |
| 2 | 張四 | 21 | man | 2 | 李莉 | 23 | woman |
| 3 | 張莉 | 22 | woman | 3 | 李二 | 22 | man |
| 4 | 張五 | 23 | man | 4 | 李三 | 21 | man |
| 5 | 張六 | 24 | man | 5 | 李四 | 20 | man |
| 6 | 張麗 | 25 | woman | 6 | 李麗 | 19 | woman |
+------+--------+------+-------+----+--------+-----+-------+