在讲解单表查询时,首先创建一个emp的员工表,表中字段包括:empno(员工编号)、ename(员工姓名)、job(员工职位)、mgr(员工领导)、hiredate(员工入职日期)、sal(员工月薪)、comm(员工津贴)、deptno(员工部门编号):
create table emp(
emp_id int(4) primary key,
emp_name varchar(5),
emp_job varchar(10),
emp_mgr varchar(5),
emp_hiredate date,
emp_sal decimal(7,2),
emp_comm decimal(7,2),
emp_deptno int(2)
);
为emp员工表插入多条数据:
insert emp values
(7369, 'Smith', 'clerk', 7902, '1980-12-17', 800, null, 20),
(7499, 'Allen', 'salesman', 7698, '1981-02-20', 1600, 300, 30),
(7521, 'Ward', 'salesman', 7698, '1981-02-22', 1250, 500, 30),
(7566, 'Jones', 'manager', 7839, '1981-04-02', 2975, null, 20),
(7654, 'Maritn', 'salesman', 7698, '1981-09-28', 1250, 1400, 30),
(7698, 'Blake', 'manager', 7839, '1981-05-01', 2850, null, 30),
(7782, 'Clark', 'manager', 7839, '1981-06-09', 2450, null, 10),
(7788, 'Scott', 'analyst', 7566, '1987-04-19', 3000, null, 20),
(7839, 'King', 'president', null, '1981-11-17', 5000, null, 10),
(7844, 'Turner', 'salesman', 7698, '1981-09-08', 1500, 0, 30),
(7876, 'Adams', 'clerk', 7788, '1987-05-23', 1100, null, 20),
(7900, 'James', 'clerk', 7698, '1981-12-03', 950, null, 30),
(7902, 'Ford', 'analyst', 7566, '1981-12-03', 3000, null, 20),
(7934, 'Miller', 'clerk', 7782, '1982-01-23', 1300, null, 10);
1.简单查询:
1.查询所有数据:
select * from emp;
2.查询指定数据
select emp_id,emp_name,emp_hiredate from emp;
3.去重复记录的查询:
select distinct emp_deptno from emp;
4.使用算术运算符的查询:
select emp_id,emp_name,emp_job,emp_sal*12 from emp;
5.使用字段别名的查询:
select emp_id,emp_name,emp_job as work,emp_sal*12 as yearsalary from emp;
6.设置数据显示格式的查询:
select concat('工号:',emp_id,',姓名:',emp_name,',部门:',emp_deptno,',职位:',emp_job,',年薪:',emp_sal*12) as info from emp;#如果数据中有一个为null,则返回null
2.对查询结果排序:
1.按照指定的单字段排序:
select emp_id,emp_name,emp_job,emp_sal*12 as year_sal from emp order by year_sal;
2.按照指定的多字段排序(asc和desc分别表示升序和降序,升序时可不写asc):
select emp_id,emp_name,emp_job,emp_sal*12 as year_sal from emp order by year_sal,emp_name;
3.条件查询:
1.使用比较运算符进行查询:
select emp_id,emp_name,emp_job from emp where emp_job='clerk';
2.使用[not] between and 的范围查询:
select emp_id,emp_name,emp_job from emp where emp_id between 7800 and 8000;
3.使用in的条件查询:
select emp_id,emp_name,emp_job from emp where emp_job in ('clerk');
4.使用is [not] null的空值查询:
select emp_id,emp_name,emp_job,emp_comm from emp where emp_comm is null;
5.使用[not] like的模糊查询:
a.使用 “%”通配符的模糊查询:
select * from emp where emp_name like 'S%';
b.使用“_”通配符的模糊查询:
select * from emp where emp_name like "_l%";
c.使用not like的模糊查询:
select * from emp where emp_name not like "%s%";
6.使用and的多条件查询:
select * from emp where emp_name like "%s%" and emp_sal>1200;
7.使用or的多条件查询:
select * from emp where emp_name not like "%s%" or emp_sal >2000;
4.限制查询:
1.不指定初始位置的限制查询:
select * from emp where emp_name not like "%S%" limit 3;
2.指定初始位置的限制查询:
select * from emp where emp_name not like "%S%" limit 3,3;
5.使用函数查询:
1.单行函数:
1->:select concat('工号:',emp_id,',姓名:',emp_name,',工资:',emp_sal) as info from emp where emp_sal>1000;#concat函数
2->:select * from emp where length(emp_name)> 5;#length函数
3->:select * ,lower(emp_name),upper(emp_name) from emp where emp_sal>2000;#lower,upper函数
4->:select * ,replace(emp_job,'clerk','staff') newjob from emp where emp_job = 'clerk';#replace函数
5->:select *,substring(emp_name,1,3) subname from emp where emp_job = 'clerk';#substring函数
2.数值函数:
MySQL为我们提供了一个名为'dual'的虚拟表,我们可以用它来进行演示,如果没有where语句,我们可以省略from dual语句。
1.abs(),ceil(),floor(),mod(),pi(),pow()函数的使用:
1->:select abs(-1.2);#取绝对值
2->:select ceil(1.2);#向上取值
3->:select floor(1.2);#向下取值
4->:select mod(5,2);#取模
5->:select pi();#取圆周率的值
6->:select pow(2,3);取指数的值,2的3次方
2.rand()函数的使用(产生0,1之间的随机数值)
1->:select rand(),rand();#产生两个0,1之间的随机数
2->:select rand()*5;#产生0,5之间的随机数
3->:select floor(rand()*5);#产生0,5之间的随机整数,5产生的概率基本为0
4->:select round(pi()),round(pi(),2),round(pi(),4);#取小数点后位数,四舍五入
5->:select truncate(pi(),0),truncate(pi(),2),truncate(pi(),4);#取小数点后位数,直接截断,而不是四舍五入,且位数无默认位。
2.日期与时间函数:
1.使用curdata(),curtime(),now()函数查询:
select curdate(),curtime(),now();#获取日期,时间与日期时间
2.systdate()函数的使用:
select sysdate();#获得系统时间
3.使用dayofyear(),dayofweek(),week()函数查询:
select dayofyear(curdate()),dayofweek(curdate());#查询当前日期为该年第多少天,该周多少周(从周日起算)
select week(curdate());#查询当前日期位于该年多少周
4.使用date_add(),date_sub()函数查询
select date_add(curdate(),interval '10' day);#interval(间隔) day为间隔类型
select date_sub(curdate(),interval '10' day);
5.使用datediff()函数查询
select datediff('2019-5-20',curdate());#计算日期间隔
4.流程函数
1.使用if()函数查询:
select emp_id,emp_name,emp_sal,if(emp_sal>2000,'high','low') as sal_level from emp where emp_deptno = 20;
2.使用ifnull()函数查询:
1->:select emp_id,emp_name,emp_sal,emp_comm,emp_sal*12+emp_comm as year_income from emp where emp_deptno = 30;#不使用ifnull()函数,与使用进行对比
2->:select emp_id,emp_name,emp_sal,emp_comm,emp_sal*12+ifnull(emp_comm,0) as year_income from emp where emp_deptno = 30;#使用ifnull()函数
3.使用nullif()函数查询:
select nullif(1,1),nullif(1,2);
4.使用case...when...then...else...end...()函数查询:
select emp_name,emp_sal,emp_deptno,case emp_sal>=3000 when true then 'high' else 'low' end sal_level from emp where deptno = 20;
2.多行函数:
1.count()函数的使用:
select count(*) from emp;
select count(emp_comm),count(emp_id) from emp;
2.sum()和avg()函数的使用:
select sum(emp_sal) sum_sal,avg(emp_sal) avg_sal from emp;#求和、计算平均值
3.max()和min()函数的使用:
select max(emp_sal),min(emp_sal) from emp;
6.分组查询:
1.简单的group by 查询:
select * from emp group by emp_deptno;
select * from emp group by emp_job,emp_deptno;
2.group by与统计函数:
select emp_deptno,count(*),max(emp_sal),min(emp_sal),sum(emp_sal),avg(emp_sal) from emp group by emp_deptno;
3.group by与group_concat()的分组查询:
select emp_deptno,count(*),group_concat(emp_name) from emp group by deptno;
4.group by与having:
select emp_deptno,count(*),max(emp_sal),min(emp_sal),sum(emp_sal),avg(emp_sal) from emp group by emp_deptno having avg(emp_sal)>=2000;
MySQL中各子句的执行过程由先到后依次为:from->where->group by->having->select->order by。