1. 程式人生 > >MySQL基礎篇(資料操作)

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> 

 

 

 

查詢:

簡單查詢:

  1. 查詢所有列:select * from 表名
  2. 查詢指定列:select name,id from 表名

條件查詢: where  條件

where子句中可以使用如下運算子及關鍵字  

  1.         0 =、!=、<>、<、<=、>、>=;
  2.         BETWEEN…AND;select 1 between 0 and 3---1是不是在0到3之間
  3.         IN(set);---判斷有沒有在一個集中
  4.         IS NULL;---判空 很多值沒有新增預設為null
  5.         AND;& | !
  6.         OR;
  7.         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 |
+------+--------+-----------+---------+------------+---------+---------+--------+





聚合函式: 聚合函式是用來做縱向運算的函式,聚合函式都只有一個結果。

  1.         l COUNT():統計指定列不為NULL的記錄行數;
  2.         l MAX():計算指定列的最大值,如果指定列是字串型別,那麼使用字串排序運算;
  3.         l MIN():計算指定列的最小值,如果指定列是字串型別,那麼使用字串排序運算;
  4.         l SUM():計算指定列的數值和,如果指定列型別不是數值型別,那麼計算結果為0;
  5.         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)約束 (常用於“一對多”關聯關係)

 

字元函式

 

實用函式: