/********************************部门表dept********************************/ /*创建表*/ DROP TABLE IF EXISTS DEPT; CREATE TABLE DEPT( DEPTNO INT PRIMARY KEY, DNAME VARCHAR(14) , LOC VARCHAR(13) ); /*插入数据*/ INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK'), (20,'RESEARCH','DALLAS'), (30,'SALES','CHICAGO'), (40,'OPERATIONS','BOSTON'); /*查询数据*/ SELECT * FROM DEPT; /********************************员工表emp********************************/ /*创建表*/ DROP TABLE IF EXISTS EMP; CREATE TABLE EMP( EMPNO INT PRIMARY KEY, ENAME VARCHAR(14) , JOB VARCHAR(9), MGR INT, HIREDATE DATE, SAL DECIMAL(7,2), COMM DECIMAL(7,2), DEPTNO int REFERENCES DEPT ); /*插入数据*/ INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20), (7499,'ALLEN','SALESMAN',7698,'1981-2-20',1600,300,30), (7521,'WARD','SALESMAN',7698,'1981-2-22',1250,500,30), (7566,'JONES','MANAGER',7839,'1981-4-2',2975,NULL,20), (7654,'MARTIN','SALESMAN',7698,'1981-9-28',1250,1400,30), (7698,'BLAKE','MANAGER',7839,'1981-5-1',2850,NULL,30), (7782,'CLARK','MANAGER',7839,'1981-6-9',2450,NULL,10), (7788,'SCOTT','ANALYST',7566,'1987-7-13',3000,NULL,20), (7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10), (7844,'TURNER','SALESMAN',7698,'1981-9-8',1500,0,30), (7876,'ADAMS','CLERK',7788,'1987-7-13',1100,NULL,20), (7900,'JAMES','CLERK',7698,'1981-12-3',950,NULL,30), (7902,'FORD','ANALYST',7566,'1981-12-3',3000,NULL,20), (7934,'MILLER','CLERK',7782,'1982-1-23',1300,NULL,10); /*查询数据*/ SELECT * FROM EMP;
以上会创建需求的两个表可以供以完成以下查询操作
/*比较查询*/ SELECT * FROM EMP WHERE sal>2000; /*逻辑查询 and or not */ SELECT * FROM EMP WHERE sal>2000 AND deptno=10; /*模糊查询 LIKE % _ */ SELECT *FROM EMP WHERE ename LIKE '%r%'; /*范围查询*/ SELECT * FROM EMP WHERE SAL BETWEEN 1000 AND 3000; SELECT * FROM EMP WHERE DEPTNO IN (10,20); /*空判断*/ SELECT * FROM EMP WHERE comm is not null; SELECT empno 员工,sal+IFNULL(COMM,0) 月薪 FROM EMP; /*去重查询*/ SELECT DISTINCT job FROM EMP; /*聚合*/ SELECT COUNT(*) FROM EMP;/*一列的行数*/ SELECT COUNT(comm) FROM EMP;/*一列的非空行总数行数*/ SELECT max(sal) 最高工资 , min(comm) 最低工资 , sum(sal) 总和 ,avg(sal) 平均工资 FROM EMP; /*分组*/ SELECT deptno,sal,avg(sal) FROM EMP WHERE sal>1000 GROUP BY deptno,sal HAVING sal>2000 SELECT deptno,job,avg(sal) FROM EMP WHERE sal>1000 GROUP BY deptno,job HAVING avg(sal)>2000 /*WHERE 是对原始数据进行筛选,having是对 group by 以后的数据进行的筛选*/ order by deptno,job limit 1,2 SELECT deptno,job,avg(sal) FROM EMP GROUP BY deptno,job
在进行数据表信息查询时,不是只有简单的查询所有,更多的时候,我们需要的只有部分信息,所以掌握条件查询的技巧很重要
==比较==查询 利用的是算术运算符,< > = != 等符号对信息进行检索
==逻辑==查询 利用的是且或非的逻辑思想,即 and or not
==去重==查询 使用distinct关键字修饰列名,可以将所处列中的重复属性去掉
==模糊==查询 使用 like 关键字 % 和 _ 作为占位符 % 代表多个单字符,_ 代表一个单字符 将类似于 like 关键字形容的字符串对应的行信息显示,不区分大小写
==范围==查询 使用的是 between……and……关键字组合 或者 将范围内的元素用 in 封装起来,在in范围内查询
==空判断==查询 所查信息中某一属性列有空值,可以使用这个进行判断性的查询,非空或空 ifnull(a,b): a若为空 取值b 不为空则取值a
==聚合== 这是一个概念性的东西,包括几个计算方法:count(*),max(),min(),sum(),avg() 括号中的参数均是列名
==分组==
select 查询目标(列名,聚合) from 表名 where 条件 group by 被查列名 having 条件 order by 列名。。。 desc|asc (排序,默认asc升序) #排序 limit a,b(a是开始下标,b是每页显示的条数) #分页
数据对应==关系== 一般分为三类,一对一,一对多,多对多
==一对一== 一对一意思就是两个表中的信息,一条数据对应一条数据,不可对应多个,类似于一夫一妻,谁都不能多一个
drop table if exists husband; drop table if exists wife; create table wife( id int auto_increment primary key, name varchar(100) ); create table husband( id int auto_increment primary key, name varchar(100), wid int unique, foreign key(wid) references wife(id) );
代码实现时 任取其中一个表作为主键表,另外一个就是外键表并且外键表外键必须设置为唯一不可重复即可实现 一对一 对应关系
==一对多== 即两个表中的其中一个表的属性是另一个表数据的共有的,这样就可以一个属性对应多个数据,例如一个教室和若干学生,一个老师和他教的一班学生
create table dept( id int auto_increment primary key, name varchar(100) ); create table emp( id int auto_increment primary key, name varchar(100), did int, foreign key(did) references dept(id) on delete cascade # casecade 表示级联,如果主表的数据删除,相关联的其他表的信息也会删除 );
代码实现时,与一对一不同的是主键表与外键表有规定,主键表一般是==一==对应的属性表,==多==的一方作为外键表,这里外键不必设置唯一,甚至可以为空
==多对多== 多对多意思是两个表的属性可以互相影响,没有特定的要求某属性是某数据的专属
create table student( id int auto_increment primary key, name varchar(100) ); create table subject( id int auto_increment primary key, name varchar(100) ); create table student_subject( id int auto_increment primary key, stuid int, subid int, foreign key(stuid) references student(id), foreign key(subid) references subject(id) );
代码实现时,由上面所示,两个表拥有各自的属性,没有必要的联系,我们需要另外一表通过外键将两个表联系起来
==内连接== 简单来说就是对笛卡儿积的一种限制,使原本混乱的数据表变得有意义
select * from DEPT,EMP where DEPT.DEPTNO = EMP.DEPTNO; select EMP.EMPNO,EMP.ENAME,DEPT.DNAME from DEPT inner join EMP on DEPT.DEPTNO = EMP.DEPTNO;
两种实现方式:
==正常查询两个表使用where进行限制==
==from 表名 inner join 表名 on 限制条件==
==外连接== 是指两个表的属性信息一对多的关系,可以从任意一张表出发,视情况而定
select t2.EMPNO,t2.ENAME,t1.DEPTNO,t1.DNAME from DEPT t1 left join EMP t2 on t1.DEPTNO = t2.DEPTNO;
上述代码是一种比较简单的实现,在应用中,可能会出现多次查询,不一定是从t1-t2,也有可能是t2-t1.
==子查询== 子查询出现的原因是很多时候我们对数据表进行查询时,一次查询查询不到我们需要的信息,需要完成多次查询才可以得到结果,子查询就是就每一次查询到的结果存成一个表,供以下次查询使用
1)查询emp中最高薪水人的名字 1、求最高薪水 SELECT MAX(SAL) FROM EMP ; 2、把 1 作为条件 查询对应的名字 SELECT ename FROM EMP WHERE SAL = (SELECT MAX(SAL) FROM EMP );