## 一、数据库练习数据导入 #### 1、创建mysqltest表 #### 2、执行查询语句: ```mysql USE mysqltest; create table DEPT ( DEPTno integer(4) not null, dname varchar(14), loc varchar(13) ); alter table DEPT add constraint pk_DEPT primary key (DEPTno); create table EMP ( EMPno integer(4) not null, ename varchar(10), job varchar(9), mgr integer(4), hiredate date, sal decimal(7,2), comm decimal(7,2), DEPTno integer(2) ); alter table EMP add constraint pk_EMP primary key (EMPno); alter table EMP add constraint fk_DEPTno foreign key (DEPTno) references DEPT (DEPTno); create table SALGRADE ( grade integer(1), losal decimal(7,2), hisal decimal(7,2) ); 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'); 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); -- 下面要特别注意,%d-%m-%Y 里的 d 和 m 一定要小写 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7369, 'SMITH', 'CLERK', 7902, STR_TO_DATE('17-12-1980', '%d-%m-%Y'), 800.00, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7499, 'ALLEN', 'SALESMAN', 7698, STR_TO_DATE('20-02-1981', '%d-%m-%Y'), 1600.00, 300.00, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7521, 'WARD', 'SALESMAN', 7698, STR_TO_DATE('22-02-1981', '%d-%m-%Y'), 1250.00, 500.00, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7566, 'JONES', 'MANAGER', 7839, STR_TO_DATE('02-04-1981', '%d-%m-%Y'), 2975.00, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7654, 'MARTIN', 'SALESMAN', 7698, STR_TO_DATE('28-09-1981', '%d-%m-%Y'), 1250.00, 1400.00, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7698, 'BLAKE', 'MANAGER', 7839, STR_TO_DATE('01-05-1981', '%d-%m-%Y'), 2850.00, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7782, 'CLARK', 'MANAGER', 7839, STR_TO_DATE('09-06-1981', '%d-%m-%Y'), 2450.00, null, 10); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7788, 'SCOTT', 'ANALYST', 7566, STR_TO_DATE('19-04-1987', '%d-%m-%Y'), 3000.00, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7839, 'KING', 'PRESIDENT', null, STR_TO_DATE('17-11-1981', '%d-%m-%Y'), 5000.00, null, 10); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7844, 'TURNER', 'SALESMAN', 7698, STR_TO_DATE('08-09-1981', '%d-%m-%Y'), 1500.00, 0.00, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7876, 'ADAMS', 'CLERK', 7788, STR_TO_DATE('23-05-1987', '%d-%m-%Y'), 1100.00, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7900, 'JAMES', 'CLERK', 7698, STR_TO_DATE('03-12-1981', '%d-%m-%Y'), 950.00, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7902, 'FORD', 'ANALYST', 7566, STR_TO_DATE('03-12-1981', '%d-%m-%Y'), 3000.00, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7934, 'MILLER', 'CLERK', 7782, STR_TO_DATE('23-01-1982', '%d-%m-%Y'), 1300.00, null, 10); ``` ## 二、表简单SELECT查询 #### 1、查询dept表中的dname ```mysql SELECT dname FROM dept; ``` #### 2、查询emp表中的ename,job字段 ```mysql SELECT ename,job FROM emp; ``` #### 3、查询salgrade表中所有字段 ```mysql SELECT * FROM salgrade; ``` #### 4、查询emp表中的ename和sal及+300后的结果 ```mysql SELECT ename,sal,sal+300 FROM emp; ``` #### 5、查询emp表中的员工月薪以及年薪 ```mysql SELECT ename,sal,sal*12 FROM emp; ``` #### 6、查询姓名,工资,津贴,年薪总和 ```mysql -- 存在空值计算后结果也为NULL SELECT ename,sal,comm,sal*12+comm FROM emp; -- IFNULL()函数给空值默认值 SELECT ename,sal,IFNULL(comm,0),sal*12+IFNULL(comm,0) FROM emp; ``` #### 7、列别名,AS可以省略 ```mysql SELECT ename,sal,IFNULL(comm,0),sal*12+IFNULL(comm,0) AS yearsal FROM emp; -- 省略AS SELECT ename '员工姓名',sal '月薪',IFNULL(comm,0) '补贴',sal*12+IFNULL(comm,0) '年薪总和' FROM emp; ``` #### 8、表别名,不能用中文 ```mysql SELECT ename '员工姓名',sal '月薪',IFNULL(comm,0) '补贴',sal*12+IFNULL(comm,0) '年薪总和' FROM emp e; ``` #### 9、多表重名查询 ```mysql -- emp.EMPno -- dept.DEPTno -- 当给表取别名后查询字段时不能使用原表名 SELECT e.EMPno '员工编号',e.ename '员工姓名' FROM emp e; ``` #### 10、消除重复行(DISTINCT) ```mysql SELECT DISTINCT emp.DEPTno FROM emp; -- 如果是多列数据,去重字段全相同的 SELECT DISTINCT emp.DEPTno,emp.job FROM emp; ``` ## 二、条件查询 #### 1、语法结构 ```sql SELECT [DISTINCT] 列 AS 列表名,列 FROM 表名 AS 别名 WHERE 条件表达式; -- WHERE是在磁盘读取后,进入内存之前进行筛选,因为没有进入内存加工,所以字段别名不能在WHERE中使用。 ``` #### 2、单条件查询 ##### 部门编号为10的所有员工信息 ```sql SELECT * FROM emp WHERE emp.DEPTno = 10; ``` ##### 查询入职日期为1987年4月19日入职的员工编号、姓名、入职日期 ```sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.hiredate '入职日期' FROM emp WHERE emp.hiredate = '1987-04-19'; ``` #### 3、比较查询 条件表达式运算符 = 等于,<>不等于,<小于,<=小于等于,>大于,>=大于等于 ##### 查询入职日期为1987年4月19日之前入职的员工编号、姓名、入职日期 ```sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.hiredate '入职日期' FROM emp WHERE emp.hiredate < '1987-04-19'; ``` ##### 查询职位为SALESMAN的员工编号、姓名、职位 ````sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.job '职位' FROM emp WHERE emp.job = 'SALESMAN'; ```` ##### 特殊比较运算符 | 语句语法 | 功能 | | ------------------------- | ----------------------------------------------------- | | IS NULL value | 是否为空 | | IS NOT NULL value | 是否不为空 | | IN (value1,value2...) | 可以查询等于多个值的数据 | | NOT IN (value1,value2...) | 可以查询不等于多个值的数据 | | BETWEEN value1 AND value2 | 可以查询在值1到值2之间的数据 | | LIKE 'value%(_)' | 模糊查询%为代表匹配零个或人一个字符,代表匹配一个字符 | | NOT LIKE 'value%()' | 模糊查询 | ##### 查询工资在1000到1500之间的员工编号、姓名、工资 ```sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.sal '工资' FROM emp WHERE emp.sal BETWEEN 1000 AND 1500; ``` ##### 查询部门编号为10号或20号的员工编号、姓名、部门编号 ```sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.DEPTno '部门编号' FROM emp WHERE emp.DEPTno IN (10,20); ``` ##### 查询部门编号不为10号或20号的员工编号、姓名、部门编号 ```sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.DEPTno '部门编号' FROM emp WHERE emp.DEPTno NOT IN (10,20); ``` ##### 查询员工姓名以s开头的员工 ```sql SELECT * FROM emp WHERE emp.ename LIKE 's%'; ``` ##### 查询员工姓名中第二个字母是L的员工 ```sql SELECT * FROM emp WHERE emp.ename LIKE '_L%'; ``` ##### 查询员工姓名不以s开头的员工 ```sql SELECT * FROM emp WHERE emp.ename NOT LIKE 's%'; ``` ##### 查询员工姓名中第二个字母不是L的员工 ```sql SELECT * FROM emp WHERE emp.ename NOT LIKE '_L%'; ``` ##### 查询上级为空的员工 ```sql SELECT * FROM emp WHERE emp.mgr IS NULL; ``` ##### 查询上级不为空的员工 ```sql SELECT * FROM emp WHERE emp.mgr IS NOT NULL; ``` ## 多条件查询 #### 1、语法结构 ```sql SELECT [DISTINCT] 列名 FROM 表名 WHERE 条件1 逻辑运算符 条件2; ``` ##### 逻辑运算符 | 全称 | 符号 | 含义 | | ---- | ---- | ---- | | AND | && | 与 | | OR | \|\| | 或 | | NOT | | 非 | | XOR | | 异或 | ##### 查询工资大于1100且职位为'CLERK'的员工信息 ```sql SELECT * FROM emp WHERE emp.sal >1100 AND emp.job = 'CLERK'; ``` ##### 查询工资大于1100或职位为'CLERK'的员工信息 ````sql SELECT * FROM emp WHERE emp.sal > 1100 OR emp.job = 'CLERK'; ```` Loading... ## 一、数据库练习数据导入 #### 1、创建mysqltest表 #### 2、执行查询语句: ```mysql USE mysqltest; create table DEPT ( DEPTno integer(4) not null, dname varchar(14), loc varchar(13) ); alter table DEPT add constraint pk_DEPT primary key (DEPTno); create table EMP ( EMPno integer(4) not null, ename varchar(10), job varchar(9), mgr integer(4), hiredate date, sal decimal(7,2), comm decimal(7,2), DEPTno integer(2) ); alter table EMP add constraint pk_EMP primary key (EMPno); alter table EMP add constraint fk_DEPTno foreign key (DEPTno) references DEPT (DEPTno); create table SALGRADE ( grade integer(1), losal decimal(7,2), hisal decimal(7,2) ); 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'); 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); -- 下面要特别注意,%d-%m-%Y 里的 d 和 m 一定要小写 insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7369, 'SMITH', 'CLERK', 7902, STR_TO_DATE('17-12-1980', '%d-%m-%Y'), 800.00, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7499, 'ALLEN', 'SALESMAN', 7698, STR_TO_DATE('20-02-1981', '%d-%m-%Y'), 1600.00, 300.00, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7521, 'WARD', 'SALESMAN', 7698, STR_TO_DATE('22-02-1981', '%d-%m-%Y'), 1250.00, 500.00, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7566, 'JONES', 'MANAGER', 7839, STR_TO_DATE('02-04-1981', '%d-%m-%Y'), 2975.00, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7654, 'MARTIN', 'SALESMAN', 7698, STR_TO_DATE('28-09-1981', '%d-%m-%Y'), 1250.00, 1400.00, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7698, 'BLAKE', 'MANAGER', 7839, STR_TO_DATE('01-05-1981', '%d-%m-%Y'), 2850.00, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7782, 'CLARK', 'MANAGER', 7839, STR_TO_DATE('09-06-1981', '%d-%m-%Y'), 2450.00, null, 10); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7788, 'SCOTT', 'ANALYST', 7566, STR_TO_DATE('19-04-1987', '%d-%m-%Y'), 3000.00, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7839, 'KING', 'PRESIDENT', null, STR_TO_DATE('17-11-1981', '%d-%m-%Y'), 5000.00, null, 10); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7844, 'TURNER', 'SALESMAN', 7698, STR_TO_DATE('08-09-1981', '%d-%m-%Y'), 1500.00, 0.00, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7876, 'ADAMS', 'CLERK', 7788, STR_TO_DATE('23-05-1987', '%d-%m-%Y'), 1100.00, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7900, 'JAMES', 'CLERK', 7698, STR_TO_DATE('03-12-1981', '%d-%m-%Y'), 950.00, null, 30); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7902, 'FORD', 'ANALYST', 7566, STR_TO_DATE('03-12-1981', '%d-%m-%Y'), 3000.00, null, 20); insert into EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7934, 'MILLER', 'CLERK', 7782, STR_TO_DATE('23-01-1982', '%d-%m-%Y'), 1300.00, null, 10); ``` ## 二、表简单SELECT查询 #### 1、查询dept表中的dname ```mysql SELECT dname FROM dept; ``` #### 2、查询emp表中的ename,job字段 ```mysql SELECT ename,job FROM emp; ``` #### 3、查询salgrade表中所有字段 ```mysql SELECT * FROM salgrade; ``` #### 4、查询emp表中的ename和sal及+300后的结果 ```mysql SELECT ename,sal,sal+300 FROM emp; ``` #### 5、查询emp表中的员工月薪以及年薪 ```mysql SELECT ename,sal,sal*12 FROM emp; ``` #### 6、查询姓名,工资,津贴,年薪总和 ```mysql -- 存在空值计算后结果也为NULL SELECT ename,sal,comm,sal*12+comm FROM emp; -- IFNULL()函数给空值默认值 SELECT ename,sal,IFNULL(comm,0),sal*12+IFNULL(comm,0) FROM emp; ``` #### 7、列别名,AS可以省略 ```mysql SELECT ename,sal,IFNULL(comm,0),sal*12+IFNULL(comm,0) AS yearsal FROM emp; -- 省略AS SELECT ename '员工姓名',sal '月薪',IFNULL(comm,0) '补贴',sal*12+IFNULL(comm,0) '年薪总和' FROM emp; ``` #### 8、表别名,不能用中文 ```mysql SELECT ename '员工姓名',sal '月薪',IFNULL(comm,0) '补贴',sal*12+IFNULL(comm,0) '年薪总和' FROM emp e; ``` #### 9、多表重名查询 ```mysql -- emp.EMPno -- dept.DEPTno -- 当给表取别名后查询字段时不能使用原表名 SELECT e.EMPno '员工编号',e.ename '员工姓名' FROM emp e; ``` #### 10、消除重复行(DISTINCT) ```mysql SELECT DISTINCT emp.DEPTno FROM emp; -- 如果是多列数据,去重字段全相同的 SELECT DISTINCT emp.DEPTno,emp.job FROM emp; ``` ## 二、条件查询 #### 1、语法结构 ```sql SELECT [DISTINCT] 列 AS 列表名,列 FROM 表名 AS 别名 WHERE 条件表达式; -- WHERE是在磁盘读取后,进入内存之前进行筛选,因为没有进入内存加工,所以字段别名不能在WHERE中使用。 ``` #### 2、单条件查询 ##### 部门编号为10的所有员工信息 ```sql SELECT * FROM emp WHERE emp.DEPTno = 10; ``` ##### 查询入职日期为1987年4月19日入职的员工编号、姓名、入职日期 ```sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.hiredate '入职日期' FROM emp WHERE emp.hiredate = '1987-04-19'; ``` #### 3、比较查询 条件表达式运算符 = 等于,<>不等于,<小于,<=小于等于,>大于,>=大于等于 ##### 查询入职日期为1987年4月19日之前入职的员工编号、姓名、入职日期 ```sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.hiredate '入职日期' FROM emp WHERE emp.hiredate < '1987-04-19'; ``` ##### 查询职位为SALESMAN的员工编号、姓名、职位 ````sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.job '职位' FROM emp WHERE emp.job = 'SALESMAN'; ```` ##### 特殊比较运算符 | 语句语法 | 功能 | | ------------------------- | ----------------------------------------------------- | | IS NULL value | 是否为空 | | IS NOT NULL value | 是否不为空 | | IN (value1,value2...) | 可以查询等于多个值的数据 | | NOT IN (value1,value2...) | 可以查询不等于多个值的数据 | | BETWEEN value1 AND value2 | 可以查询在值1到值2之间的数据 | | LIKE 'value%(_)' | 模糊查询%为代表匹配零个或人一个字符,代表匹配一个字符 | | NOT LIKE 'value%()' | 模糊查询 | ##### 查询工资在1000到1500之间的员工编号、姓名、工资 ```sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.sal '工资' FROM emp WHERE emp.sal BETWEEN 1000 AND 1500; ``` ##### 查询部门编号为10号或20号的员工编号、姓名、部门编号 ```sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.DEPTno '部门编号' FROM emp WHERE emp.DEPTno IN (10,20); ``` ##### 查询部门编号不为10号或20号的员工编号、姓名、部门编号 ```sql SELECT emp.EMPno '员工编号',emp.ename '姓名',emp.DEPTno '部门编号' FROM emp WHERE emp.DEPTno NOT IN (10,20); ``` ##### 查询员工姓名以s开头的员工 ```sql SELECT * FROM emp WHERE emp.ename LIKE 's%'; ``` ##### 查询员工姓名中第二个字母是L的员工 ```sql SELECT * FROM emp WHERE emp.ename LIKE '_L%'; ``` ##### 查询员工姓名不以s开头的员工 ```sql SELECT * FROM emp WHERE emp.ename NOT LIKE 's%'; ``` ##### 查询员工姓名中第二个字母不是L的员工 ```sql SELECT * FROM emp WHERE emp.ename NOT LIKE '_L%'; ``` ##### 查询上级为空的员工 ```sql SELECT * FROM emp WHERE emp.mgr IS NULL; ``` ##### 查询上级不为空的员工 ```sql SELECT * FROM emp WHERE emp.mgr IS NOT NULL; ``` ## 多条件查询 #### 1、语法结构 ```sql SELECT [DISTINCT] 列名 FROM 表名 WHERE 条件1 逻辑运算符 条件2; ``` ##### 逻辑运算符 | 全称 | 符号 | 含义 | | ---- | ---- | ---- | | AND | && | 与 | | OR | \|\| | 或 | | NOT | | 非 | | XOR | | 异或 | ##### 查询工资大于1100且职位为'CLERK'的员工信息 ```sql SELECT * FROM emp WHERE emp.sal >1100 AND emp.job = 'CLERK'; ``` ##### 查询工资大于1100或职位为'CLERK'的员工信息 ````sql SELECT * FROM emp WHERE emp.sal > 1100 OR emp.job = 'CLERK'; ```` 最后修改:2025 年 10 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 👆请简单粗暴地爱我。