本篇目的是为了对数据库操作不熟悉的同学,在较短时间内掌握数据库的基本操作,增删改查等操作,适合对数据库有一定了解的同学
有关数据库概述,数据库管理系统的基本概念介绍就不重复了,我们只需要知道 SQL是关系数据库语言的国际标准,所以只要学会了 SQL 的操作,其他任何数据库如 MySql Oracle 等都可以进行快速上手,我们本篇采用MySQL 数据库进行演示
select selection_list / 要查询的列名
from table_list / 要查询的表名
where condition / 要查询的条件
group by grouping_colunmns / 对查询的条件进行分组
having condition / 分组后的行条件
order by sorting_colunmns / 对结果进行排序
limit offset_start,row_count / 对结果进行限定
学生表:stu
字段 | 类型 | 说明 |
---|---|---|
sid | char(6) | 学生学号 |
sname | varchar(50) | 学生姓名 |
age | int | 学生年龄 |
gender | varchar(50) | 学生性别 |
.sql
CREATE TABLE stu(sid char(6), sanme varchar(50),age int,gender varchar(50));
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
雇员表:emp
字段 | 类型 | 说明 |
---|---|---|
empno | int | 员工编号 |
ename | varchar(50) | 员工姓名 |
job | varchar(50) | 员工工作 |
mgr | int | 领导编号 |
hiredate | date | 入职日期 |
sal | decimal(7,2) | 月薪 |
comm | decimal(7,2) | 奖金 |
deptno | int | 部门编号 |
.sql
create table emp(empno int,ename varchar(50),job varchar(50),mgr int,hiredate date,sal decimal(7,2),,comm decimal(7,2),deptno int);
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
部门表:dept
字段 | 类型 | 说明 |
---|---|---|
deptno | int | 部门编号 |
dname | varchar(50) | 部门名称 |
loc | varchar(50) | 部门地址 |
.sql
create tabal dept(deptno int,dname varchar(50),loc varchar(50));
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
根据上面3张表,我们对这3张表进行如下操作
select * from stu
select sid,sname,age from stu
select * from stu where gender = 'female' and age < 50;
select * from stu where sid = 'S_1001' or sname = 'liSi'
`select * from stu where sid in('S_1001','S_1002','S_1003');
select * from stu where sid NOT IN('S_1001','S_1002','S_1003');
SELECT * FROM stu WHERE age IS NULL;
select * from stu where age between 20 and 40
select * from stu where age >=20 and age <=40
select * from stu where gender !='male'
select * from stu where gender <> 'male'
select * from stu where not gender ='male'
select * from stu where sname is not NULL
select * from stu where not sname is NULL
如果我们要查询的字段中只包含某个字段,我们使用 模糊查询,使用关键字 LIKE ,
查询姓名由 5 个字母构成的 学生记录:select * from stu where sname like '_____'
select * from stu where sname like '____i'
;select * from stu where sname like 'z%'
select * from stu where sname like '%a%'
重复记录,我们查询的结果集中可能有重复的数据,这时候使用 distinct 关键字来处理:select distinct sal from emp
字段为空,查看 emp 表中的 月薪和 奖金之和,因为 sal 和 comm 都是数值类型,可以直接进行 加运算,反之,会出错
select * ,sal+comm from emp
select *,sal+ IFNULL(comm,0) from emp
当我们要给查询出的列进行排序时,可以使用 关键字 ORDER BY, ASC(升序,默认),DESC(降序)
select * from stu order by sage ASC
select * from stu order by sage
select * from stu order by sage DESC
select * from emp order by sal desc,empno asc
sum,avg,max,min,count,聚合函数是用来做纵向运算的函数
count: 纵向统计
select count(comm) from emp
select count(*) from emp where sal >2500
select count(*) from emp where (sal+IFNULL(comm,0))>2500
select count(comm),count(mgr) from emp
sum 和 avg : 求和 与求 平均值
select sum(sal) from emp
select sum(sal),sum(comm) from emp
select sum(sal+IFNULL(comm,0)) from emp
select avg(sal) from emp
max 与 min
select max(sal),min(sal) from emp
当需要分组查询时需要使用 group by 字句,凡是和 聚合函数同时出现的列名,要写在 group by 之后
分组查询
select deptno,SUM(sal) from emp group by deptno
select deptno,count(*) from emp group by deptno
select deptno,count(*) from emp where sal >1500 group by deptno
having 子句
select deptno,sum(sal) from emp group by deptno having sum(sal)>9000
[having 和 where 的区别:having 是在分组之后对数据进行过滤,having 后面可以使用分组函数;where 是在分组之前对数据进行过滤,where 后面不可以使用分组函数;where 是对分组前记录的条件,如果记录不满足 where 的条件,那么该数据就不会参与分组,而 having 是对分组之后的数据进行 约束]
用来限定 查询结果 的起始,以及总行数,适合 分页查询
select * from emp limit 0,5
select * from emp limit 3,10
查询语句 书写顺序 :select – from – where – group by – having – order by – limit
查询语句 执行顺序 :from – where – groub by – having – order by – limit
数据库操作中多表查询时很主要的,一定要熟练使用
多表查询有如下几种
就是把 2 个select 语句的查询 结果合并到一起
* UNINO :去除重复查询,例如 :select * from t1 unino select * from t2
* UNINO ALL :不去除重复记录,例如:select * from t1 union all select * from t2
* 要求:被合并的 2 个结果,列数,列类型 都必须相同
连接查询就是求出多个表的 乘积 ,例如 t1 连接 t2 ,查询出的 结果 就是 t1*t2,连接查询 我们要 明白 笛卡尔积,有关笛卡尔积 的 概念就不在这里介绍了,大家可以 自己 网上查询
内连接
外连接:查询出的结果存在不满足条件的可能
左外连接 是先查询左表,然后去查询右表,右表中满足条件的显示出来,不满足条件的就显示 NULL
右外连接 是先查询 由表,然后去查询 左表,左表中满足条件显示,不满足 显示 NULL
连接 不一定是 2 张表,还可能是多张表,田村连接查询我们不需要 整个 笛卡尔积,而只是需要其中的一部分,那么这时就需要使用条件去除不需要的记录,这个条件 一般是使用 主外键 关系确定
自然连接:查询会产生无用的笛卡尔积,使用自然连接无需 给出主外键关系,自然连接会自动找到 该关系
一个 select 语句中包含另一个 完整的 select 语句,子查询就是嵌套 查询,select 中包含 select ,如果一条语句中存在 2个 或多个 select ,那么就是子查询语句
子查询出现的位置:
子查询的结果集形式: