DQL简介
DQL中主要是用来查询数据库中的数据,不会对数据库中的数据进行改变,查询关键字:SELECT
语法:
SELECT 字段名 FROM 表名 [WHERE –> GROUP BY –>HAVING–> ORDER BY];
其中[]中的内容是一些条件。
在使用SELECT之前,先创建一个数据monkey1024:
create database monkey1024;
然后在这个数据库中创建三张表之后初始化数据,sql脚本如下:
create table dept(
DEPTNO int(2) PRIMARY KEY,
DNAME varchar(14),
LOC varchar(13)
);
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
create table emp(
EMPNO int(4) PRIMARY KEY,
ENAME varchar(10),
JOB varchar(9),
MGR int(4),
HIREDATE date,
SAL double(7,2),
COMM double(7,2),
DEPTNO int(2)
);
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
create table salgrade(
GRADE int(11),
HISAL int(11),
LOSAL int(11)
);
INSERT INTO SALGRADE VALUES (1,1200,700);
INSERT INTO SALGRADE VALUES (2,1400,1201);
INSERT INTO SALGRADE VALUES (3,2000,1401);
INSERT INTO SALGRADE VALUES (4,3000,2001);
INSERT INTO SALGRADE VALUES (5,9999,3001);
注意:mysql在windows下是不区分大小写的,在linux中区分大小写,
规则如下:
- 数据库名与表名是严格区分大小写的;
- 表的别名是严格区分大小写的;
- 字段名和字段的别名在所有的情况下均是忽略大小写的;
- 变量名也是严格区分大小写的;
可以在linux中修改mysql配置使其忽略大小写。
注释
单行注释,注意–后面加个空格
-- 这是单行注释
多行注释
/*
多行注释
*/
简单查询
查询员工姓名:
select ename from emp;
说明:select询句后面跟的是字段名称,select是关键字,select和字段名称之间采用空格隔开,
from后面是要查询的表。
查询员工编号和员工姓名:
select empno,ename from emp;
说明:多个字段之间采用,隔开。
查询emp表中的全部字段:
select * from emp;
说明:开发中不建议使用*,因为会先将其编译成字段,然后再去查询,稍微影响一些性能,而且也不明确,在开发中建议将要查询的字段都写上。
查询员工编号,姓名和年薪
select empno,ename,sal*12 from emp;
说明:字段上可以使用数学表达式,在执行select操作时,该操作不会改变数据库中的值,只是将计算结果展现。
将查询出的字段名称进行重命名
select empno,ename,sal * 12 as yearsal from emp;
其中as可以省略:
select empno,ename,sal * 12 yearsal from emp;
可以显示中文:
select empno,ename,sal * 12 as '年薪' from emp;
说明:该操作不会改变数据库中的值,中文需要使用”引上。
条件查询
条件查询需要使用where,并且where需要放到from 表的后面。
查询薪水是5000的员工
select empno,ename,sal from emp where sal = 5000;
查询job是MANAGER的员工
select empno,ename,job from emp where job = 'manager';
说明:job是varchar类型,后面的值需要使用”引上。
查询薪水不等于5000的员工
select empno,ename,sal from emp where sal <> 5000;
在mysql中<>表示不等于,!=也表示不等于,两者的含义和使用方式是一样的。
between … and …
查询薪水为1600到3000的员工:
select empno,ename,sal from emp where sal >= 1600 and sal <= 3000;
或者使用between…and…
select empno,ename,sal from emp where sal between 1600 and 3000;
说明:使用between…and… 的范围包括条件的值,即相当于>=和<=。
is null
查询津贴为空的员工:
select empno,ename,comm from emp where comm is null;
查询津贴不为空的员工
select empno,ename,comm from emp where comm is not null;
and
表示且,可以在where后面可以添加多个限制条件。
查询工作岗位为“MANAGER”并且薪水大于2500的员工
select empno,ename,job,sal from emp where job ='MANAGER' and sal > 2500;
or
表示或,只要满足一项条件即可。
查询出 job 为 SALESMAN 或 job为MANAGER的员工:
select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER';
and和or表达式的优先级
and优先级高于or。
查询薪水大于1800,并且部门编号为20或30的员工:
select * from emp where sal>1800 and (deptno=20 or deptno=30);
说明:因为and优先级高于or,所以将两个or条件使用括号括起来。
in
只要满足一项条件即可,完全可以采用or来表示,采用in会更简洁一些
查询出Job是SALESMAN或者是MANAGER的员工:
select ename,job from emp where job in ('SALESMAN','MANAGER');
查询出薪水不是1600和3000的员工:
select ename,sal from emp where sal not in (1600,3000);
like
模糊查询,在数据量较大的情况下,使用like会影响性能。
查询姓名以M开头的所有员工:
select ename from emp where ename like 'M%';
查询姓名以N结尾的所有员工:
select ename from emp where ename like '%N';
查询姓名中包含O的所有员工:
select ename from emp where ename like '%O%';
查询姓名中第二个字母是A的所有员工:
select ename from emp where ename like '_A%';