一、表的准备
查询操作的SQL演示将基于下面这四张表进行,我们先创建好这四张数据表,并为其添加数据。
1、第一张表为部门表,名称为包含三个字段:部门编号(deptno),部门名称(dname),部门位置(loc)
create table DEPT(
DEPTNO int(2) not null,
DNAME VARCHAR(14),
LOC VARCHAR(13)
);
为部门编号字段(deptno)添加主键约束:
alter table DEPT
add constraint PK_DEPT primary key (DEPTNO);
向部门表(dept)中插入数据:
insert into DEPT (DEPTNO, DNAME, LOC)
values (10, 'ACCOUNTING', 'NEW YORK');
insert into DEPT (DEPTNO, DNAME, LOC)
values (20, 'RESEARCH', 'DALLAS');
insert into DEPT (DEPTNO, DNAME, LOC)
values (30, 'SALES', 'CHICAGO');
insert into DEPT (DEPTNO, DNAME, LOC)
values (40, 'OPERATIONS', 'BOSTON');
2、第二张表为员工表(emp),该表包含8个字段,分别为员工编号(empno),员工姓名(ename),职位(job),直属领导(mgr),入职日期(hiredate),薪水(sal),补助(comm),所属部门编号(deptno):
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)
);
为员工表emp的字段deptno添加外键约束,与部门表(dept)的字段部门编号(deptno)关联:
alter table EMP
add constraint FK_DEPTNO foreign key (DEPTNO)
references DEPT (DEPTNO);
向员工表(emp)中插入数据:
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 800, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600, 300, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250, 500, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250, 1400, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7839, 'KING', 'PRESIDENT', null, '1981-11-17', 5000, null, 10);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500, 0, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950, null, 30);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000, null, 20);
insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300, null, 10);
3、第三张表为薪资等级表,该表包含3个字段,分别为:薪资等级(grade),最低薪资(losal),最高薪资(hisal):
create table SALGRADE
(
GRADE int primary key,
LOSAL double(7,2),
HISAL double(7,2)
);
向薪资等级表(salgrade)中插入数据:
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (1, 700, 1200);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (2, 1201, 1400);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (3, 1401, 2000);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (4, 2001, 3000);
insert into SALGRADE (GRADE, LOSAL, HISAL)
values (5, 3001, 9999);
4、第四张表为奖金表,该表包含4个字段,分别为:员工姓名(ename),员工工作(job),薪资(sal),comm
create table BONUS
(
ENAME VARCHAR(10),
JOB VARCHAR(9),
SAL double(7,2),
COMM double(7,2)
);
二、单表查询
在数据库操作中,单表查询就是在一张表中进行数据的查询。
1、简单的单表查询
对员工表emp表查询,*代表所有数据
select * from emp;
显示部分列:
select empno,ename,sal from emp;
显示部分行:where子句
select * from emp where sal > 2000;
显示部分列,部分行:
select empno,ename,job,mgr from emp where sal > 2000;
2、为查询的字段起别名
为查询的字段起别名可以省略关键字as ,也可以省略了别名带的单引号和双引号:
select empno 员工编号,ename 姓名,sal 工资 from emp;
为查询的字段起别名时使用关键字as,别名也可以携带单引号或者双引号,两者没有区别:
select empno as 员工编号,ename as 姓名,sal as 工资 from emp;
select empno as '员工编号',ename as "姓名",sal as 工资 from emp;
在别名中有特殊符号的时候,单引号或者双引号不可以省略不写,如下,员工 编号之间有一个空格(空格属于特殊符号)
select empno as 员工 编号,ename as "姓 名",sal as 工资 from emp;
如果别名员工 编号不使用单引号和双引号,就会返回1064错误:
-- > 1064 - 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 '编号,ename as "姓 名",sal as 工资 from emp' at line 1
3、 查询字段时可以使用算术运算符
select empno,ename,sal,sal+1000 as '涨薪后',deptno from emp where sal < 2500;
select empno,ename,sal,comm,sal+comm from emp;
4、去重操作
对查询到的数据进行去重操作,需要使用关键字distinct
select distinct job from emp;
如果关键字distinct后包含多个列,表示的是对后面的所有列组合去重 ,而不是单独的某一列去重:
select distinct job,deptno from emp;
5、排序
为查询到的数据排序需要使用关键字order by
默认情况下是按照升序排列的
select * from emp order by sal;
asc 表示升序,可以默认不写
select * from emp order by sal asc;
desc 表示降序
select * from emp order by sal desc;
在sal(工资)升序的情况下,deptno(部门编号)按照降序排列
select * from emp order by sal asc ,deptno desc;