基础查询
- 基础查询语法
*:表示查询所有列
select *(字段名)
from 表名
where 条件
SELECT * FROM student;
SELECT age,email FROM student;
-
准备数据
-
条件查询
SELECT age,email FROM student WHERE stu=1001;
SELECT * FROM student WHERE sex='女';
and:表示连接多个条件,表示并且关系
SELECT *FROM student WHERE sex='女' AND age<15;
or:表示连接多个条件,表示或者的关系
SELECT * FROM student WHERE sex='女' OR age>15;
in(…,…,…):包含
SELECT snae FROM student WHERE stu IN('1001','1003');
not in():不包含
SELECT * FROM student WHERE stu NOT IN('1001','1002');
sql 中null 的写法:
是空的:is null
不是空的: is not null
SELECT * FROM student WHERE age IS NULL;
SELECT * FROM student WHERE age IS NOT NULL;
between…and:表示范围内记录,闭区间。xxx>=a and xxx<=b
SELECT * FROM student WHERE age BETWEEN 10 AND 15;
<>:不等于
!=
not
SELECT * FROM student WHERE sex <>'男';
SELECT * FROM student WHERE sex !='男';
SELECT * FROM student WHERE NOT sex ='男';
模糊查询:
关键字 like 一般和通配符一起使用
语法:like '查询内容'
通配符:
%:表示匹配多个字符
_:表示匹配单个字符
[1-9][123][a-z]:表示匹配范围内的一个字符
[^1-9]:表示匹配不在范围内的一个字符
SELECT * FROM student WHERE snae LIKE '____';#姓名是4个字符的,,四个_
SELECT * FROM student WHERE snae LIKE '___e';#姓名是4个字符,最后一个是e
SELECT *FROM student WHERE snae LIKE 'R%';#姓名以R开头的
SELECT *FROM student WHERE snae LIKE '_o%';#姓名第二个字母是o的
SELECT *FROM student WHERE snae LIKE '%o%';#姓名包含o的
- 字段控制查询
使用的三张表
create table DEPT
(
DEPTNO int(2) not null,
DNAME varchar(14),
LOC varchar(13)
);
alter table DEPT add constraint PK_DEPT primary key (DEPTNO);
create table EMP
(
EMPNO int(4) not null,
ENAME varchar(10),
JOB varchar(9),
MGR int(4),
HIREDATE date,
SAL int(7 ),
COMM int(7 ),
DEPTNO int(2)
);
alter table EMP add constraint PK_EMP primary key (EMPNO);
alter table EMP add constraint FK_DEPTNO foreign key (DEPTNO) references DEPT (DEPTNO);
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 EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values (7369, 'SMITH', 'CLERK', 7902, str_to_date('17-12-1980', '%d-%m-%Y'), 800,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, 300, 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, 500, 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, 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, 1400, 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, 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, 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,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,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, 0, 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,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,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,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,null, 10);
create table salgrade (
grade numeric primary key,
losal numeric,
hisal numeric
);
insert into salgrade values (1, 700, 1200);
insert into salgrade values (2, 1201, 1400);
insert into salgrade values (3, 1401, 2000);
insert into salgrade values (4, 2001, 3000);
insert into salgrade values (5, 3001, 9999);
distinct 字段 :去除字段的重复记录
语法:select distinct 字段名 from 表名;
去除重复记录:查看员工的工资信息
select distinct sal from emp;
字段可以使用+号连接起来,+号进行字段的运算
IFNULL(字段,0):函数表示:如果字段是空的,用0代替
查看雇员的月薪与佣金之后
select ename ,sal+IFNULL(comm,0) from emp ;
给列名添加别名
select ename ,sal+IFNULL(comm,0) as tolsal from emp ;
也可以将as 省略 用空格代替
给表取别名,用别名.字段名的方式来调用字段
可以先在表名后面 自定义一个名称,用这个名称可以直接.出字段名
select e.`COMM`,e.`DEPTNO` from emp e;
用表名,字段也可以调用字段
select emp.`COMM`,emp.`DEPTNO` from emp ;
拼接字段
concat()函数;连接字段,形成字符串
语法:concat(字段1,字段2 ,...);
通过拼接字段,通过1列显示xxx的工资是:XXX美元
select CONCAT(ename,'的工资是:',sal+IFNULL(comm,0),'美元') as '总结'from emp;
聚合函数
聚合函数:用来进行统计,计算
count(*)/count(1):统计有多少条记录
count(1):查询速度快写
count(字段):统计某个字段不为空的记录
查询一共有多少员工
select COUNT(*) from emp;
查询奖金不为空的情况
select COUNT(1) from emp where comm is not null;
select COUNT(comm) from emp ;
查询月薪大于2500的人数
select COUNT(1) from emp where sal>2500 ;
查询月薪与奖金大于2500的人数
select COUNT(1) from emp where sal+IFNULL(comm,0)>2500 ;
查询有奖金的人数,以及由领导的人数
select COUNT(mgr)as '有领导人数' , COUNT(comm)as '有奖金人数' from emp;
sum(字段):统计某个字段的总和
avg(字段):统计某个字段的平均值
查询所有雇员月薪和
select SUM(sal) from emp;
查询所有雇员月薪和,奖金和
select SUM(sal),SUM(IFNULL(comm,0)) from emp;
查询所有雇员月薪+奖金和
select SUM(sal+IFNULL(comm,0)) from emp;
查询所有员工的平均工资
select AVG(sal+IFNULL(comm,0)) from emp;
max(字段):最大值
min(字段):最小值
查询最高工资和最低工资
select MAX(sal+IFNULL(comm,0)),MIN(sal+IFNULL(comm,0)) from emp;
分组查询
分组查询:进行数据的统计和计算,一般结合聚合函数一起使用
关键字:group by 需要分组的字段
查询每个部门的部门编号,和每个部门的工资和
select deptno,SUM(sal+IFNULL(comm,0)) from emp group by deptno;
查询每个部门的部门编号,和每个部门的人数
select deptno,COUNT(1) from emp group by deptno;
查询每个部分的部门编号以及每个部门工资大于1500的人数
select deptno,COUNT(1) from emp where sal+IFNULL(comm,0)>1500 group by deptno;
如果要对聚合函数进行分组,需要使用having ,而且要写在group by 后面
查询工资总和大于9000的部门以及工资和
select deptno 部门编码,SUM(sal+IFNULL(comm,0)) 工资总和
from emp
group by deptno
having SUM(sal+IFNULL(comm,0))>9000;
having 和where区别
1、where是对普通字段进行过滤
2、having 是对聚合函数过滤
limit查询指定记录
一般用作分页查询
语法limit 起始行-1,行数
从几行开始的 几行数据
查询5行记录,起始行从1开始
select * from emp limit 0,5 ;
查询10行记录,起始行从3开始
select *
from emp
limit 2,10 ;
查询关键字的执行顺序