1. insert
我們先創建一個表結構,這部分操作我們使用這張表完成我們的操作:
mysql> create table student(-> id int primary key auto_increment,-> name varchar(20) not null,-> qq varchar(20) unique-> );
Query OK, 0 rows affected (0.04 sec)
示例演示:?
-- 單行插入
mysql> insert into student values(100, '張三', '11111');
Query OK, 1 row affected (0.00 sec)mysql> insert into student values(101, '李四', NULL);
Query OK, 1 row affected (0.01 sec)-- 多行插入
mysql> insert into student(name,qq) values('王五', '22222'),('趙六',' ');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql> select * from student;
+-----+--------+-------+
| id | name | qq |
+-----+--------+-------+
| 100 | 張三 | 11111 |
| 101 | 李四 | NULL |
| 102 | 王五 | 22222 |
| 103 | 趙六 | |
+-----+--------+-------+
4 rows in set (0.00 sec)-- 插入沖突更新
mysql> insert into student(id,name,qq) values(102,'周七', '33333');
ERROR 1062 (23000): Duplicate entry '102' for key 'student.PRIMARY'mysql> insert into student(id,name,qq) values(102,'周七', '33333') on duplicate key update name = '周七', qq = '33333';
Query OK, 2 rows affected (0.00 sec)mysql> select * from student;
+-----+--------+-------+
| id | name | qq |
+-----+--------+-------+
| 100 | 張三 | 11111 |
| 101 | 李四 | NULL |
| 102 | 周七 | 33333 |
| 103 | 趙六 | |
+-----+--------+-------+
4 rows in set (0.00 sec)-- 替換
mysql> replace into student (id, name) VALUES (100, '田八');
Query OK, 2 rows affected (0.00 sec)mysql> select * from student;
+-----+--------+-------+
| id | name | qq |
+-----+--------+-------+
| 100 | 田八 | NULL |
| 101 | 李四 | NULL |
| 102 | 周七 | 33333 |
| 103 | 趙六 | |
+-----+--------+-------+
4 rows in set (0.00 sec)
2. update
-- 將張三同學的數學成績變更為 100 分
mysql> update exam_result set math = 100 where name = '張三';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from exam_result;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 2 | 張三 | 67 | 100 | 56 |
| 3 | 李四 | 87 | 78 | 77 |
| 4 | 王五 | 88 | 98 | 90 |
| 5 | 趙六 | 82 | 84 | 67 |
| 6 | 田八 | 70 | 73 | 78 |
| 7 | 劉九 | 75 | 65 | 30 |
+----+--------+---------+------+---------+
6 rows in set (0.00 sec)-- 將張三同學的數學成績變更為 60 分,語文成績變更為 70 分
mysql> update exam_result set math = 60,chinese = 70 where name = '張三';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from exam_result;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 2 | 張三 | 70 | 60 | 56 |
| 3 | 李四 | 87 | 78 | 77 |
| 4 | 王五 | 88 | 98 | 90 |
| 5 | 趙六 | 82 | 84 | 67 |
| 6 | 田八 | 70 | 73 | 78 |
| 7 | 劉九 | 75 | 65 | 30 |
+----+--------+---------+------+---------+
6 rows in set (0.00 sec)-- 將總成績倒數前三的 3 位同學的數學成績加上 30 分
mysql> update exam_result set math = math + 30 order by chinese + math + english limit 3;
Query OK, 3 rows affected (0.01 sec)
Rows matched: 3 Changed: 3 Warnings: 0mysql> select * from exam_result;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 2 | 張三 | 70 | 90 | 56 |
| 3 | 李四 | 87 | 78 | 77 |
| 4 | 王五 | 88 | 98 | 90 |
| 5 | 趙六 | 82 | 84 | 67 |
| 6 | 田八 | 70 | 103 | 78 |
| 7 | 劉九 | 75 | 95 | 30 |
+----+--------+---------+------+---------+
6 rows in set (0.00 sec)-- 將所有同學的語文成績更新為原來的 2 倍
mysql> update exam_result set chinese = chinese * 2;
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6 Changed: 6 Warnings: 0mysql> select * from exam_result;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 2 | 張三 | 140 | 90 | 56 |
| 3 | 李四 | 174 | 78 | 77 |
| 4 | 王五 | 176 | 98 | 90 |
| 5 | 趙六 | 164 | 84 | 67 |
| 6 | 田八 | 140 | 103 | 78 |
| 7 | 劉九 | 150 | 95 | 30 |
+----+--------+---------+------+---------+
6 rows in set (0.00 sec)
3. delete
-- 刪除張三同學的考試成績
mysql> delete from exam_result where name = '張三';
Query OK, 1 row affected (0.00 sec)mysql> select * from exam_result;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 3 | 李四 | 174 | 78 | 77 |
| 4 | 王五 | 176 | 98 | 90 |
| 5 | 趙六 | 164 | 84 | 67 |
| 6 | 田八 | 140 | 103 | 78 |
| 7 | 劉九 | 150 | 95 | 30 |
+----+--------+---------+------+---------+
5 rows in set (0.00 sec)-- 刪除整張表
delete from for_delete;
Query OK, 3 rows affected (0.00 sec) SELECT * FROM for_delete;
Empty set (0.00 sec) -- 截斷整表數據,注意影響行數是 0,所以實際上沒有對數據真正操作
truncate for_truncate;
Query OK, 0 rows affected (0.10 sec) SELECT * FROM for_truncate;
Empty set (0.00 sec) -- delete 和 truncate 的其中一個區別是truncate會清空auto_increment。
4. select
這部分使用下面的表進行操作:
mysql> create table exam_result(-> id int primary key auto_increment,-> name varchar(20) not null,-> chinese float default 0,-> math float default 0,-> english float default 0-> );
Query OK, 0 rows affected (0.03 sec)mysql> insert into exam_result(name,chinese,math,english) values('張三',67,98,56),-> ('李四',87,78,77);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0mysql> insert into exam_result(name,chinese,math,english) values('王五', 88, 98, 90), ('趙六', 82, 84, 67),('田八', 70, 73, 78),('劉九', 75, 65, 30);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
4.1 基本查詢?
4.1.1?簡單查詢
-- 全列查詢
mysql> select * from exam_result;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 2 | 張三 | 67 | 98 | 56 |
| 3 | 李四 | 87 | 78 | 77 |
| 4 | 王五 | 88 | 98 | 90 |
| 5 | 趙六 | 82 | 84 | 67 |
| 6 | 田八 | 70 | 73 | 78 |
| 7 | 劉九 | 75 | 65 | 30 |
+----+--------+---------+------+---------+
6 rows in set (0.00 sec)-- 查詢部分列
mysql> select id,name,chinese from exam_result;
+----+--------+---------+
| id | name | chinese |
+----+--------+---------+
| 2 | 張三 | 67 |
| 3 | 李四 | 87 |
| 4 | 王五 | 88 |
| 5 | 趙六 | 82 |
| 6 | 田八 | 70 |
| 7 | 劉九 | 75 |
+----+--------+---------+
6 rows in set (0.00 sec)-- 查詢字段為表達式
mysql> select id,name,chinese+math+english from exam_result;
+----+--------+----------------------+
| id | name | chinese+math+english |
+----+--------+----------------------+
| 2 | 張三 | 221 |
| 3 | 李四 | 242 |
| 4 | 王五 | 276 |
| 5 | 趙六 | 233 |
| 6 | 田八 | 221 |
| 7 | 劉九 | 170 |
+----+--------+----------------------+
6 rows in set (0.00 sec)-- 為查詢列指定別名
mysql> select id,name,chinese+math+english 總分 from exam_result;
+----+--------+--------+
| id | name | 總分 |
+----+--------+--------+
| 2 | 張三 | 221 |
| 3 | 李四 | 242 |
| 4 | 王五 | 276 |
| 5 | 趙六 | 233 |
| 6 | 田八 | 221 |
| 7 | 劉九 | 170 |
+----+--------+--------+
6 rows in set (0.00 sec)-- 去重查詢
mysql> select distinct math from exam_result;
+------+
| math |
+------+
| 98 |
| 78 |
| 84 |
| 73 |
| 65 |
+------+
5 rows in set (0.01 sec)
4.1.2 where
比較運算符:
運算符 | 說明 |
---|---|
>, >=,<,<= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的結果是 NULL |
<=> | 等于,NULL 安全,例如 NULL NULL 的結果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 | 范圍匹配,[a0, a1],如果 a0 <= values <=a1,返回 TRUE(1) |
IN (option, ...) | 如果是 option 中的任意一個,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多個(包括 0 個)任意字符;_ 表示任意一個字符 |
邏輯運算符:
運算符 | 說明 |
---|---|
AND | 多個條件必須都為 TRUE(1),結果才是 TRUE(1) |
OR | 任意一個條件為 TRUE(1), 結果為 TRUE(1) |
NOT | 條件為 TRUE(1),結果為 FALSE(0) |
示例演示:
-- 英語不及格的同學及英語成績 ( < 60 )
mysql> select name,english from exam_result where english < 60;
+--------+---------+
| name | english |
+--------+---------+
| 張三 | 56 |
| 劉九 | 30 |
+--------+---------+
2 rows in set (0.00 sec)-- 語文成績在 [80, 90] 分的同學及語文成績
mysql> select name,chinese from exam_result where chinese between 80 and 90;
+--------+---------+
| name | chinese |
+--------+---------+
| 李四 | 87 |
| 王五 | 88 |
| 趙六 | 82 |
+--------+---------+
3 rows in set (0.00 sec)mysql> select name,chinese from exam_result where chinese >= 80 and chinese <= 90;
+--------+---------+
| name | chinese |
+--------+---------+
| 李四 | 87 |
| 王五 | 88 |
| 趙六 | 82 |
+--------+---------+
3 rows in set (0.00 sec)-- 數學成績是 58 或者 59 或者 98 或者 99 分的同學及數學成績
mysql> select name,math from exam_result where math = 58 or math = 59 or math = 98 or math = 99;
+--------+------+
| name | math |
+--------+------+
| 張三 | 98 |
| 王五 | 98 |
+--------+------+
2 rows in set (0.00 sec)mysql> select name,math from exam_result where math in(58,59,98,99);
+--------+------+
| name | math |
+--------+------+
| 張三 | 98 |
| 王五 | 98 |
+--------+------+
2 rows in set (0.01 sec)-- 姓張的同學 及 趙某同學
mysql> select name from exam_result where name like '張%' or name like '趙_';
+--------+
| name |
+--------+
| 張三 |
| 趙六 |
+--------+
2 rows in set (0.00 sec)-- 語文成績好于英語成績的同學
mysql> select name,chinese,english from exam_result where chinese > english;
+--------+---------+---------+
| name | chinese | english |
+--------+---------+---------+
| 張三 | 67 | 56 |
| 李四 | 87 | 77 |
| 趙六 | 82 | 67 |
| 劉九 | 75 | 30 |
+--------+---------+---------+
4 rows in set (0.00 sec)-- 總分在 200 分以下的同學
mysql> select name,chinese+math+english from exam_result where chinese + math + english < 200;
+--------+----------------------+
| name | chinese+math+english |
+--------+----------------------+
| 劉九 | 170 |
+--------+----------------------+
1 row in set (0.00 sec)-- 語文成績 > 80 并且不姓張的同學
mysql> select name,chinese from exam_result where chinese > 80 and name not like '張%';
+--------+---------+
| name | chinese |
+--------+---------+
| 李四 | 87 |
| 王五 | 88 |
| 趙六 | 82 |
+--------+---------+
3 rows in set (0.00 sec)-- 張某同學,否則要求總成績 > 200 并且 語文成績 < 數學成績 并且 英語成績 > 80
mysql> select * from exam_result where name like '張%' or (chinese + math + english > 200 and chinese < math and english >80);
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 2 | 張三 | 67 | 98 | 56 |
| 4 | 王五 | 88 | 98 | 90 |
+----+--------+---------+------+---------+
2 rows in set (0.00 sec)
4.1.3 order by
-- 同學及數學成績,按數學成績升序顯示
mysql> select name,math from exam_result order by math;
+--------+------+
| name | math |
+--------+------+
| 劉九 | 65 |
| 田八 | 73 |
| 李四 | 78 |
| 趙六 | 84 |
| 張三 | 98 |
| 王五 | 98 |
+--------+------+
6 rows in set (0.01 sec)-- 同學及總分,按總分排序顯示
mysql> select name,chinese + math + english 總分 from exam_result order by 總分;
+--------+--------+
| name | 總分 |
+--------+--------+
| 劉九 | 170 |
| 張三 | 221 |
| 田八 | 221 |
| 趙六 | 233 |
| 李四 | 242 |
| 王五 | 276 |
+--------+--------+
6 rows in set (0.00 sec)-- 查詢同學各門成績,依次按 數學降序,英語升序,語文升序的方式顯示
mysql> select * from exam_result order by math desc,english,chinese;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 2 | 張三 | 67 | 98 | 56 |
| 4 | 王五 | 88 | 98 | 90 |
| 5 | 趙六 | 82 | 84 | 67 |
| 3 | 李四 | 87 | 78 | 77 |
| 6 | 田八 | 70 | 73 | 78 |
| 7 | 劉九 | 75 | 65 | 30 |
+----+--------+---------+------+---------+
6 rows in set (0.00 sec)-- 查詢姓張的同學或者姓劉的同學數學成績,結果按數學成績由高到低顯示
mysql> select * from exam_result where name like '張%' or name like '劉%' order by math desc;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 2 | 張三 | 67 | 98 | 56 |
| 7 | 劉九 | 75 | 65 | 30 |
+----+--------+---------+------+---------+
2 rows in set (0.00 sec)
4.1.4 limit offset
對查詢結果進行分頁處理:
mysql> select * from exam_result limit 3 offset 0;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 2 | 張三 | 67 | 98 | 56 |
| 3 | 李四 | 87 | 78 | 77 |
| 4 | 王五 | 88 | 98 | 90 |
+----+--------+---------+------+---------+
3 rows in set (0.00 sec)mysql> select * from exam_result limit 3 offset 3;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 5 | 趙六 | 82 | 84 | 67 |
| 6 | 田八 | 70 | 73 | 78 |
| 7 | 劉九 | 75 | 65 | 30 |
+----+--------+---------+------+---------+
3 rows in set (0.00 sec)mysql> select * from exam_result limit 3 offset 6;
Empty set (0.00 sec)
4.1.5?insert into
mysql> insert into son_table select * from exam_result;
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0mysql> select * from son_table;
+----+--------+---------+------+---------+
| id | name | chinese | math | english |
+----+--------+---------+------+---------+
| 3 | 李四 | 174 | 78 | 77 |
| 4 | 王五 | 176 | 98 | 90 |
| 5 | 趙六 | 164 | 84 | 67 |
| 6 | 田八 | 140 | 103 | 78 |
| 7 | 劉九 | 150 | 95 | 30 |
+----+--------+---------+------+---------+
5 rows in set (0.00 sec)
4.1.6?group by
在select中使用group by 子句可以對指定列進行分組查詢
-- 顯示每個部門的平均工資和最高工資
select deptno,avg(sal),max(sal) from EMP group by deptno; -- 每個部門的每種崗位的平均工資和最低工資
select avg(sal),min(sal),job, deptno from EMP group by deptno, job;
4.2 復合查詢
4.2.1?多表連接
接下來我們使用下面兩張表來進行查詢:
??顯示雇員名、雇員工資以及所在部門的名字
select EMP.ename, EMP.sal, DEPT.dname from EMP, DEPT where EMP.deptno = DEPT.deptno;
??顯示部門號為10的部門名,員工名和工資
select ename, sal,dname from EMP, DEPT where EMP.deptno = DEPT.deptno and DEPT.deptno = 10;
??顯示各個員工的姓名,工資,及工資級別
select ename, sal, grade from EMP, SALGRADE where EMP.sal between losal and hisal;
4.2.2?自連接
??顯示員工FORD的上級領導的編號和姓名
-- 使用的子查詢
select empno,ename from emp where emp.empno = (select mgr from emp where ename = 'FORD');-- 使用多表查詢(自查詢)
--from emp leader, emp worker,給自己的表起別名,因為要先做笛卡爾積,所以別名可以先識別
select leader.empno,leader.ename from emp leader, emp worker where leader.empno = worker.mgr and worker.ename='FORD';
4.2.3?子查詢
??顯示SMITH同一部門的員工
select * from EMP WHERE deptno = (select deptno from EMP where ename = 'smith');
??查詢和10號部門的工作崗位相同的雇員的名字,崗位,工資,部門號,但是不包含10自己的
select ename,job,sal,deptno from emp where
job in (select distinct job from emp where deptno = 10) and deptno<>10;
??顯示工資比部門30的所有員工的工資高的員工的姓名、工資和部門號
select ename, sal, deptno from EMP
where sal > all(select sal from EMP where deptno = 30);
??顯示工資比部門30的任意員工的工資高的員工的姓名、工資和部門號(包含自己部門的員工)
select ename, sal, deptno from EMP
where sal > any(select sal from EMP where deptno = 30);
??查詢和SMITH的部門和崗位完全相同的所有雇員,不含SMITH本人
select ename from EMP
where (deptno, job) = (select deptno, job from EMP where ename = 'SMITH') and ename <> 'SMITH';
??顯示每個高于自己部門平均工資的員工的姓名、部門、工資、平均工資
select ename, deptno, sal, format(asal,2) from EMP, (select avg(sal) asal, deptno dt from EMP group by deptno) tmp
where EMP.sal > tmp.asal and EMP.deptno = tmp.dt;
??查找每個部門工資最高的人的姓名、工資、部門、最高工資
select EMP.ename, EMP.sal, EMP.deptno, ms from EMP,
(select max(sal) ms, deptno from EMP group by deptno) tmp where EMP.deptno=tmp.deptno and EMP.sal=tmp.ms;
4.2.4?合并查詢
??將工資大于2500或職位是MANAGER的人找出來
select ename, sal, job from EMP
where sal > 2500
union
select ename, sal, job from EMP
where job = 'MANAGER';--去掉了重復記錄
??將工資大于25000或職位是MANAGER的人找出來
select ename, sal, job from EMP
where sal > 2500
union all
select ename, sal, job from EMP
where job = 'MANAGER';
4.3 內外連接
4.3.1?內連接
內連接實際上就是利用where子句對兩種表形成的笛卡兒積進行篩選。
??顯示SMITH的名字和部門名稱
-- 用前面的寫法
select ename, dname from EMP, DEPT
where EMP.deptno = DEPT.deptno and ename = 'SMITH';
-- 用標準的內連接寫法
select ename, dname from EMP inner
join DEPT on EMP.deptno = DEPT.deptno and ename = 'SMITH';
4.3.2?外連接
左外連接
如果聯合查詢,左側的表完全顯示我們就說是左外連接
??查詢所有學生的成績,如果這個學生沒有成績,也要將學生的個人信息顯示出來
select * from stu left join exam on stu.id = exam.id;
右外連接
如果聯合查詢,右側的表完全顯示我們就說是右外連接。
? 對stu表和exam表聯合查詢,把所有的成績都顯示出來,即使這個成績沒有學生與它對應,也要顯示出來
select * from stu right join exam on stu.id = exam.id;