续:
数据操作:
查询表整体结构 :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)约束 (常用于“一对多”关联关系)
字符函数
实用函数: