Mysql 数据库 第六节 《DQL 结果集获取》

                                                        《DQL 结果集获取》

 是使用最多的 数据库语言:

DQL    (query)           数据查询语句      用来查询数据                                             指令有 SELECT  (70% 的数据库操作)

 

1. 结果集  (存放在内存中) 是查询的结果。 是虚拟的表,查询一次 产生一次

使用 查询语句 护着 筛选执行 后返回的 虚拟数据表
DQL  的使用 不会改变 原有的数据结果 和数据表, 仅仅 只是返回查询结果

2. 查询语句基础

SELECT * FROM 表名;     ----   *  指的是 返回所有列

 

3. 返回指定查询

SELECT 列1, 列2,列3  FROM 表名;     ---- > 返回指定的列, 列名 比逗号 分隔开来

4. 条件查询(返回符合条件的结果集)

  • = , <,    <=,     !=,  或者  <>,   >,  >=
  • between .... and,  在 某个范围内,   in(set)在某个范围内,   not in 不在某个 范围内
  • is  nulll(为空)  is bot null(不为空)
  • and(与),  or (或),  not(非)

SELECT sccore,sname , age FROM student;

ALTER TABLE student ADD COLUMN age INT  COMMENT '年龄';




--WHERE 是指定条件查询, 
--WHERE 左边是对标的操作  
--WHERE 右边是指定条件 并返回结果

SELECT * FROM student WHERE 1 = 1; 全表


SELECT * FROM student WHERE 0 = 0;

 


 

 

DQL 基本 的使用 :

  1. 查询性别为女, 并且年龄为18 的学生记录
    SELECT * FROM student WHERE sex = '女' AND age = 18;

     

  2. 查询学号为3,   或者姓名是张三的 记录  SQL 语句中 or 不会短路
    SELECT * FROM student WHERE sid = 103 or sname = '小达达';
    
    

     

  3. 查询学号为        1,2,3 的记录
    写法一
    SELECT * FROM student WHERE sid = 101 or sid = 102 or sid = 103;
    
    写法二
    SELECT * FROM student WHERE sid in (101,102,103,104,105);

     

  4. 查询年龄为        null 的记录    
    错误写法
    select  * FROM student WHERE age = Null;
    
    正确写法
    select  * FROM student WHERE age IS NULL;   --null 记录
    
    
    不为空的写法
    select  * FROM student WHERE age IS NOT NULL;
  5. 查询年龄在        18 到 20 之间的记录
    方法一
    SELECT * FROM student WHERE age > 17 AND age <= 18;
    
    
    方法二   (包含 界限前后)
    SELECT * FROM student WHERE age BETWEEN 17 AND 18;
    
    

     

  6. 查询性别为 非男 的学生记录、
    写法一
    SELECT * FROM student WHERE sex != '男';
    写法二
    SELECT * FROM student WHERE sex <> '男';   <> 也是 非的一种写法
    
    报错写法
    SELECT * FROM student WHERE sex IS NOT '男';-- 报错

     

  7. 查询姓名不为null 的学生记录
    错误写发   
    SELECT * FROM student WHERE sccore != null;  
    
    SELECT * FROM student WHERE sccore IS NOT NULL;

    Mysql 数据库 第六节 《DQL 结果集获取》_第1张图片

查询语句中:  (Null)  不可以 用  =     != 来查询, 要用  IS  NULL ;  IS  NOT NULL; 来判断

第一个箭头     是  空字符   '',   用  = ,!= , < >

第二个箭头才  是 Null,          要用  IS  NULL ;  IS  NOT NULL;

 

ALTER TABLE student ADD COLUMN age int COMMENT '年龄';
ALTER TABLE student ADD COLUMN sex CHAR(2) COMMENT '性别';


ALTER TABLE student DROP COLUMN age, DROP COLUMN sex;


ALTER TABLE student 
ADD COLUMN age int COMMENT '年龄', 
ADD COLUMN sex CHAR(2) COMMENT '性别';





SELECT * FROM student WHERE sid = 103 or sname = '小达达';


SELECT * FROM student WHERE sid = 101 or sid = 102 or sid = 103;


SELECT * FROM student WHERE sid in (101,102,103,104,105);

select  * FROM student WHERE age = Null;

select  * FROM student WHERE age IS NULL;

select  * FROM student WHERE age IS NOT NULL;



SELECT * FROM student WHERE age > 17 AND age <= 18;


SELECT * FROM student WHERE age BETWEEN 17 AND 18;


SELECT * FROM student WHERE sex IS NOT '男';-- 报错

SELECT * FROM student WHERE sex != '男';
SELECT * FROM student WHERE sex <> '男';


SELECT * FROM student WHERE sccore != null;  
SELECT * FROM student WHERE sccore IS NOT NULL;

 

 

 

..........练习题1:

     建表:

CREATE TABLE emp(
	eid INT(11) NOT NULL COMMENT '员工编号',
	ename VARCHAR(30) COMMENT '员工姓名',
  edeptno INT(3) COMMENT '所属部门编号'
)

ALTER TABLE  emp 
	ADD COLUMN COMM INT(8) DEFAULT 0  COMMENT '奖金',
	ADD COLUMN SAL INT(8) DEFAULT 0 COMMENT '工资';
	
	
ALTER TABLE  emp 
	MODIFY COLUMN COMM DECIMAL(8,2) DEFAULT 0  COMMENT '奖金',
	MODIFY COLUMN SAL DECIMAL(8,2) DEFAULT 0 COMMENT '工资';

 

 

  1. 查询20号部门的所有员工信息
    SELECT * FROM emp WHERE edeptno = 20;

     

  2. 查询奖金(COMM) 高于 工资 (SAL)的员工    // 表与表的字段 可以相互比较
    SELECT * FROM emp WHERE COMM > SAL;

     

  3. 查询奖金高于工资的 20% 的员工信息     // 字段可以计算
    SELECT * FROM emp WHERE COMM > SAL*0.3;

     

  4. 查询10号部门 中 工种为 MANAGER 和 20 号 部门 中 工种为 CLERK 的 员工信息   //(满足两种条件)
    SELECT * FROM emp WHERE 
        (work_type ='MANAGER' AND edeptno = 10)
    OR 
        (work_type ='CLERK' AND edeptno = 20);

     

  5. 查询所有工种不是 MANAGER  和 CLERK, 并且工资大于或等于 2000的员工 详细信息
    写法一
    
    SELECT * FROM emp WHERE
        (work_type != 'MANAGER' AND work_type != 'CLERK')
    AND SAL >= 2000
    
    
    写法二
    SELECT * FROM emp WHERE
        work_type NOT IN('MANAGER','CLERK')
    AND SAL >= 2000

     

  6. 查询有奖金的员工 的不同工种        //去重    distinct
    SELECT   DISTINCT work_type FROM emp WHERE COMM > 0 
  7. 查询没有奖金或 奖金低于 100 的员工信息                   //当字段 为 Null  时, 大于小于 都不起作用
    SELECT * FROM emp WHERE  
        COMM IS NULL 
    or 
        COMM < 100
    	
    
    --查不到 为 Null 的数据	
    SELECT * FROM emp WHERE
    COMM < 100

     

  8. 查询员工年龄大于或者等于10年的员工信息
    SELECT * FROM emp WHERE work_age >= 10;
    SELECT * FROM emp WHERE COMM > SAL;
    
    SELECT * FROM emp WHERE COMM > SAL*0.3;
    
    
    ALTER TABLE emp  ADD COLUMN work_type VARCHAR(30) COMMENT '工种';
    
    
    SELECT * FROM emp WHERE 
    	(work_type ='MANAGER' AND edeptno = 10)
    OR 
    	(work_type ='CLERK' AND edeptno = 20);
    	
    	
    SELECT * FROM emp WHERE
    (work_type != 'MANAGER' AND work_type != 'CLERK')
    AND SAL >= 2000
    
    SELECT * FROM emp 
    WHERE	work_type NOT IN('MANAGER','CLERK')
    AND SAL >= 2000
    
    
    SELECT   DISTINCT work_type FROM emp 
    WHERE COMM > 0 
    
    
    
    SELECT * FROM emp WHERE
    	COMM IS NULL 
    or 
    	COMM < 100
    	
    	
    SELECT * FROM emp WHERE
    COMM < 100
    
    
    ALTER TABLE emp ADD COLUMN  work_age int(2);
    
    ALTER TABLE emp MODIFY COLUMN  work_age int(2) COMMENT '工龄';
    
    
    SELECT * FROM emp WHERE
    work_age >= 10;

     

 


 

 

 

 

>......模糊 查询:

1.   like 关键字

      模糊匹配信息, 后面跟上匹配串

2.   通配符   

      _ 下划线,  任意   1      个字符

      %                任意   0 - n 个字符串

3.   模糊查找练习    SELECT * FROM emp WHERE ename LIKE  '%s%';    包含某一个 字符  用的最多

-- 根据 ename  字段 匹配数据
--
-- _ 下划线    匹配任意 一个字符

-- %          匹配 1-n   个字符串



查询姓名由     5个字母构成员工记录
SELECT * FROM emp WHERE ename LIKE  '_____';   //五个 下划线

查询姓名由     5个字母构成, 并且 第五个字母为 't'   的员工记录
SELECT * FROM emp WHERE ename LIKE  '____t';   //第五个 下火线 改为t

查询姓名以     'm' 开头的员工记录
SELECT * FROM emp WHERE ename LIKE  'm%';

查询姓名中     第二个字母为 'u' 的员工记录
SELECT * FROM emp WHERE ename LIKE  '_u%';    第二个字母为 'u'
SELECT * FROM emp WHERE ename LIKE  '%u';     以 'u'结尾

查询姓名中包含 's' 的字母的员工记录
SELECT * FROM emp WHERE ename LIKE  '%s%';    包含某一个 字符  用的最多

 

 

>......字段控制:

1. 字段去重 采用 distinct;   distinct 只能放在字段前面,

    SELECT DISTINCT edeptno FROM emp WHERE  COMM > 20;

    distinct  如果 作用两个字段, 那么这两个字段看作一个整理 去重

           SELECT DISTINCT edeptno, ename  FROM emp WHERE  COMM > 20;

2. 字段计算

           SELECT * FROM emp WHERE COMM > SAL*0.3;               字段 和字段 比较

           SELECT COMM +SAL  emp WHERE COMM > SAL*0.3;      查询字段 的和

 

3. ifnull 函数使用   ........表达式 :  IFNULL(expr1,expr2)      

    SELECT IFNULL(COMM + SAL, 0),ename FROM emp;      

    // 如果 COMM 字段 和 SAL 字段有任意一个是 NUll ,那么 表 达式为 0

   Mysql 数据库 第六节 《DQL 结果集获取》_第2张图片

4. 字段别名   查询完毕后 给字段 取新的名字  用于  
            SELECT IFNULL(COMM + SAL, 0) as total,ename FROM emp;

Mysql 数据库 第六节 《DQL 结果集获取》_第3张图片

5. 计算字段

6. 普通字段

 


 

 

>......字段排序:   查询结果集

1. 排序关键字  order by

   SELECT * FROM emp   ORDER BY SAL;

2. 升序(ASC) 默认排序,   降序(DESC)

    SELECT * FROM emp   ORDER BY SAL  DESC;

    SELECT * FROM emp   ORDER BY SAL  ASC;

3. 组合排序.  当排序的 数值一致的时候,需要用到组合排序   根据多个字段排序

           SELECT * FROM emp   ORDER BY SAL  DESC,COMM;


           SELECT * FROM emp   ORDER BY SAL,COMM DESC; 按升序排SAL, 当 SAL相同 按降序排 COMM

 

 

 

 


练习题:

1.  查询姓名 由 5个字母构成 并且薪资小于 3000 的员工记录

     SELECT * FROM emp WHERE ename like '_____'  AND  SAL < 3000;

2.  查询 姓名以  'm' 开头的员工姓名 与 工资,按 工资倒叙显示

     SELECT ename ,SAL  FROM emp WHERE  ename LIKE 'm%' ORDER BY SAL  DESC;

3.  查询姓名 中 包含 'm' 字母的 员工姓名 和 工资 + 薪资 以别名显示, 为空则显示 0

     SELECT ename , IFNULL(SAL+ COMM ,0) as total FROM emp  WHERE  ename LIKE '%m%';

4 . 查询有奖金的员工的不同工种(只显示一种)

     SELECT  DISTINCT work_type  FROM emp WHERE  COMM IS NOT NULL;

5.  查询所有员工工资和奖金的 和, 为空则显示  0

6   查询员工表  要求以薪资 升序, 奖金降序显示

    SELECT * FROM emp  ORDER BY  SAL, COMM DESC;

 

 

 

 

-- 根据 ename  字段 匹配数据
--
-- _ 下划线    匹配任意 一个字符

-- %           匹配 1-n   个字符串

SELECT * FROM emp WHERE ename LIKE  '____t'; 


SELECT * FROM emp WHERE ename LIKE  'm%';


SELECT * FROM emp WHERE ename LIKE  '%u';

SELECT * FROM emp WHERE ename LIKE  '_u%';


SELECT * FROM emp WHERE ename LIKE  '%u%';



SELECT DISTINCT edeptno, ename  FROM emp WHERE  COMM > 20;


SELECT IFNULL(COMM + SAL, 0),ename FROM emp; 



SELECT * FROM emp   ORDER BY SAL,COMM DESC;


SELECT * FROM emp WHERE ename like '_____'  AND  SAL < 3000;


SELECT ename , IFNULL(SAL+ COMM ,0) as total FROM emp  WHERE  ename LIKE '%m%';


SELECT  DISTINCT work_type  FROM emp WHERE  COMM IS NOT NULL;


SELECT * FROM emp  ORDER BY  SAL, COMM DESC;

 

你可能感兴趣的:(数据库,Mysql)