简单查询
查询一个字段?
select 字段名 from 表名;
查询两个字段,或者多个字段怎么办? 使用逗号隔开“,”
查询所有字段?
使用:select * from 表名;
别把把这种写法写到 Java 程序中,因为到时还要把 * 先转换成字段
缺点:①效率低 ②可读性差。
在实际开发中不建议,可以自己玩没问题。 你可以在DOS命令窗口中想快速的看一看全表数据可以采用这种方式。
给查询的列起别名?
使用 as 关键字,可以省略 select deptno,dname as deptname from dept;
假设起别名的时候,别名里面有空格,怎么办? mysql> select deptno,dname dept name from dept; DBMS看到这样的语句,进行SQL语句的编译,不符合语法,编译报错。 怎么解决? select deptno,dname 'dept name' from dept; //加单引号 select deptno,dname "dept name" from dept; //加双引号
注意:在所有的数据库当中,字符串统一使用单引号括起来, 单引号是标准,双引号在oracle数据库中用不了。但是在mysql 中可以使用。
再次强调:数据库中的字符串都是采用单引号括起来。这是标准的。 双引号不标准。
字段可以使用数学表达式
select ename,sal*12 from emp;
显示时字段名是 sal*12 这样时一般取个别名 select ename,sal*12 year_sal from emp;
条件查询
什么是条件查询?
查询出来符合条件的 语法格式: select 字段1,字段2,字段3.... from 表名 where 条件;
都有哪些条件?
= 等于 查询薪资等于800的员工姓名和编号? select empno,ename from emp where sal = 800;
<> 或 != 不等于 查询薪资不等于800的员工姓名和编号? select empno,ename from emp where sal != 800;
同理还有:<=,<,>=,>
between … and …. 两个值之间, 等同于 >= and <=
查询薪资在2450和3000之间的员工信息?包括2450和3000?
注意: 使用between and的时候,必须遵循左小右大。 between and是闭区间,包括两端的值。
is null 表示为 null(is not null 不为空)
查询哪些员工的津贴/补助为null? select empno,ename,sal,comm from emp where comm = null;(像这样用=是查不到的) Empty set (0.00 sec)
注意:在数据库当中null不能使用等号进行衡量。需要使用is null 因为数据库中的null代表什么也没有,它不是一个值,所以不能使用 等号衡量。
正确的:select empno,ename,sal,comm from emp where comm is null;
and 并且 查询工作岗位是MANAGER并且工资大于2500的员工信息?
select empno,ename,job,sal from emp where job = 'MANAGER' and sal > 2500;
or 或者
查询工作岗位是MANAGER或SALESMAN的员工?
select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
and和or同时出现的话,有优先级问题吗?(开发中如不记得优先级,加小括号) 查询工资大于2500,并且部门编号为10或20部门的员工? select * from emp where sal > 2500 and deptno = 10 or deptno = 20; 分析以上语句的问题?
and优先级比or高。 以上语句会先执行and,然后执行or。 以上这个语句表示什么含义? 找出工资大于2500并且部门编号为10的员工,或者20部门所有员工找出来。 正确做法:select * from emp where sal > 2500 and (deptno = 10 or deptno = 20);
in 包含,相当于多个 or (not in 不在这个范围中) 查询工作岗位是MANAGER和SALESMAN的员工? select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN'; select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');
注意:in不是一个区间。in后面跟的是具体的值。
查询薪资是800和5000的员工信息? select ename,sal from emp where sal = 800 or sal = 5000; select ename,sal from emp where sal in(800, 5000); //这个不是表示800到5000都找出来。
not in 表示不在这几个值当中的数据。 select ename,sal from emp where sal not in(800, 5000, 3000);
not 可以取非,主要用在 is 或 in 中 is null is not null in not in
like 称为模糊查询,支持%或下划线匹配 %匹配任意多个字符 下划线:任意一个字符。 (%是一个特殊的符号,_ 也是一个特殊符号)
找出名字中含有O的? mysql> select ename from emp where ename like '%O%';
找出名字以T结尾的? select ename from emp where ename like '%T';
找出名字以K开始的? select ename from emp where ename like 'K%';
找出第二个字每是A的? select ename from emp where ename like '_A%';
找出第三个字母是R的? select ename from emp where ename like '__R%';
找出名字中有“_”的? select name from t_student where name like '%_%'; //这样不行。
正确: select name from t_student where name like '%\_%'; // \转义字符。
对查询结果排序
排序 order by( 默认是升序!!!)
查询所有员工薪资,排序? select ename,sal from emp order by sal;
怎么降序(后面加上desc)?
指定降序: select ename,sal from emp order by sal desc;
可以两个字段排序吗?或者说按照多个字段排序? 查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话, 再按照名字升序排列。 select ename,sal from emp order by sal desc, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。
了解内容:根据字段的位置也可以排序 select ename,sal from emp order by 2; // 2表示第二列。第二列是sal 按照查询结果的第2列sal排序。
了解一下,不建议在开发中这样写,因为不健壮。 因为列的顺序很容易发生改变,列顺序修改之后,2就废了
综合一点的案例: 找出工资在1250到3000之间的员工信息,要求按照薪资降序排列。 select ename,sal from emp where sal between 1250 and 3000 order by sal desc;
以上语句的执行顺序必须掌握: 第一步:from 第二步:where 第三步:select 第四步:order by