zoukankan      html  css  js  c++  java
  • mysql的查询

    /********************************部门表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 );
    
  • 相关阅读:
    AtCoder Beginner Contest 167
    AtCoder Beginner Contest 166
    AtCoder Beginner Contest 165
    AtCoder Beginner Contest 164
    AtCoder Beginner Contest 163
    AtCoder Beginner Contest 162
    AtCoder Beginner Contest 161
    AtCoder Beginner Contest 160
    AtCoder Beginner Contest 159
    自定义Mybatis自动生成代码规则
  • 原文地址:https://www.cnblogs.com/Zhao01/p/11994175.html
Copyright © 2011-2022 走看看