MySQL基礎篇(資料操作)
續:
資料操作:
查詢表整體結構 :select * from 表名
-
增加:
全行(欄位)插入:insert 表名 values(各欄位對應的型別值)
預設插入: insert 表名 (列1,列3,...列n) values(值1,值3,...值n) / * ! 預設的用各欄位約束條件決定 * /
同時插入多條資料:insert 表名 values(對應值), (對應值), (對應值),... ,(對應值)
例:
mysql> create table employees( -> id int(10) auto_increment primary key, -> name varchar(20) not null, -> score int(10) not null, -> birthday date not null); Query OK, 0 rows affected (0.39 sec) mysql> insert employees(name,score,birthday) values('zhangsan',88,'1994-08-28'); 4Query OK, 1 row affected (0.13 sec) mysql> insert employees(name,score,birthday) values('dawiao',99,'1997-07-07'),('gwe',79,'1997-04-12'),('ximing',59,'1977-01-23'),('dfeng',79,'1995-11-29'); mysql> select * from employees; +----+----------+-------+------------+ | id | name | score | birthday | +----+----------+-------+------------+ | 1 | zhangsan | 88 | 1994-08-28 | | 2 | lisi | 72 | 1997-07-07 | | 3 | wangwe | 89 | 1998-05-02 | | 4 | xiaoming | 56 | 1994-12-23 | | 5 | dianfeng | 59 | 1997-11-29 | | 6 | dawiao | 99 | 1997-07-07 | | 7 | gwe | 79 | 1997-04-12 | | 8 | ximing | 59 | 1977-01-23 | | 9 | dfeng | 79 | 1995-11-29 | +----+----------+-------+------------+ 9 rows in set (0.00 sec)
-
刪除:
delete from 表名 where 條件 /*!where 條件 可不寫*/
邏輯刪除【本質上就是update】: update 表名 isDelete=1 where 條件
-
修改:
update 表名 set 列1=值1...where 條件 /*!不是修改欄位名*/
對於修改,結果集可按照有序來輸出,如將where 改為Order by 條件為某可降序(desc)欄位、或可升序(asc)欄位
例:
mysql> delete from employees where id=2; /*!刪除id=2的資料*/
Query OK, 1 row affected (0.20 sec)
mysql> select * from employees;
+----+----------+-------+------------+
| id | name | score | birthday |
+----+----------+-------+------------+
| 1 | zhangsan | 88 | 1994-08-28 |
| 3 | wangwe | 89 | 1998-05-02 |
| 4 | xiaoming | 56 | 1994-12-23 |
| 5 | dianfeng | 59 | 1997-11-29 |
| 6 | dawiao | 99 | 1997-07-07 |
| 7 | gwe | 79 | 1997-04-12 |
| 8 | ximing | 59 | 1977-01-23 |
| 9 | dfeng | 79 | 1995-11-29 |
+----+----------+-------+------------+
8 rows in set (0.00 sec)mysql> update employees set score=100 where name='zhangsan';
Query OK, 1 row affected (0.09 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from employees;
+----+----------+-------+------------+
| id | name | score | birthday |
+----+----------+-------+------------+
| 1 | zhangsan | 100 | 1994-08-28 |
| 3 | wangwe | 89 | 1998-05-02 |
| 4 | xiaoming | 56 | 1994-12-23 |
| 5 | dianfeng | 59 | 1997-11-29 |
| 6 | dawiao | 99 | 1997-07-07 |
| 7 | gwe | 79 | 1997-04-12 |
| 8 | ximing | 59 | 1977-01-23 |
| 9 | dfeng | 79 | 1995-11-29 |
+----+----------+-------+------------+
8 rows in set (0.00 sec)
mysql>
mysql> update employees set score=100 where name='zhangsan';/*!將zahngsan成績改為100*/
Query OK, 1 row affected (0.09 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from employees;
+----+----------+-------+------------+
| id | name | score | birthday |
+----+----------+-------+------------+
| 1 | zhangsan | 100 | 1994-08-28 |
| 3 | wangwe | 89 | 1998-05-02 |
| 4 | xiaoming | 56 | 1994-12-23 |
| 5 | dianfeng | 59 | 1997-11-29 |
| 6 | dawiao | 99 | 1997-07-07 |
| 7 | gwe | 79 | 1997-04-12 |
| 8 | ximing | 59 | 1977-01-23 |
| 9 | dfeng | 79 | 1995-11-29 |
+----+----------+-------+------------+
8 rows in set (0.00 sec)
mysql>
查詢:
簡單查詢:
- 查詢所有列:select * from 表名
- 查詢指定列:select name,id from 表名
條件查詢: where 條件
where子句中可以使用如下運算子及關鍵字
- 0 =、!=、<>、<、<=、>、>=;
- BETWEEN…AND;select 1 between 0 and 3---1是不是在0到3之間
- IN(set);---判斷有沒有在一個集中
- IS NULL;---判空 很多值沒有新增預設為null
- AND;& | !
- OR;
- NOT;
例:
mysql> select * from stu;
+--------+----------+------+--------+
| sid | sname | age | gender |
+--------+----------+------+--------+
| S1001 | liuYi | 35 | male |
| S1002 | chenEr | 15 | female |
| S1003 | zhangSan | 95 | male |
| S1004 | liSi | 65 | female |
| S1005 | wangWu | 55 | male |
| S1006 | zhaoLiu | 75 | female |
| S1007 | sunQi | 25 | male |
| S1008 | zhouBa | 45 | female |
| S_1009 | wuJiu | 85 | male |
| S1010 | zhengShi | 5 | female |
| S1011 | xxx | NULL | NULL |
+--------+----------+------+--------+
mysql> select sname,sid from stu;
+----------+--------+
| sname | sid |
+----------+--------+
| liuYi | S1001 |
| chenEr | S1002 |
| zhangSan | S1003 |
| liSi | S1004 |
| wangWu | S1005 |
| zhaoLiu | S1006 |
| sunQi | S1007 |
| zhouBa | S1008 |
| wuJiu | S_1009 |
| zhengShi | S1010 |
| xxx | S1011 |
+----------+--------+
mysql> select * from stu where gender='female' and age<50; /*!查詢性別為女,並且年齡小於50的記錄*/
+-------+----------+------+--------+
| sid | sname | age | gender |
+-------+----------+------+--------+
| S1002 | chenEr | 15 | female |
| S1008 | zhouBa | 45 | female |
| S1010 | zhengShi | 5 | female |
+-------+----------+------+--------+
mysql> select * from stu where sid='s1001' or sname='lisi'; /*!查詢學號為S1001,或者姓名為liSi的記錄*/
+-------+-------+------+--------+
| sid | sname | age | gender |
+-------+-------+------+--------+
| S1001 | liuYi | 35 | male |
| S1004 | liSi | 65 | female |
+-------+-------+------+--------+
mysql> select * from stu where sid IN('S1001','S1003','S_1009'); /*!查詢學號為S1001,S1003,S_1009的記錄*/
+--------+----------+------+--------+
| sid | sname | age | gender |
+--------+----------+------+--------+
| S1001 | liuYi | 35 | male |
| S1003 | zhangSan | 95 | male |
| S_1009 | wuJiu | 85 | male |
+--------+----------+------+--------+
mysql> select * from stu where sid not IN('S1001','S1003','S_1009'); /*!查詢學號不是S1001,S1003,S_1009的記錄*/
+-------+----------+------+--------+
| sid | sname | age | gender |
+-------+----------+------+--------+
| S1002 | chenEr | 15 | female |
| S1004 | liSi | 65 | female |
| S1005 | wangWu | 55 | male |
| S1006 | zhaoLiu | 75 | female |
| S1007 | sunQi | 25 | male |
| S1008 | zhouBa | 45 | female |
| S1010 | zhengShi | 5 | female |
| S1011 | xxx | NULL | NULL |
+-------+----------+------+--------+
mysql> select * from stu where age<=40 and age>=20; /*!查詢年齡在20到40之間的記錄*/
mysql> select * from stu where age between 20 and 40; /*!上述第二種方法*/
+-------+-------+------+--------+
| sid | sname | age | gender |
+-------+-------+------+--------+
| S1001 | liuYi | 35 | male |
| S1007 | sunQi | 25 | male |
+-------+-------+------+--------+
mysql> select * from stu where gender!='male'; /*!查詢性別非男的記錄*/
+-------+----------+------+--------+
| sid | sname | age | gender |
+-------+----------+------+--------+
| S1002 | chenEr | 15 | female |
| S1004 | liSi | 65 | female |
| S1006 | zhaoLiu | 75 | female |
| S1008 | zhouBa | 45 | female |
| S1010 | zhengShi | 5 | female |
+-------+----------+------+--------+
mysql> select * from stu where sname is not null; /*!查詢姓名不為null的學生記錄*/
mysql> select * from stu where not sname is null; /*!上述第二種方法*/
+--------+----------+------+--------+
| sid | sname | age | gender |
+--------+----------+------+--------+
| S1001 | liuYi | 35 | male |
| S1002 | chenEr | 15 | female |
| S1003 | zhangSan | 95 | male |
| S1004 | liSi | 65 | female |
| S1005 | wangWu | 55 | male |
| S1006 | zhaoLiu | 75 | female |
| S1007 | sunQi | 25 | male |
| S1008 | zhouBa | 45 | female |
| S_1009 | wuJiu | 85 | male |
| S1010 | zhengShi | 5 | female |
| S1011 | xxx | NULL | NULL |
+--------+----------+------+--------+
模糊查詢:
當想查詢姓名中包含a字母的學生時就需要使用模糊查詢了。模糊查詢需要使用關鍵字like。
萬用字元:
_ 任意一個字母
%:任意0~n個字母
'張%'
%a% 含有a的條件欄位
例:
mysql> select * from stu where sname like '____i'; /*!查詢姓名由五個字組成的記錄,並且第五個字母由i組成*/
+-------+-------+------+--------+
| sid | sname | age | gender |
+-------+-------+------+--------+
| S1001 | liuYi | 35 | male |
| S1007 | sunQi | 25 | male |
+-------+-------+------+--------+
mysql> select * from stu where sname like 'z%'; /*!查詢姓名以“z”開頭的學生記錄*/
+-------+----------+------+--------+
| sid | sname | age | gender |
+-------+----------+------+--------+
| S1003 | zhangSan | 95 | male |
| S1006 | zhaoLiu | 75 | female |
| S1008 | zhouBa | 45 | female |
| S1010 | zhengShi | 5 | female |
+-------+----------+------+--------+
mysql> select * from stu where sname like '_i%'; /*!查詢姓名中第2個字母為“i”的學生記錄*/
+-------+-------+------+--------+
| sid | sname | age | gender |
+-------+-------+------+--------+
| S1001 | liuYi | 35 | male |
| S1004 | liSi | 65 | female |
+-------+-------+------+--------+
mysql> select * from stu where sname like '%a%'; /*!查詢姓名中包含“a”字母的學生記錄*/
+-------+----------+------+--------+
| sid | sname | age | gender |
+-------+----------+------+--------+
| S1003 | zhangSan | 95 | male |
| S1005 | wangWu | 55 | male |
| S1006 | zhaoLiu | 75 | female |
| S1008 | zhouBa | 45 | female |
+-------+----------+------+--------+
欄位控制查詢:
去重複記錄: 關鍵子 distinct
select distinct 欄位名 from 表名
求和:
給欄位新增別名: as (可以省略)
排序: 關鍵字 order by (desc 降序)(asc升序)
例:
mysql> select distinct deptno from emp; /*!去除性別重複的欄位*/
+--------+
| deptno |
+--------+
| 20 |
| 30 |
| 10 |
+--------+
mysql> mysql> select id,name,salary+award from emp; /*!去除性別重複的欄位,並起別名*/
+------+--------+--------------+
| id | name | salary+award |
+------+--------+--------------+
| 7369 | SMITH | NULL |
| 7499 | ALLEN | 1900.00 |
| 7521 | WARD | 1750.00 |
| 7566 | JONES | NULL |
| 7654 | MARTIN | 2650.00 |
| 7698 | BLAKE | NULL |
| 7782 | CLARK | NULL |
| 7788 | SCOTT | NULL |
| 7839 | KING | NULL |
| 7844 | TURNER | 1500.00 |
| 7876 | ADAMS | NULL |
| 7900 | JAMES | NULL |
| 7902 | FORD | NULL |
| 7934 | MILLER | NULL |
+------+--------+--------------+
/*!結果可以發現有很多NULL,因為nulluyu數字相加結果仍為null,故下面使用ifnull函式將null轉換為0*/
mysql> select id,name,salary+ifnull(award,0) as sum from emp;
+------+--------+---------+
| id | name | sum |
+------+--------+---------+
| 7369 | SMITH | 800.00 |
| 7499 | ALLEN | 1900.00 |
| 7521 | WARD | 1750.00 |
| 7566 | JONES | 2975.00 |
| 7654 | MARTIN | 2650.00 |
| 7698 | BLAKE | 2850.00 |
| 7782 | CLARK | 2450.00 |
| 7788 | SCOTT | 3000.00 |
| 7839 | KING | 5000.00 |
| 7844 | TURNER | 1500.00 |
| 7876 | ADAMS | 1100.00 |
| 7900 | JAMES | 950.00 |
| 7902 | FORD | 3000.00 |
| 7934 | MILLER | 1300.00 |
+------+--------+---------+
mysql> select * from emp order by salary; /*!將薪資按照升序記錄*/
+------+--------+-----------+---------+------------+---------+---------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+--------+-----------+---------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
+------+--------+-----------+---------+------------+---------+---------+--------+
mysql> select * from emp order by deptno asc,id desc; /*!查詢所有僱員,按部門升序,如果部門相同時,按id降序排序*/
+------+--------+-----------+---------+------------+---------+---------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+--------+-----------+---------+------------+---------+---------+--------+
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
+------+--------+-----------+---------+------------+---------+---------+--------+
聚合函式: 聚合函式是用來做縱向運算的函式,聚合函式都只有一個結果。
- l COUNT():統計指定列不為NULL的記錄行數;
- l MAX():計算指定列的最大值,如果指定列是字串型別,那麼使用字串排序運算;
- l MIN():計算指定列的最小值,如果指定列是字串型別,那麼使用字串排序運算;
- l SUM():計算指定列的數值和,如果指定列型別不是數值型別,那麼計算結果為0;
- l AVG():計算指定列的平均值,如果指定列型別不是數值型別,那麼計算結果為0;
分組查詢:
group by 子句 having 子句
- having是在分組後對資料進行過濾,where是在分組前對資料進行過濾。
- having後面可以使用分組函式(統計函式), where後面不可以使用分組函式。
- where是對分組前記錄的條件,如果某行記錄沒有滿足where子句的條件,那麼這行記錄不會參加分組,而having是對分組後資料的約束。
例:
mysql> select count(award) awardNum,count(*) totalNum from emp; /*!統計emp表中的記錄個數,emp表中的有獎金的人的個數*/
+----------+----------+
| awardNum | totalNum |
+----------+----------+
| 4 | 14 |
+----------+----------+
mysql> select count(*) from emp where salary>2500; /*!統計emp表中薪資大於2500的人數*/
+----------+
| count(*) |
+----------+
| 5 |
+----------+
mysql> select count(*) from emp where salary+ifnull(award,0)>2500; /*!統計emp表中薪資和獎金之和大於2500元的人數*/
+----------+
| count(*) |
+----------+
| 6 |
+----------+
mysql> select sum(salary),sum(award) ,sum(salary+ifnull(award,0)) totalSum from emp; *!統計emp中薪資之和,獎金之和 以及薪資加獎金之和*/
+-------------+------------+----------+
| sum(salary) | sum(award) | totalSum |
+-------------+------------+----------+
| 29025.00 | 2200.00 | 31225.00 |
+-------------+------------+----------+
mysql> select avg(salary),max(salary),min(salary) from emp; /*!求薪資的最大值,最小值,平均值*/
+-------------+-------------+-------------+
| avg(salary) | max(salary) | min(salary) |
+-------------+-------------+-------------+
| 2073.214286 | 5000.00 | 800.00 |
+-------------+-------------+-------------+
mysql> select deptno,sum(salary) from emp group by deptno; /*!查詢每個部門的部門編號和每個部門的工資和*/
+--------+-------------+
| deptno | sum(salary) |
+--------+-------------+
| 10 | 8750.00 |
| 20 | 10875.00 |
| 30 | 9400.00 |
+--------+-------------+
mysql> select deptno,count(*) from emp group by deptno; /*!查詢每個部門的部門編號以及每個部門的人數*/
+--------+----------+
| deptno | count(*) |
+--------+----------+
| 10 | 3 |
| 20 | 5 |
| 30 | 6 |
+--------+----------+
mysql> select deptno, count(*) from emp where salary>1500 group by deptno; /*!查詢每個部門的部門編號以及每個部門工資大於1500的人數*/
+--------+----------+
| deptno | count(*) |
+--------+----------+
| 10 | 2 |
| 20 | 3 |
| 30 | 2 |
+--------+----------+
mysql> select deptno,sum(salary) from emp group by deptno having sum(salary)>9000; /*!查詢工資總和大於9000的部門編號以及工資和*/
+--------+-------------+
| deptno | sum(salary) |
+--------+-------------+
| 20 | 10875.00 |
| 30 | 9400.00 |
+--------+-------------+
分頁查詢: limit
LIMIT用來限定查詢結果的起始行,以及總行數。
1查詢5行記錄,起始行從0開始
sql SELECT * FROM emp LIMIT 0, 5;
注意,起始行從0開始,即第一行開始!
例:
mysql> select * from emp;
+------+--------+-----------+---------+------------+---------+---------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+--------+-----------+---------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+------+--------+-----------+---------+------------+---------+---------+--------+
mysql> select * from emp limit 0,4; /* 1每次查詢4頁*/
+------+-------+----------+---------+------------+---------+--------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+-------+----------+---------+------------+---------+--------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
+------+-------+----------+---------+------------+---------+--------+--------+
mysql> select * from emp limit 4,4;
+------+--------+----------+---------+------------+---------+---------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+--------+----------+---------+------------+---------+---------+--------+
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
+------+--------+----------+---------+------------+---------+---------+--------+
mysql> select * from emp limit 8,4;
+------+--------+-----------+---------+------------+---------+-------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+--------+-----------+---------+------------+---------+-------+--------+
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
+------+--------+-----------+---------+------------+---------+-------+--------+
mysql> select * from emp limit 12,4;
+------+--------+---------+---------+------------+---------+-------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+--------+---------+---------+------------+---------+-------+--------+
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
+------+--------+---------+---------+---
-
查詢語句書寫順序:select – from- where- groupby- having- order by-limit
-
查詢語句執行順序:from - where -group by -having - select - order by-limit
子查詢:
子查詢就是巢狀查詢,一個select語句中包含另一個完整的select語句。即SELECT中包含SELECT,如果一條語句中存在兩個,或兩個以上SELECT,那麼就是子查詢語句了。
子查詢出現的位置:
- where後,作為條為被查詢的一條件的一部分;
- from後,作表;
當子查詢出現在where後作為條件時,還可以使用如下關鍵字:
- any 任何
- all 所有
子查詢結果集的形式:
- 單行單列(用於條件)
- 單行多列(用於條件)
- 多行單列(用於條件)
- 多行多列(用於表)
注:當子查詢結果集形式為多行單列時可以使用ALL或ANY關鍵字
例:
/*!求出工資大於工資平均值的人*/
mysql> select * from emp where salary>(select avg(salary) from emp);
+------+-------+-----------+---------+------------+---------+-------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+-------+-----------+---------+------------+---------+-------+--------+
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
+------+-------+-----------+---------+------------+---------+-------+--------+
/*!求薪資大於JONES的員工
mysql> select * from emp where salary>(select salary from emp where name='JONES');
+------+-------+-----------+---------+------------+---------+-------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+-------+-----------+---------+------------+---------+-------+--------+
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
+------+-------+-----------+---------+------------+---------+-------+--------+
/*!查詢與SCOTT同一個部門的員工*/
mysql> select * from emp where deptno=(select deptno from emp where name='JONES');
+------+-------+---------+---------+------------+---------+-------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+-------+---------+---------+------------+---------+-------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
+------+-------+---------+---------+------------+---------+-------+--------+
/*!工資高於30號部門所有人的員工資訊*/
mysql> select * from emp where salary>(select max(salary) from emp where deptno=30);
/*!或者:*/
mysql> select * from emp where salary > all(select salary from emp where deptno=30);
+------+-------+-----------+---------+------------+---------+-------+--------+
| id | name | job | manager | hiredate | salary | award | deptno |
+------+-------+-----------+---------+------------+---------+-------+--------+
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
+------+-------+-----------+---------+------------+---------+-------+--------+
多表查詢:
笛卡爾積
規則:一個表中的每個記錄都會與另外一個表中的每條記錄組合
例:
mysql> select * from B;
+-----------+------+
| name | id |
+-----------+------+
| 曹雪芹 | 4 |
| 吳承恩 | 1 |
| 羅貫中 | 3 |
| 施耐庵 | 2 |
+-----------+------+
mysql> select * from A;
+----+--------------+
| id | bookName |
+----+--------------+
| 1 | 西遊記 |
| 2 | 水滸傳 |
| 3 | 三國演義 |
| 4 | 紅樓夢 |
+----+--------------+
mysql> select * from B,A;
+-----------+------+----+--------------+
| name | id | id | bookName |
+-----------+------+----+--------------+
| 曹雪芹 | 4 | 1 | 西遊記 |
| 吳承恩 | 1 | 1 | 西遊記 |
| 羅貫中 | 3 | 1 | 西遊記 |
| 施耐庵 | 2 | 1 | 西遊記 |
| 曹雪芹 | 4 | 2 | 水滸傳 |
| 吳承恩 | 1 | 2 | 水滸傳 |
| 羅貫中 | 3 | 2 | 水滸傳 |
| 施耐庵 | 2 | 2 | 水滸傳 |
| 曹雪芹 | 4 | 3 | 三國演義 |
| 吳承恩 | 1 | 3 | 三國演義 |
| 羅貫中 | 3 | 3 | 三國演義 |
| 施耐庵 | 2 | 3 | 三國演義 |
| 曹雪芹 | 4 | 4 | 紅樓夢 |
| 吳承恩 | 1 | 4 | 紅樓夢 |
| 羅貫中 | 3 | 4 | 紅樓夢 |
| 施耐庵 | 2 | 4 | 紅樓夢 |
+-----------+------+----+--------------+
連線查詢(應用於多表查詢)
- 等值連結-----指使用等號"="比較兩個表的連線列的值,相當於兩表執行笛卡爾後,取兩表連結列值相等的記錄。
【等值查詢不是標準的SQL查詢方式,可以理解為方言】
- 內連線 [INNER] JOIN ON
- 外連線 OUTER JOIN ON
- 左外連線 LEFT [OUTER] JOIN
- 右外連線 RIGHT [OUTER] JOIN
- 全外連線(MySQL不支援)FULL JOIN
- 自然連線 NATURAL JOIN
例:
+----+---------+------+----+--------+------+--------------+------+
| 2 | 小花 | 1 | 2 | 吳用 | man | 智多星 | 20 |
| 3 | 小hei | 3 | 3 | 燕青 | man | 浪子 | 25 |
| 4 | 小hong | 3 | 4 | 岱宗 | man | 神行太保 | 40 |
+----+---------+------+----+--------+------+--------------+------+
mysql> select * from xuesheng;
+----+--------+------+
| id | name | pid |
+----+--------+------+
| 2 | 小花 | 1 |
| 3 | 小hei | 3 |
| 4 | 小hong | 3 |
| 5 | 小黃 | 1 |
| 6 | 小藍 | 1 |
+----+--------+------+
5 rows in set (0.09 sec)
mysql> select * from haohan;
+----+------+------+----------+------+
| id | name | sex | nickname | age |
+----+------+------+----------+------+
| 1 | 林沖 | man | 豹子頭 | 30 |
| 2 | 吳用 | man | 智多星 | 20 |
| 3 | 燕青 | man | 浪子 | 25 |
| 4 | 岱宗 | man | 神行太保 | 40 |
+----+------+------+----------+------+
4 rows in set (0.02 sec)
mysql> select haohan.name,xuesheng.name from haohan,xuesheng where xuesheng.id=haohan.id;
+------+--------+
| name | name |
+------+--------+
| 吳用 | 小花 |
| 燕青 | 小hei |
| 岱宗 | 小hong |
+------+--------+
+----+---------+------+----+--------+------+--------------+------+
| id | name | pid | id | name | sex | nickname | age |
+----+---------+------+----+--------+------+--------------+------+
| 2 | 小花 | 1 | 2 | 吳用 | man | 智多星 | 20 |
| 3 | 小hei | 3 | 3 | 燕青 | man | 浪子 | 25 |
| 4 | 小hong | 3 | 4 | 岱宗 | man | 神行太保 | 40 |
+----+---------+------+----+--------+------+--------------+------+
待續。。。
外來鍵(Foreign Key)約束 (常用於“一對多”關聯關係)
字元函式
實用函式: