MySQL-- 单表查询

数据准备

-- 创建部门表
create table dept(deptno int(2),dname varchar(14),loc varchar(13));
-- 添加主键
alter table dept add constraint pk_dept_deptno primary key(deptno);-- -------------------------------------------------------------------
-- 创建员工表
create table emp(
empno int(4) primary key,
ename varchar(10),
job varchar(9),
mgr int(4),
hairdate date,
sal double(7,2),
comm double(7,2),
deptno int(2)
);
-- 添加外键
alter table emp add constraint fk_emp_deptno foreign key(deptno) references dept(deptno);-- 创建工资等级表
create table salgrade(grade int primary key,losal double(7,2),hisal double(7,2)
);-- 创建津贴表
create table bonus(ename varchar(10),job varchar(9),sal double(7,2),comm double(7,2)
);insert into dept(deptno,dname,loc)values(10,"ACCOUNTING","NEW YORK");
insert into dept(deptno,dname,loc)values(20,"RESTARCH","DALLAS");
insert into dept(deptno,dname,loc)values(30,"SALES","CHICAGO");
insert into dept(deptno,dname,loc)values(40,"OPERATIONS","BOSTON");insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7369,"SMITH","CLERK",7902,"1980-12-17",800,null,20);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7499,"ALLEN","SALESMAN",7698,"1981-02-20",1600,300,30);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7521,"WARD","SALESMAN",7698,"1981-02-22",1250,500,30);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7566,"JONES","MANAGER",7839,"1981-04-02",2975,null,20);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7654,"MANTIN","SALESMAN",7698,"1981-09-28",1250,1400,30);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7698,"BLAKE","MANAGER",7839,"1981-05-01",2850,null,30);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7782,"CLARK","MANAGER",7839,"1981-06-09",2450,null,10);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7788,"SCOTT","ANALYST",7566,"1987-04-19",3000,null,20);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7839,"KING","PRESIDENT",null,"1981-11-17",5000,null,10);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7844,"TURNER","SALESMAN",7698,"1981-09-08",1500,0,30);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7876,"ADAMS","CLERK",7788,"1987-05-23",1100,null,20);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7900,"JAMES","CLERK",7698,"1981-12-03",950,null,30);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7902,"FORD","ANALYST",7566,"1981-12-03",3000,null,20);
insert into emp(empno,ename,job,mgr,hairdate,sal,comm,deptno)values(7934,"MILLER","CLERK",7782,"1982-01-23",1300,null,10);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);-- ----------------------------------------------------------------------------------------------------------- 部门表 departmentselect *from  dept;-- 员工表 Employee
-- job 岗位 mar manager 上级编号 hiredate 入职时间 firedate 离职时间 salary 薪水 comm 补助select *from emp;
desc emp-- deptno 作为外键,参考dept表的主键 deptno;
-- mhr 作为外键,参考当前表 empno 自关联;select *from salgrade-- 工资等级 graded
-- losal 下限 hisal 上限;select *from bonus;

最简单的查询语句


1.显示所有列
mysql> select *from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job       | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MANTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
2.显示部分列
mysql> select empno,ename,job,sal from emp;  -- 注意不同字段要用“,”隔开
+-------+--------+-----------+---------+
| empno | ename  | job       | sal     |
+-------+--------+-----------+---------+
|  7369 | SMITH  | CLERK     |  800.00 |
|  7499 | ALLEN  | SALESMAN  | 1600.00 |
|  7521 | WARD   | SALESMAN  | 1250.00 |
|  7566 | JONES  | MANAGER   | 2975.00 |
|  7654 | MANTIN | SALESMAN  | 1250.00 |
|  7698 | BLAKE  | MANAGER   | 2850.00 |
|  7782 | CLARK  | MANAGER   | 2450.00 |
|  7788 | SCOTT  | ANALYST   | 3000.00 |
|  7839 | KING   | PRESIDENT | 5000.00 |
|  7844 | TURNER | SALESMAN  | 1500.00 |
|  7876 | ADAMS  | CLERK     | 1100.00 |
|  7900 | JAMES  | CLERK     |  950.00 |
|  7902 | FORD   | ANALYST   | 3000.00 |
|  7934 | MILLER | CLERK     | 1300.00 |
+-------+--------+-----------+---------+
14 rows in set (0.00 sec)
3.算术运算
mysql> select empno,ename,job,sal,comm,sal+comm from emp;
+-------+--------+-----------+---------+---------+----------+
| empno | ename  | job       | sal     | comm    | sal+comm |
+-------+--------+-----------+---------+---------+----------+
|  7369 | SMITH  | CLERK     |  800.00 |    NULL |     NULL |
|  7499 | ALLEN  | SALESMAN  | 1600.00 |  300.00 |  1900.00 |
|  7521 | WARD   | SALESMAN  | 1250.00 |  500.00 |  1750.00 |
|  7566 | JONES  | MANAGER   | 2975.00 |    NULL |     NULL |
|  7654 | MANTIN | SALESMAN  | 1250.00 | 1400.00 |  2650.00 |
|  7698 | BLAKE  | MANAGER   | 2850.00 |    NULL |     NULL |
|  7782 | CLARK  | MANAGER   | 2450.00 |    NULL |     NULL |
|  7788 | SCOTT  | ANALYST   | 3000.00 |    NULL |     NULL |
|  7839 | KING   | PRESIDENT | 5000.00 |    NULL |     NULL |
|  7844 | TURNER | SALESMAN  | 1500.00 |    0.00 |  1500.00 |
|  7876 | ADAMS  | CLERK     | 1100.00 |    NULL |     NULL |
|  7900 | JAMES  | CLERK     |  950.00 |    NULL |     NULL |
|  7902 | FORD   | ANALYST   | 3000.00 |    NULL |     NULL |
|  7934 | MILLER | CLERK     | 1300.00 |    NULL |     NULL |
+-------+--------+-----------+---------+---------+----------+
14 rows in set (0.00 sec)-- 结果很显然,sal+comm 所得结果:如果comm为NULL 则sal+comm也为空,这显然不是我们想要的结果,解决方案会在后面提出
4.去重
mysql> select job from emp;
+-----------+
| job       |
+-----------+
| CLERK     |
| SALESMAN  |
| SALESMAN  |
| MANAGER   |
| SALESMAN  |
| MANAGER   |
| MANAGER   |
| ANALYST   |
| PRESIDENT |
| SALESMAN  |
| CLERK     |
| CLERK     |
| ANALYST   |
| CLERK     |
+-----------+
14 rows in set (0.00 sec)mysql> select distinct job from emp;  -- distinct 去重
+-----------+
| job       |
+-----------+
| CLERK     |
| SALESMAN  |
| MANAGER   |
| ANALYST   |
| PRESIDENT |
+-----------+
5 rows in set (0.00 sec)mysql> select distinct ename,job from emp; -- 对后面所有列去重
+--------+-----------+
| ename  | job       |
+--------+-----------+
| SMITH  | CLERK     |
| ALLEN  | SALESMAN  |
| WARD   | SALESMAN  |
| JONES  | MANAGER   |
| MANTIN | SALESMAN  |
| BLAKE  | MANAGER   |
| CLARK  | MANAGER   |
| SCOTT  | ANALYST   |
| KING   | PRESIDENT |
| TURNER | SALESMAN  |
| ADAMS  | CLERK     |
| JAMES  | CLERK     |
| FORD   | ANALYST   |
| MILLER | CLERK     |
+--------+-----------+
14 rows in set (0.00 sec)
5.排序
mysql> select *from emp order by sal asc;  -- 升序排列,默认为升序,asc可省略
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job       | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MANTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)mysql> select *from emp order by sal desc;-- 降序排列
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job       | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MANTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)6.别名
mysql> select empno 编号,ename 姓名,job "职    位",sal 工资 from emp;-- “;;职  位”中间有空格,必须用“”;
+--------+--------+------------+---------+
| 编号   | 姓名   | 职    位   | 工资    |
+--------+--------+------------+---------+
|   7369 | SMITH  | CLERK      |  800.00 |
|   7499 | ALLEN  | SALESMAN   | 1600.00 |
|   7521 | WARD   | SALESMAN   | 1250.00 |
|   7566 | JONES  | MANAGER    | 2975.00 |
|   7654 | MANTIN | SALESMAN   | 1250.00 |
|   7698 | BLAKE  | MANAGER    | 2850.00 |
|   7782 | CLARK  | MANAGER    | 2450.00 |
|   7788 | SCOTT  | ANALYST    | 3000.00 |
|   7839 | KING   | PRESIDENT  | 5000.00 |
|   7844 | TURNER | SALESMAN   | 1500.00 |
|   7876 | ADAMS  | CLERK      | 1100.00 |
|   7900 | JAMES  | CLERK      |  950.00 |
|   7902 | FORD   | ANALYST    | 3000.00 |
|   7934 | MILLER | CLERK      | 1300.00 |
+--------+--------+------------+---------+
14 rows in set (0.00 sec)mysql> select empno as 编号,ename as 姓名 from emp; as alias 别名,可以省略
+--------+--------+
| 编号   | 姓名   |
+--------+--------+
|   7369 | SMITH  |
|   7499 | ALLEN  |
|   7521 | WARD   |
|   7566 | JONES  |
|   7654 | MANTIN |
|   7698 | BLAKE  |
|   7782 | CLARK  |
|   7788 | SCOTT  |
|   7839 | KING   |
|   7844 | TURNER |
|   7876 | ADAMS  |
|   7900 | JAMES  |
|   7902 | FORD   |
|   7934 | MILLER |
+--------+--------+
14 rows in set (0.00 sec)

where 子句

1.-- 最简单的条件 关系运算符
mysql> select empno,ename,sal from emp where sal<=2500;
+-------+--------+---------+
| empno | ename  | sal     |
+-------+--------+---------+
|  7369 | SMITH  |  800.00 |
|  7499 | ALLEN  | 1600.00 |
|  7521 | WARD   | 1250.00 |
|  7654 | MANTIN | 1250.00 |
|  7782 | CLARK  | 2450.00 |
|  7844 | TURNER | 1500.00 |
|  7876 | ADAMS  | 1100.00 |
|  7900 | JAMES  |  950.00 |
|  7934 | MILLER | 1300.00 |
+-------+--------+---------+
9 rows in set (0.00 sec)mysql> select empno,ename,job,sal from emp where job="CLERK";
+-------+--------+-------+---------+
| empno | ename  | job   | sal     |
+-------+--------+-------+---------+
|  7369 | SMITH  | CLERK |  800.00 |
|  7876 | ADAMS  | CLERK | 1100.00 |
|  7900 | JAMES  | CLERK |  950.00 |
|  7934 | MILLER | CLERK | 1300.00 |
+-------+--------+-------+---------+
4 rows in set (0.00 sec)mysql> select empno,ename,job,sal from emp where job!="CLERK";-- 不等于
+-------+--------+-----------+---------+
| empno | ename  | job       | sal     |
+-------+--------+-----------+---------+
|  7499 | ALLEN  | SALESMAN  | 1600.00 |
|  7521 | WARD   | SALESMAN  | 1250.00 |
|  7566 | JONES  | MANAGER   | 2975.00 |
|  7654 | MANTIN | SALESMAN  | 1250.00 |
|  7698 | BLAKE  | MANAGER   | 2850.00 |
|  7782 | CLARK  | MANAGER   | 2450.00 |
|  7788 | SCOTT  | ANALYST   | 3000.00 |
|  7839 | KING   | PRESIDENT | 5000.00 |
|  7844 | TURNER | SALESMAN  | 1500.00 |
|  7902 | FORD   | ANALYST   | 3000.00 |
+-------+--------+-----------+---------+
10 rows in set (0.00 sec)
mysql> select empno,ename,job,sal from emp where job<>"CLERK";-- 不等于
+-------+--------+-----------+---------+
| empno | ename  | job       | sal     |
+-------+--------+-----------+---------+
|  7499 | ALLEN  | SALESMAN  | 1600.00 |
|  7521 | WARD   | SALESMAN  | 1250.00 |
|  7566 | JONES  | MANAGER   | 2975.00 |
|  7654 | MANTIN | SALESMAN  | 1250.00 |
|  7698 | BLAKE  | MANAGER   | 2850.00 |
|  7782 | CLARK  | MANAGER   | 2450.00 |
|  7788 | SCOTT  | ANALYST   | 3000.00 |
|  7839 | KING   | PRESIDENT | 5000.00 |
|  7844 | TURNER | SALESMAN  | 1500.00 |
|  7902 | FORD   | ANALYST   | 3000.00 |
+-------+--------+-----------+---------+
10 rows in set (0.00 sec)
2.-- 逻辑运算符 and
mysql> select *from emp where sal>=1500&&sal<=3000;
+-------+--------+----------+------+------------+---------+--------+--------+
| empno | ename  | job      | mgr  | hiredate   | sal     | comm   | deptno |
+-------+--------+----------+------+------------+---------+--------+--------+
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 |     30 |
|  7566 | JONES  | MANAGER  | 7839 | 1981-04-02 | 2975.00 |   NULL |     20 |
|  7698 | BLAKE  | MANAGER  | 7839 | 1981-05-01 | 2850.00 |   NULL |     30 |
|  7782 | CLARK  | MANAGER  | 7839 | 1981-06-09 | 2450.00 |   NULL |     10 |
|  7788 | SCOTT  | ANALYST  | 7566 | 1987-04-19 | 3000.00 |   NULL |     20 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 |   0.00 |     30 |
|  7902 | FORD   | ANALYST  | 7566 | 1981-12-03 | 3000.00 |   NULL |     20 |
+-------+--------+----------+------+------------+---------+--------+--------+
7 rows in set, 1 warning (0.00 sec)mysql> select *from emp where sal>=1500 and sal<=3000;
+-------+--------+----------+------+------------+---------+--------+--------+
| empno | ename  | job      | mgr  | hiredate   | sal     | comm   | deptno |
+-------+--------+----------+------+------------+---------+--------+--------+
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 |     30 |
|  7566 | JONES  | MANAGER  | 7839 | 1981-04-02 | 2975.00 |   NULL |     20 |
|  7698 | BLAKE  | MANAGER  | 7839 | 1981-05-01 | 2850.00 |   NULL |     30 |
|  7782 | CLARK  | MANAGER  | 7839 | 1981-06-09 | 2450.00 |   NULL |     10 |
|  7788 | SCOTT  | ANALYST  | 7566 | 1987-04-19 | 3000.00 |   NULL |     20 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 |   0.00 |     30 |
|  7902 | FORD   | ANALYST  | 7566 | 1981-12-03 | 3000.00 |   NULL |     20 |
+-------+--------+----------+------+------------+---------+--------+--------+
7 rows in set (0.00 sec)
3.-- 逻辑运算符 or
mysql> select *from emp where job="CLERK" || job="SALESMAN";
+-------+--------+----------+------+------------+---------+---------+--------+
| empno | ename  | job      | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK    | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MANTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK    | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK    | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7934 | MILLER | CLERK    | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+----------+------+------------+---------+---------+--------+
8 rows in set, 1 warning (0.00 sec)mysql> select *from emp where job="CLERK" or job="SALESMAN";
+-------+--------+----------+------+------------+---------+---------+--------+
| empno | ename  | job      | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK    | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MANTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK    | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK    | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7934 | MILLER | CLERK    | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+----------+------+------------+---------+---------+--------+
8 rows in set (0.00 sec)
4.-- 模糊匹配 % _mysql> select *from emp where ename like "%A%";  --"%":任意多个字符,表示‘A’前面和后面可以有任意多个字符
+-------+--------+----------+------+------------+---------+---------+--------+
| empno | ename  | job      | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MANTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER  | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER  | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7876 | ADAMS  | CLERK    | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK    | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
+-------+--------+----------+------+------------+---------+---------+--------+
7 rows in set (0.00 sec)mysql> select *from emp where ename like "_A%";  --“—”:任意一个字符,表示‘A’前面可以有任意一个字符,后面可以有任意多个字符
+-------+--------+----------+------+------------+---------+---------+--------+
| empno | ename  | job      | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------+----------+------+------------+---------+---------+--------+
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7654 | MANTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7900 | JAMES  | CLERK    | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
+-------+--------+----------+------+------------+---------+---------+--------+
3 rows in set (0.00 sec)5.-- 小括号 --运算优先级最高
mysql> select *from emp where job="MANAGER" or job="CLERK" and sal>=2500;
+-------+-------+---------+------+------------+---------+------+--------+
| empno | ename | job     | mgr  | hiredate   | sal     | comm | deptno |
+-------+-------+---------+------+------------+---------+------+--------+
|  7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL |     20 |
|  7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL |     30 |
|  7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL |     10 |
+-------+-------+---------+------+------------+---------+------+--------+
3 rows in set (0.00 sec)mysql> select *from emp where (job="MANAGER" or job="CLERK") and sal>=2500;
+-------+-------+---------+------+------------+---------+------+--------+
| empno | ename | job     | mgr  | hiredate   | sal     | comm | deptno |
+-------+-------+---------+------+------------+---------+------+--------+
|  7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL |     20 |
|  7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL |     30 |
+-------+-------+---------+------+------------+---------+------+--------+
2 rows in set (0.00 sec)

使用函数

-- 函数作用:提高select查询数据的能力
-- 函数不会修改数据库的数据-- 函数的分类-- 单行函数 -- 字符串函数
mysql> select empno,ename,lower(ename),upper(ename),job ,sal from emp order by sal desc;
+-------+--------+--------------+--------------+-----------+---------+
| empno | ename  | lower(ename) | upper(ename) | job       | sal     |
+-------+--------+--------------+--------------+-----------+---------+
|  7839 | KING   | king         | KING         | PRESIDENT | 5000.00 |
|  7788 | SCOTT  | scott        | SCOTT        | ANALYST   | 3000.00 |
|  7902 | FORD   | ford         | FORD         | ANALYST   | 3000.00 |
|  7566 | JONES  | jones        | JONES        | MANAGER   | 2975.00 |
|  7698 | BLAKE  | blake        | BLAKE        | MANAGER   | 2850.00 |
|  7782 | CLARK  | clark        | CLARK        | MANAGER   | 2450.00 |
|  7499 | ALLEN  | allen        | ALLEN        | SALESMAN  | 1600.00 |
|  7844 | TURNER | turner       | TURNER       | SALESMAN  | 1500.00 |
|  7934 | MILLER | miller       | MILLER       | CLERK     | 1300.00 |
|  7521 | WARD   | ward         | WARD         | SALESMAN  | 1250.00 |
|  7654 | MANTIN | mantin       | MANTIN       | SALESMAN  | 1250.00 |
|  7876 | ADAMS  | adams        | ADAMS        | CLERK     | 1100.00 |
|  7900 | JAMES  | james        | JAMES        | CLERK     |  950.00 |
|  7369 | SMITH  | smith        | SMITH        | CLERK     |  800.00 |
+-------+--------+--------------+--------------+-----------+---------+
14 rows in set (0.00 sec)-- 数值函数
mysql> select abs(-5),ceil(5.4),floor(5.6),round(3.14) from dual;-- dual 虚拟表,不用创建表也可以使用,便于练习
+---------+-----------+------------+-------------+
| abs(-5) | ceil(5.4) | floor(5.6) | round(3.14) |
+---------+-----------+------------+-------------+
|       5 |         6 |          5 |           3 |
+---------+-----------+------------+-------------+
1 row in set (0.00 sec)mysql> select abs(-5),ceil(5.4),floor(5.6),round(3.14);-- 如果没有where子句,“from dual”可以省略
+---------+-----------+------------+-------------+
| abs(-5) | ceil(5.4) | floor(5.6) | round(3.14) |
+---------+-----------+------------+-------------+
|       5 |         6 |          5 |           3 |
+---------+-----------+------------+-------------+
1 row in set (0.00 sec)-- abs() 绝对值,ceil() 上限,floor() 下限,round() 四舍五入
-- 日期和时间函数
mysql> select curdate(),curtime(); -- 日期和时间分离
+------------+-----------+
| curdate()  | curtime() |
+------------+-----------+
| 2021-09-25 | 09:55:54  |
+------------+-----------+
1 row in set (0.00 sec)mysql> select now(),sysdate(),sleep(2),now(),sysdate(); -- 日期和时间结合
+---------------------+---------------------+----------+---------------------+---------------------+
| now()               | sysdate()           | sleep(2) | now()               | sysdate()           |
+---------------------+---------------------+----------+---------------------+---------------------+
| 2021-09-25 09:56:40 | 2021-09-25 09:56:40 |        0 | 2021-09-25 09:56:40 | 2021-09-25 09:56:42 |
+---------------------+---------------------+----------+---------------------+---------------------+
1 row in set (2.02 sec)
-- sleep(n) 睡眠n秒,now() 的时间不会更新,sysdate() 的时间会更新 详情见上表
-- 流程函数-- if
mysql> select empno,ename,job,sal,if(sal>=2500,"高新","低薪")from emp order by sal;
+-------+--------+-----------+---------+---------------------------------+
| empno | ename  | job       | sal     | if(sal>=2500,"高新","低薪")     |
+-------+--------+-----------+---------+---------------------------------+
|  7369 | SMITH  | CLERK     |  800.00 | 低薪                            |
|  7900 | JAMES  | CLERK     |  950.00 | 低薪                            |
|  7876 | ADAMS  | CLERK     | 1100.00 | 低薪                            |
|  7521 | WARD   | SALESMAN  | 1250.00 | 低薪                            |
|  7654 | MANTIN | SALESMAN  | 1250.00 | 低薪                            |
|  7934 | MILLER | CLERK     | 1300.00 | 低薪                            |
|  7844 | TURNER | SALESMAN  | 1500.00 | 低薪                            |
|  7499 | ALLEN  | SALESMAN  | 1600.00 | 低薪                            |
|  7782 | CLARK  | MANAGER   | 2450.00 | 低薪                            |
|  7698 | BLAKE  | MANAGER   | 2850.00 | 高新                            |
|  7566 | JONES  | MANAGER   | 2975.00 | 高新                            |
|  7788 | SCOTT  | ANALYST   | 3000.00 | 高新                            |
|  7902 | FORD   | ANALYST   | 3000.00 | 高新                            |
|  7839 | KING   | PRESIDENT | 5000.00 | 高新                            |
+-------+--------+-----------+---------+---------------------------------+
14 rows in set (0.00 sec)
-- if(条件表达式,A,B) 如果表达式为true则A,否则B;mysql> select empno,ename,job,sal,comm,sal+ifnull(comm,0) 总工资 from emp;
+-------+--------+-----------+---------+---------+-----------+
| empno | ename  | job       | sal     | comm    | 总工资    |
+-------+--------+-----------+---------+---------+-----------+
|  7369 | SMITH  | CLERK     |  800.00 |    NULL |    800.00 |
|  7499 | ALLEN  | SALESMAN  | 1600.00 |  300.00 |   1900.00 |
|  7521 | WARD   | SALESMAN  | 1250.00 |  500.00 |   1750.00 |
|  7566 | JONES  | MANAGER   | 2975.00 |    NULL |   2975.00 |
|  7654 | MANTIN | SALESMAN  | 1250.00 | 1400.00 |   2650.00 |
|  7698 | BLAKE  | MANAGER   | 2850.00 |    NULL |   2850.00 |
|  7782 | CLARK  | MANAGER   | 2450.00 |    NULL |   2450.00 |
|  7788 | SCOTT  | ANALYST   | 3000.00 |    NULL |   3000.00 |
|  7839 | KING   | PRESIDENT | 5000.00 |    NULL |   5000.00 |
|  7844 | TURNER | SALESMAN  | 1500.00 |    0.00 |   1500.00 |
|  7876 | ADAMS  | CLERK     | 1100.00 |    NULL |   1100.00 |
|  7900 | JAMES  | CLERK     |  950.00 |    NULL |    950.00 |
|  7902 | FORD   | ANALYST   | 3000.00 |    NULL |   3000.00 |
|  7934 | MILLER | CLERK     | 1300.00 |    NULL |   1300.00 |
+-------+--------+-----------+---------+---------+-----------+
14 rows in set (0.00 sec)
-- ifnull(A,0) 如果A为null,则A值取0;填坑上文mysql> select nullif(1,1),nullif(1,2);
+-------------+-------------+
| nullif(1,1) | nullif(1,2) |
+-------------+-------------+
|        NULL |           1 |
+-------------+-------------+
1 row in set (0.00 sec)nullif(A,B) 如果A和B相等返回NULL,否则返回A;
-- case-- case 等值判断 switch
mysql> select empno,ename,job,
case job when "CLERK" then "店员" when "SALESMAN" then "销售" when "MANAGER" then "经理 "else "其他"
end 岗位, -- 以case job开始,以end结束,end后面可以自定义列名;
sal from emp order by sal;
+-------+--------+-----------+---------+---------+
| empno | ename  | job       | 岗位    | sal     |
+-------+--------+-----------+---------+---------+
|  7369 | SMITH  | CLERK     | 店员    |  800.00 |
|  7900 | JAMES  | CLERK     | 店员    |  950.00 |
|  7876 | ADAMS  | CLERK     | 店员    | 1100.00 |
|  7521 | WARD   | SALESMAN  | 销售    | 1250.00 |
|  7654 | MANTIN | SALESMAN  | 销售    | 1250.00 |
|  7934 | MILLER | CLERK     | 店员    | 1300.00 |
|  7844 | TURNER | SALESMAN  | 销售    | 1500.00 |
|  7499 | ALLEN  | SALESMAN  | 销售    | 1600.00 |
|  7782 | CLARK  | MANAGER   | 经理    | 2450.00 |
|  7698 | BLAKE  | MANAGER   | 经理    | 2850.00 |
|  7566 | JONES  | MANAGER   | 经理    | 2975.00 |
|  7788 | SCOTT  | ANALYST   | 其他    | 3000.00 |
|  7902 | FORD   | ANALYST   | 其他    | 3000.00 |
|  7839 | KING   | PRESIDENT | 其他    | 5000.00 |
+-------+--------+-----------+---------+---------+
14 rows in set (0.00 sec)-- case 区间判断 if_else if_elsemysql> select empno,ename,job,sal,case  when sal<=1000 then "E" when sal<=2000 then "D"when sal<=3000 then "C" when sal<=4000 then "B"when sal<=5000 then "A"else "其他" end 工资等级 from emp order by sal;
+-------+--------+-----------+---------+--------------+
| empno | ename  | job       | sal     | 工资等级     |
+-------+--------+-----------+---------+--------------+
|  7369 | SMITH  | CLERK     |  800.00 | E            |
|  7900 | JAMES  | CLERK     |  950.00 | E            |
|  7876 | ADAMS  | CLERK     | 1100.00 | D            |
|  7521 | WARD   | SALESMAN  | 1250.00 | D            |
|  7654 | MANTIN | SALESMAN  | 1250.00 | D            |
|  7934 | MILLER | CLERK     | 1300.00 | D            |
|  7844 | TURNER | SALESMAN  | 1500.00 | D            |
|  7499 | ALLEN  | SALESMAN  | 1600.00 | D            |
|  7782 | CLARK  | MANAGER   | 2450.00 | C            |
|  7698 | BLAKE  | MANAGER   | 2850.00 | C            |
|  7566 | JONES  | MANAGER   | 2975.00 | C            |
|  7788 | SCOTT  | ANALYST   | 3000.00 | C            |
|  7902 | FORD   | ANALYST   | 3000.00 | C            |
|  7839 | KING   | PRESIDENT | 5000.00 | A            |
+-------+--------+-----------+---------+--------------+
14 rows in set (0.00 sec)-- 多行函数
-- max(n),min(n),sum(n),count(n),avg(n)
-- 除了这五个多行函数,其余都是单行函数
-- 其中max(),nin(),count()中参数n可以为任意数据类型,sum(),avg() 中n应为数值类型

group by------having 子句


-- 利用 group by语句实现按照岗位计算平均工资
mysql> select job,avg(sal),count(1) from emp group by job order by avg(sal) desc;
+-----------+-------------+----------+
| job       | avg(sal)    | count(1) |
+-----------+-------------+----------+
| PRESIDENT | 5000.000000 |        1 |
| ANALYST   | 3000.000000 |        2 |
| MANAGER   | 2758.333333 |        3 |
| SALESMAN  | 1400.000000 |        4 |
| CLERK     | 1037.500000 |        4 |
+-----------+-------------+----------+
5 rows in set (0.00 sec)
-- 使用where子句去除 “MANGER”
mysql> select job,avg(sal),count(1) from emp where job!="MANAGER" group by job order by avg(sal) desc;
+-----------+-------------+----------+
| job       | avg(sal)    | count(1) |
+-----------+-------------+----------+
| PRESIDENT | 5000.000000 |        1 |
| ANALYST   | 3000.000000 |        2 |
| SALESMAN  | 1400.000000 |        4 |
| CLERK     | 1037.500000 |        4 |
+-----------+-------------+----------+
4 rows in set (0.00 sec)
-- 使用having去除 “MANAGER”
mysql> select job,avg(sal),count(1) from emp group by job having job!="MANAGER" order by avg(sal) desc;
+-----------+-------------+----------+
| job       | avg(sal)    | count(1) |
+-----------+-------------+----------+
| PRESIDENT | 5000.000000 |        1 |
| ANALYST   | 3000.000000 |        2 |
| SALESMAN  | 1400.000000 |        4 |
| CLERK     | 1037.500000 |        4 |
+-----------+-------------+----------+
4 rows in set (0.00 sec)
-- 顺序:先where再group by再having
mysql> select job,avg(sal),count(1) from emp where job!="MANAGER" group by job having avg(sal)>2000 order by avg(sal) desc;
+-----------+-------------+----------+
| job       | avg(sal)    | count(1) |
+-----------+-------------+----------+
| PRESIDENT | 5000.000000 |        1 |
| ANALYST   | 3000.000000 |        2 |
+-----------+-------------+----------+
2 rows in set (0.00 sec)-- where 子句中不能出现多行函数
-- group by 子句中的字段可以再select子句中出现

select语法格式

select 书写顺序select column,group_function   -- conlumn 纵队,此处表示“字段”from table   -- 想要查询的表where conditiongroup by column  group_by_exxpressionhaving condition group_conditionorder by column;select 语句执行顺序from--where--group by--having--select--order by;-- group by 之前的子句不可以使用多行函数,之后的语句可以使用多行函数

MySQL-- 单表查询相关推荐

  1. Mysql 单表查询where初识

    Mysql 单表查询where初识 准备数据 -- 创建测试库 -- drop database if exists student_db; create database student_db ch ...

  2. 运维高级学习(三):MySQL单表查询作业

    MySQL第三次作业 MySQL单表查询作业 素材如下: DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `cs_id` int(11) ...

  3. MySQL单表查询基础卷(A)

    MySQL单表查询基础卷(A) 第一章 数据准备 第二章 数据展示 第三章 题目说明 第四章 参考答案 第一章 数据准备 -- 创建数据库,指定字符集 utf8 CREATE DATABASE IF ...

  4. mysql 单表查询

    一 单表查询的语法 SELECT 字段1,字段2... FROM 表名WHERE 条件GROUP BY fieldHAVING 筛选ORDER BY fieldLIMIT 限制条数 二 关键字的执行优 ...

  5. 0x06 MySQL 单表查询

    一 单表查询语法 SELECT 字段1,字段2... FROM 表名WHERE 条件GROUP BY fieldHAVING 筛选ORDER BY fieldLIMIT 限制条数 二 关键字执行优先级 ...

  6. mysql单表查询详解

    文章目录 一.单表查询 1.1 创建数据库 1.2 单表查询 1.2.1 查询所有字段 1.2.2 使用通配符*查询所有字段 1.2.3 查询指定字段 1.2.4 去重distinct的使用 1.2. ...

  7. mysql单表查询实例_MySQL简单查询详解-单表查询

    MySQL简单查询详解-单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询的执行路径 一条SQL查询语句的执行过程大致如下图所示: 1>.客户端和服务端通过my ...

  8. Mysql单表查询和多表查询

    单表查询 一 单表查询的语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法select * from, ...

  9. MySQL单表查询练习题

    数据准备:install.bat @ECHO OFF ::未配置环境变量下 cd C:\Program Files\MySQL\MySQL Server 5.7\bin\ SET dbhost=127 ...

  10. MySQL单表查询例题

    一.单表查询 CREATE TABLE `worker` (  `部门号` int(11) NOT NULL,  `职工号` int(11) NOT NULL,  `工作时间` date NOT NU ...

最新文章

  1. 2020 Kaggle年度报告发布:美国公司最容易「人均百万」,90%数据科学家坚持终生学习...
  2. Kotlin极简教程:第10章 Kotlin与Java互操作
  3. Spring在bean配置文件中定义电子邮件模板
  4. 多线程编程: Compare And Swap (CAS)
  5. php accesscontrolalloworigin,设置Access-Control-Allow-Origin实现跨域访问
  6. 机器学习——统计学习方法——第1章 统计学习及监督学习概论
  7. 这个0day 影响启用 Sandbox 的多数 Windows 10 版本
  8. 调试系列2:bugreport实战篇
  9. 回来了,回来了,感触很深!
  10. C++:怎样把一个int转成4个字节?
  11. 2021-06-22Oracle常用函数
  12. opencv4nodejs安装
  13. Lvs之NAT、DR、TUN三种模式的应用配置案例
  14. 《蜗居》经典台词100句
  15. 物体识别基本原理及其Python实现
  16. ImageMagick中的convert命令转JEPG图像到PNG
  17. 云服务器怎么换ip云服务器,云服务器换ip难不难?云服务器换IP的步骤
  18. CPU四核八线程和四核四线程的区别
  19. USB2.0挂载FatFs文件系统
  20. Linux系统编程 复习笔记

热门文章

  1. Deep Web(深层网络or深度网络)
  2. Unity发布小游戏(五):小游戏的打包与上传到CCD云服务器
  3. [转]如何学习《离散数学》?
  4. 胡说八道JVM—垃圾回收算法和垃圾回收器
  5. Linux 删除指定目录下指定后缀名的所有文件
  6. 【行业篇】一、汽车软硬架构 - EEA/SOA
  7. 3D模型欣赏:黑色的巴斯泰托女神【3D游戏建模教程】
  8. 针对腾讯云服务器 外网不能访问的问题
  9. Photo Album: Wicresoft
  10. centos7安装后ping不通外网问题解决