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)约束 (常用于“一对多”关联关系)

 

字符函数

 

实用函数:

 

猜你喜欢

转载自blog.csdn.net/qq_41892229/article/details/84256455