mysql>select*from emp orderby job, ename desc; +-------+--------+-----------+------+------------+---------+---------+--------+ | EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO | +-------+--------+-----------+------+------------+---------+---------+--------+ |7788| SCOTT | ANALYST |7566|1987-04-19|3000.00|NULL|20| |7902| FORD | ANALYST |7566|1981-12-03|3000.00|NULL|20| |7369| SMITH | CLERK |7902|1980-12-17|800.00|NULL|20| |7934| MILLER | CLERK |7782|1982-01-23|1300.00|NULL|10| |7900| JAMES | CLERK |7698|1981-12-03|950.00|NULL|30| |7876| ADAMS | CLERK |7788|1987-05-23|1100.00|NULL|20| |7566| JONES | MANAGER |7839|1981-04-02|2975.00|NULL|20| |7782| CLARK | MANAGER |7839|1981-06-09|2450.00|NULL|10| |7698| BLAKE | MANAGER |7839|1981-05-01|2850.00|NULL|30| |7839| KING | PRESIDENT |NULL|1981-11-17|5000.00|NULL|10| |7521| WARD | SALESMAN |7698|1981-02-22|1250.00|500.00|30| |7844| TURNER | SALESMAN |7698|1981-09-08|1500.00|0.00|30| |7654| MARTIN | SALESMAN |7698|1981-09-28|1250.00|1400.00|30| |7499| ALLEN | SALESMAN |7698|1981-02-20|1600.00|300.00|30| +-------+--------+-----------+------+------------+---------+---------+--------+ 14rowsinset (0.00 sec)
并、交、差
1 2 3 4 5 6 7 8 9 10 11
mysql>select*from emp where HIREDATE like'1980%' ->union ->select*from emp where sal =3000; +-------+-------+---------+------+------------+---------+------+--------+ | EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO | +-------+-------+---------+------+------------+---------+------+--------+ |7369| SMITH | CLERK |7902|1980-12-17|800.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| +-------+-------+---------+------+------------+---------+------+--------+ 3rowsinset, 1 warning (0.01 sec)
遗憾的是,mysql不支持intersect和except操作。SQL Server应该可以
1 2 3 4 5
mysql>select*from emp where HIREDATE like'1981%' ->intersect ->select*from emp where sal =3000; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'intersect select * from emp where sal = 3000'at line 2
1 2 3 4 5
mysql>select*from emp where HIREDATE like'1981%' ->except ->select*from emp where sal =3000; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'except select * from emp where sal = 3000'at line 2
mysql>select ename,sal,comm from emp where comm isnull; +--------+---------+------+ | ename | sal | comm | +--------+---------+------+ | SMITH |800.00|NULL| | JONES |2975.00|NULL| | BLAKE |2850.00|NULL| | CLARK |2450.00|NULL| | SCOTT |3000.00|NULL| | KING |5000.00|NULL| | ADAMS |1100.00|NULL| | JAMES |950.00|NULL| | FORD |3000.00|NULL| | MILLER |1300.00|NULL| +--------+---------+------+ 10rowsinset (0.00 sec)
mysql>select ename,sal,comm from emp where comm isnotnull; +--------+---------+---------+ | ename | sal | comm | +--------+---------+---------+ | ALLEN |1600.00|300.00| | WARD |1250.00|500.00| | MARTIN |1250.00|1400.00| | TURNER |1500.00|0.00| +--------+---------+---------+ 4rowsinset (0.00 sec)
三值逻辑:
true
false
unknown
关于unknown需要注意:
如果逻辑子句被判断为false和unknown时,则不会加入结果集中。
判断一个子句是不是unknown可以使用is unknown或is not unknown
当出现null = null时,返回的也是unknown
聚集函数
关键字
作用
avg
average value
min
minimum value
max
maximum value
sum
sum of values
count
number of values
1 2 3 4 5 6 7
mysql>selectavg(sal) as avg_sal from emp; +-------------+ | avg_sal | +-------------+ |2073.214286| +-------------+ 1rowinset (0.01 sec)
小练习:找出所有大于平均工资的员工
1 2 3 4 5 6 7 8 9 10 11 12
mysql>select*from emp where sal > (selectavg(sal) from emp); +-------+-------+-----------+------+------------+---------+------+--------+ | EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | 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| +-------+-------+-----------+------+------------+---------+------+--------+ 6rowsinset (0.01 sec)
mysql>select ename,sal from emp ->where sal >some(select sal from emp where job ='clerk'); +--------+---------+ | ename | sal | +--------+---------+ | ALLEN |1600.00| | WARD |1250.00| | JONES |2975.00| | MARTIN |1250.00| | BLAKE |2850.00| | CLARK |2450.00| | SCOTT |3000.00| | KING |5000.00| | TURNER |1500.00| | ADAMS |1100.00| | JAMES |950.00| | FORD |3000.00| | MILLER |1300.00| +--------+---------+ 13rowsinset (0.00 sec)
all
1
其中=all不等价于in,<>all等价于not in
找出工资大于所有clerk的所有员工的名字和工资:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
mysql>select ename,sal from emp ->where sal >all(select sal from emp where job='clerk'); +--------+---------+ | ename | sal | +--------+---------+ | ALLEN |1600.00| | JONES |2975.00| | BLAKE |2850.00| | CLARK |2450.00| | SCOTT |3000.00| | KING |5000.00| | TURNER |1500.00| | FORD |3000.00| +--------+---------+ 8rowsinset (0.00 sec)
exists
要求后面的查询语句的结果不为空。
找出2009年秋季学期和2010年春季学期同时开课的所有课程:
1 2 3 4 5 6 7 8
use homework select course_id from section as S where semester ='Fall'andyear=2009and exists(select* from section as T where semester ='Spring'andyear=2010and S.course_id = T.course_id);