《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;
  1. 查询学号为3,   或者姓名是张三的 记录  SQL 语句中 or 不会短路
SELECT * FROM student WHERE sid = 103 or sname = '小达达';
  1. 查询学号为        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);
  1. 查询年龄为        null 的记录    
错误写法
select  * FROM student WHERE age = Null;

正确写法
select  * FROM student WHERE age IS NULL;   --null 记录


不为空的写法
select  * FROM student WHERE age IS NOT NULL;
  1. 查询年龄在        18 到 20 之间的记录
方法一
SELECT * FROM student WHERE age > 17 AND age <= 18;


方法二   (包含 界限前后)
SELECT * FROM student WHERE age BETWEEN 17 AND 18;
  1. 查询性别为 非男 的学生记录、
写法一
SELECT * FROM student WHERE sex != '男';
写法二
SELECT * FROM student WHERE sex <> '男';   <> 也是 非的一种写法

报错写法
SELECT * FROM student WHERE sex IS NOT '男';-- 报错
  1. 查询姓名不为null 的学生记录
错误写发   
SELECT * FROM student WHERE sccore != null;  

SELECT * FROM student WHERE sccore IS NOT NULL;

mysql结果集拼接逗号 mysql 结果集_字段

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

mysql结果集拼接逗号 mysql 结果集_mysql结果集拼接逗号_02

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

第二个箭头才  是 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;
  1. 查询奖金(COMM) 高于 工资 (SAL)的员工    // 表与表的字段 可以相互比较
SELECT * FROM emp WHERE COMM > SAL;
  1. 查询奖金高于工资的 20% 的员工信息     // 字段可以计算
SELECT * FROM emp WHERE COMM > SAL*0.3;
  1. 查询10号部门 中 工种为 MANAGER 和 20 号 部门 中 工种为 CLERK 的 员工信息   //(满足两种条件)
SELECT * FROM emp WHERE 
    (work_type ='MANAGER' AND edeptno = 10)
OR 
    (work_type ='CLERK' AND edeptno = 20);
  1. 查询所有工种不是 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
  1. 查询有奖金的员工 的不同工种        //去重    distinct
SELECT   DISTINCT work_type FROM emp WHERE COMM > 0
  1. 查询没有奖金或 奖金低于 100 的员工信息                   //当字段 为 Null  时, 大于小于 都不起作用
SELECT * FROM emp WHERE  
    COMM IS NULL 
or 
    COMM < 100
	

--查不到 为 Null 的数据	
SELECT * FROM emp WHERE
COMM < 100
  1. 查询员工年龄大于或者等于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 只能放在字段前面,

DISTINCT edeptno

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

DISTINCT edeptno, ename

2. 字段计算

COMM > SAL*0.3;    字段 和字段 比较

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结果集拼接逗号 mysql 结果集_结果集_03

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

mysql结果集拼接逗号 mysql 结果集_数据_04

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;