对表的记录的查询
当查询结果中的多行记录一模一样时 可以用关键字DISTINCT避免
比如我们查询表emp中的不重复的deptno
SELECT DISTINCT 字段1... FROM 表名;数量类型的列可以做加,减,乘,除
这里处理其他数字加上NULL结果会等于NULL 下面会处理的
同样的字符串类型可以做连续运算
处理NULL值
如果在做数量类型的列中存在着NULL要先进行处理 一般把NULL转换为0
给列起别名
SELECT 字段1 AS 列名 FROM 表名;//其中AS可以省略与前面介绍的UPDATE和DELETE语句一样 SELECT语句也可以使用WHERE字句来控制记录
查询魂力大于50并且deptno不为NULL的人所有信息
查询魂力在50-70之间的人所有信息
查询deptno在集合中的人所有信息
当你想查询姓张,并且姓名一共两个字
SELECT *FROM 表名 WHERE 姓名字段 LIKE '张_';//_表示一个字符 %表示0-N字符我们查询姓舞的并且姓名一共三个字的
SELECT *FROM 表名 WHERE 字段 LIKE '%张%';//注意千万不要这是查询中间带有张字的。这是查询含有张字的! SELECT *FROM 表名 WHERE 字段 LIKE '%';//这个条件等同与不存在 但如果值为NULL的查询不出来所以这里empno=12那行并没有查询出来
按魂力升序排列
按魂力降序排列
先按魂力排名 再按精神力排名
如果只想只显示数据的一部分 可以使用LIMIT关键字 此乃MYSQL特有
按魂力降序排序并且只显示前3条
LIMIT同样也可以指定显示区间 不过其中下标是从0开始的
但此区间不是普通区间 比如下面的0,3 并不是0-3的数据 而是从0开始显示3行数据
我们来计算字段deptno有多少个不是NULL的值 结果确实如此 12个数据 有1个是NULL
查询表emp中魂力最大的值
查询表emp中魂力最小的值
查询表emp中的魂力和
查询表emp中的魂力平均值
比如我们查询以tid分组 每个分组各自的人数
比如我们查询以tid和deptno两个分组 仍然显示每个分组各自的人数
当然你想在多层分组中想让它显示单层的效果可以在最后加上WITH ROLLUP
比如我们查询以deptno分组 deptno并且不为NULL 仍然显示每个分组各自的人数
比如我们查询以ename分组 并且deptno不为NULL 仍然显示每个人的精神力 并且要求魂力小于50的除外并以魂力降序排列
表连接大致分为内连接和外连接 区别是内连接要依靠两表或多表相同的字段来连接
现在有另一个表dept 如下:
查询表emp在表dept中对应的部门
注意:借助的是两表中相同字段 假如一个人的数据在另一个表中没有就不会查出来 比如上面图中只有11个数据
外连接分为左连接和右连接
包含所有的左边表中的记录甚至是右边表没有与之匹配的记录
select ... FROM 表名1 left join 表名2 on 表名1.表名中字段=表名2.表名中字段包含所有的右边表中的记录甚至是左边表没有与之匹配的记录
select ... FROM 表名1 right join 表名2 on 表名1.表名中字段=表名2.表名中字段数据库还有个全外连接 但是MySQL不支持 但可以用union模拟
SELECT 字段名1 FROM 表1 UNION SELECT 字段名2 FROM 表2如果查询的有重复值时 要在UNION后面加上ALL 即
SELECT 字段名1 FROM 表1 UNION ALL SELECT 字段名2 FROM 表2子查询允许把一个查询嵌套在另一个查询当中
子查询的关键字 in,not in,=,!=,exists,not exists等
比如SELECT deptno FROM dept; 是查询的表dept中的deptno
相当于SELECT *FROM emp WHERE deptno in (10,20,30);
如果子查询记录数是唯一 可以用=代替in 如下
简单的说就是查询t1表有 t2表也有的数据
简单的说就是查询t1表有 t2表不存在的数据
子查询和表连接之间的转换主要在两个方面 MYSQL4.1以前的版本都不支持子查询 需要用表连接来实现 表连接在很多情况下用于优化子查询
