zoukankan      html  css  js  c++  java
  • MySQL-2-DQL

    DQL:数据查询语言
    SQLyog中格式化某段语句片段:CTRL+F12

    基础查询

    • 语法:
      select 查询列表 from 表名;
    • 特点:
      ① 查询列表可以是:表中的字段、常量值、表达式、函数
      ② 查询的结果是一个虚拟的表格,并没有存储到内存中

    查询单/多个字段

    # 1.查询单个字段 
    SELECT last_name FROM employees 
    # 2.查询多个字段
    SELECT `first_name`,`last_name` FROM employees 
    # 3.查询所有字段
    SELECT * FROM employees 
    

    查询常量值/表达式/函数

    # 1.查询常量值
    SELECT 100;
    SELECT 'c';
    # 2.查询表达式
    SELECT 100*3;
    # 3.查询函数
    SELECT VERSION();
    

    起别名,去重

    # 起别名
    # ①便于理解
    # ②如果要查询的字段有重名的情况,使用别名可以区分开来
    # as 写法
    SELECT 100*3 AS 结果;
    # 省略as写法,用空格分开
    SELECT 100*3 结果;
    # 当用多个单词如[out put]写法起别名时,会报错,应该用``包裹起来
    SELECT 100*3 AS `out put`
    
    # 去重
    # 查询所有员工涉及的部门编号
    SELECT DISTINCT `department_id`FROM employees
    

    +号和contact

    /*
       java中的+号:
         ①运算符,两个操作数都为数值型
         ②连接符,只要有一个操作数为字符串
       mysql中的+号:仅仅只有一个功能->运算符
    */
    select 100+90;  # 两个操作数都为数值型,则做加法运算(结果 190)
    select'10'+90;  # 只要其中一方为字符型,试图将字符型转*成数值型如果转*成功,则继续做加法运算(结果 100)
    select'john'+90;# 如果转*失败,则将字符型数值转*成0(结果 90)
    select null+10; # 只要其中一方为nul1,则结果肯定为nul1(结果 null)
    
    # contact
    SELECT CONCAT('a','b','c'); #结果:abc
    

    IFNULL

    # IFNULL
    SELECT IFNULL(`commission_pct`,0), `commission_pct` 
    FROM employees
    

    条件查询

    • 语法:
      select 查询列表(①) from 表名(②) where 筛选条件(③);
      执行顺序:②-->③-->①
    • 筛选条件的分类:
      ① 按条件表达式筛选 条件运算符;>,<,=,!=,<>,>=,<=;*等于!= or <>
      ② 按逻辑表达式筛选 逻辑运算符:&&,||,!;and or not(推荐使用)
      ③ 模糊查询 like,between,and,in,is null

    按条件/逻辑表达式筛选

    # 1.查询工资>12000的员工信息
    SELECT * FROM employees WHERE `salary` > 12000
    # 2.查询部门编号*等于90号的员工名和部门编号
    SELECT last_name,department_id
    FROM employees
    WHERE department_id <> 90
    # 3.查询工资z在10000到20000之间的员工名、工资以及奖金
    SELECT last_name,salary,commission_pct
    FROM employees
    WHERE salary > 10000 AND salary < 20000
    # 4.查询部门编号*是在90到110之间,或者工资高于15000的员工信息
    SELECT * FROM employees
    WHERE department_id < 90 OR department_id > 110 OR salary > 15000
    # 或者
    SELECT * FROM employees
    WHERE NOT(department_id >= 90 AND department_id <= 110) OR salary > 15000
    

    模糊查询

    /* 1. like
      一般和通配符搭配使用
        通配符:
          % 任意多个字符,包含0个字符
          _ 任意单个字符
    */
    # 1.查询员工名中包含字的员工信息
    SELECT * FROM employees
    WHERE last_name LIKE '%a%'
    # 2.查询员工名中第三个字符为e,第五个字符为a的员工名和工资
    SELECT last_name, salary FROM employees
    WHERE last_name LIKE '__c_h%'
    # 3.查询员工名中第二个字符为_的员工名
    SELECT last_name FROM employees
    WHERE last_name LIKE '_\_%'
    # 或 (推荐使用)
    SELECT last_name FROM employees
    WHERE last_name LIKE '_$_%' ESCAPE '$'
    
    /* 2. between and
       ①使用between and可以提高语句的简洁度
       ②包含临界值
       ③两个临界值*要调*顺*
    */
    # 查询员工编号在100到120之间的员工信息
    SELECT * FROM employees
    WHERE `department_id` BETWEEN 100 AND 120
    
    /* 3. in
      ①判断某字段的值是否属于in列表中的某一项
      ②in列表的值类型必须一致或兼容
      ③*支持通配符使用
    */
    # 查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
    SELECT last_name,job_id FROM employees
    WHERE job_id IN('IT_PROG','AD_VP','AD_PRES')
    
    /* 4. IS NULL
      ① =或<>*能用于判断null值
      ② is null或is not null可以判断nul1值
    */
    # 查询没有奖金的员工名和奖金率
    SELECT last_name, commission_pct FROM employees
    WHERE commission_pct IS NULL
    

    安全等于 <=>

    # 安全等于 <=>: 既可以判断NUL工值,又可以判断普通的数值
    # 1.查询没有奖金的员工名和奖金率
    SELECT last_name, commission_pct FROM employees
    WHERE commission_pct <=> NULL
    # 2.查询工资为12000的员工信息
    SELECT last_name, salary FROM employees
    WHERE salary <=> 12000
    

    排序查询asc|desc

    • 语法:
    select 查询列表(①) from 表(②)
    【where 筛选条件(③)】
    order by 排序列表【asc|desc】(④)
    
    • 特点:
      asc代表的是升序,desc代表的是降序如果*写,默认是升序
      order by子句中可以支持单个字段、多个字段、表达式、函数、别名
      order by子句一般是放在查询语句的最后面,limit子句除外
      ④ 执行顺序:②--③--①--④
    # 1.查询部门编号>=90的员工信息,按入职时间的先后进行排序
    SELECT * FROM employees
    WHERE `department_id` >= 90
    ORDER BY hiredate DESC
    # 2.按姓名的长度显示员工的姓名和工资【按函数排序】
    SELECT LENGTH(`last_name`) AS 姓名长度,salary
    FROM employees
    ORDER BY 姓名长度 DESC
    # 3.查询员工信息,要求先按工资排序,再按员工编号排序
    SELECT employee_id, salary
    FROM employees
    ORDER BY salary ASC,`employee_id` DESC
    

    常见函数

    • 调用:select 函数名(实参列表)【from表】
    • 函数分类:
      ① 单行函数: 如concat1engthifnull
      ② 分组函数;功能:做统计使用,又称为统计函数、聚合函数、组函数

    字符函数

    # 字符函数
    # 1.length()
    SELECT LENGTH('john');  # 4
    SELECT LENGTH('你好,hello'); # 12
    
    # 2.concat():拼接字符串 ,姓和名的拼接
    SELECT CONCAT(last_name,'_',first_name) FROM employees;
    
    # 3.upper(),lower():大小写转*
    SELECT UPPER('df'); # DF
    SELECT LOWER('DF'); # df
    
    # 4.substr()
    # sql中索引从1开始
    SELECT SUBSTR('hello,world!',7);  #world! 从第7个开始截取,包括第7个
    SELECT SUBSTR('hello,world!',7,2); #wo 从第7个开始截取 2 个字符,包括第7个
    
    # 5.instr():返回字符串第一次出现的索引
    SELECT INSTR('hellolo','lo') AS 'out'; # 4
    
    # 6.trim(): 去掉左右字符,默认是空格字符
    SELECT TRIM('  h  ') AS 'out'; # h
    # 去掉左右b字符
    SELECT TRIM('b' FROM 'bbbbb 你好 bbbbb') AS 'out'; # 你好
    
    # 7.lpad():用指定长度实现 左填充
    SELECT LPAD('hello',10,'*') AS 'out'; # *****hello
    SELECT RPAD('hello',10,'*') AS 'out'; # hello*****
    
    # 8.replace(): 替*
    SELECT REPLACE('hello', 'lo', '88') AS 'out'; # hel88
    

    数学函数

    # 数学函数
    # 1. round():四舍五入
    SELECT ROUND(3.1) AS 'out'; # 3
    SELECT ROUND(-3.6) AS 'out'; # 4 绝对值四舍五入,在添符号
    # 2. ceil():向上取整,返回≥该参数最小值
    SELECT CEIL(3.3); # 4
    SELECT CEIL(-3.3); # -3
    # 3. floor():
    SELECT FLOOR(9.9); # 9
    SELECT FLOOR(-9.9); # -10
    # 4. truncate():截断
    SELECT TRUNCATE(3.3234,2); # 3.32
    # 5. mod(): 取模
    SELECT MOD(5,2); # 1
    SELECT MOD(5,-2); # 1
    SELECT MOD(-5,2); # -1
    

    日期函数

    # 日期函数
    # 1. now():返回当前系统日期,包含时间
    SELECT NOW(); # 2021-02-15 14:25:26
    # curdate()
    SELECT CURDATE(); # 2021-02-15
    # curtime()
    SELECT CURTIME(); # 14:26:15
    
    # 2. 获取指定的年,月,日,时,分,秒
    SELECT YEAR(NOW());  # 2021
    SELECT MONTH(NOW()); # 2
    SELECT DAY(NOW());  # 15
    SELECT HOUR(NOW()); # 14
    SELECT MINUTE(NOW());  # 27
    SELECT SECOND(NOW()); # 12
    
    SELECT YEAR(`hiredate`) AS 年 FROM employees
    SELECT MONTHNAME(`hiredate`) AS 英文月 FROM employees
    
    # 3. str_to_date()将字符通过指定的格式(如下表)转*成日期
    SELECT STR_TO_DATE('1999-9-9','%Y-%m-%d');
    
    # 4. date_format():将日期转*成字符
    SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H时%i分%s秒') AS 'out' # 2021年02月15日 20时13分58秒
    

    字符转*成日期的格式

    格式符 功能 格式符 功能 格式符 功能
    %Y 四位的年份 %y 2位的年份 %m 月份(01,02..11,12)
    %c 月份(01,02..11,12) %d 日(01,02..) %H 小时(24小时制)
    %h 小时(12小时制) %i 分钟(00,01..59) %s 秒(00,01..59)

    其他函数version,database,user

    # 其他函数
    SELECT VERSION(); # 5.5.62
    SELECT DATABASE(); # myemployees
    SELECT USER(); # root@localhost
    

    流程控制函数if,case

    # 流程控制函数
    # 1. if
    SELECT IF(10 > 9,3,4); # 3
    SELECT IF(10 > 11, 3, 4); # 4
    
    # 2. case
    /** 语法一:类似Java中switch case语句
    case 要判断的字段或表达式
    when 常量1 then 要显示的值1或语句1
    when 常量2 then 要显示的值2或语句2
    ...
    else 要显示的值n或语句n
    end
    */
    # 查询员工的工资,要求
    # 部门号=30,显示的工资为1.1倍
    # 部门号=40,显示的工资为1.2倍
    # 部门号=50,显示的工资为1.3倍
    # 其他部门,显示的工资为原工资
    SELECT salary AS 原始工资,`department_id`,
    CASE department_id
    WHEN 30 THEN salary*1.1
    WHEN 40 THEN salary*1.2
    WHEN 50 THEN salary*1.3
    ELSE salary 
    END
    AS 新工资
    FROM employees 
    
    /** 语法二:类似多重if-else
    case
    when 条件1 then 要显示的值1或语句1
    when 条件2 then 要显示的值2或语句2
    e1se 要显示的值n或语句n
    end
    */
    # 查询员工的工资的情况
    #  如果工资>20000,显示A级别
    #  如果工资>15000,显示B级别
    #  如果工资>10000,显示c级别
    #  否则,显示D
    SELECT salary, 
    CASE
    WHEN salary > 20000 THEN 'A'
    WHEN salary > 15000 THEN 'B'
    WHEN salary > 10000 THEN 'C'
    ELSE 'D'
    END
    AS 级别
    FROM employees
    

    分组函数

    • 功能:用作统计使用,又称为聚合函数或统计函数或组函数
    • 分类:sum 求和、avg平均值、max最大值、min最小值、count 计算个数
    • 特点:
      sum、avg一般用于处理效值型
      max、min、count可以处理任何类型
      sum、avg、max、min、count忽略null
      ④ 可以和distinct一起使用
    # 分组函数
    # 1. 简单求工资总和
    SELECT SUM(salary) 求和,
           AVG(salary) 平均,
           MAX(salary) 最大,
           MIN(salary) 最小,
           COUNT(salary) 个数
     FROM employees 
    # 2. 和distinct一起使用
    SELECT SUM(DISTINCT salary), SUM(salary) FROM employees
    # 3. count()
    SELECT COUNT(salary) FROM employees
    SELECT COUNT(*) FROM employees
    

    注意:和分组函数一起使用的只能是grop by 后的语句

    分组查询

    • 语法:
    select 分组函数,列(要求出现在group by的后面) from 表
    【where 筛选条件】
    group by 分组的列表
    【order by 子句】
    注意:查询列表必须特殊,要求是分组函数和group by后出现的字段
    

    分组前筛选

    # 分组查询
    # 1. 查询每个工种的最高工资
    SELECT MAX(`salary`) 最高工资,`job_id`
    FROM employees
    GROUP BY `job_id`
    # 2. 查询每个位置上的部门个数
    SELECT `location_id`, COUNT(*) AS 个数
    FROM departments
    GROUP BY `location_id`
    # 3. 查询邮箱中包含a字符的,每个部门的平均工资
    SELECT `department_id`, AVG(`salary`) 平均工资
    FROM employees
    WHERE `email` LIKE '%a%'
    GROUP BY `department_id`
    # 4. 查询有奖金的每个领导手下员工的最高工资
    SELECT `manager_id`, MAX(`salary`) AS 最高工资
    FROM employees
    WHERE `commission_pct` IS NOT NULL
    GROUP BY `manager_id`
    

    分组后筛选 having

    # 1. 查询哪个部门的员工个数>2
    SELECT `department_id`, COUNT(*) 员工个数
    FROM employees
    GROUP BY `department_id`
    HAVING	员工个数 > 2
    # 2. 查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
    SELECT `job_id` 工种编号, MAX(`salary`) 最高工资
    FROM employees
    WHERE `commission_pct` IS NOT NULL
    GROUP BY `job_id`
    HAVING 最高工资 > 12000
    # 3. 查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
    SELECT `manager_id`, MIN(`salary`) 最低工资
    FROM employees
    WHERE `manager_id` > 102
    GROUP BY `manager_id`
    HAVING 最低工资 > 5000
    /* 
    	按 函数 分组 
    */
    # 4. 按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
    SELECT LENGTH(`last_name`) 姓名长度, COUNT(*) 个数
    FROM employees
    GROUP BY 姓名长度
    HAVING COUNT(*) > 5
    /* 
    	按多个字段分组 
    */
    # 5. 查询每个部门每个工种的员工的平均工资, 并排序
    SELECT `department_id`, `job_id`, AVG(`salary`)
    FROM employees
    GROUP BY `department_id`, `job_id`
    ORDER BY AVG(`salary`) ASC
    

    连接查询/多表查询

    • 按年代分类:sq192标准(仅支持内连接), sq199标准【推荐】
    • 按功能分类:
      ① 内连接:等值连接,非等值连接,自连接
      ② 外连接:左外连接,右外连接,全外连接
      ③ 交叉连接

    内连接(等值连接,非等值连接,自连接)

    • 两个表的交集
    # 内连接(sql92语法)
    /*
       等值连接
    */
    # 1. 查询员工名和对应的部门名
    SELECT `last_name`, `department_name`
    FROM employees, departments
    WHERE employees.`department_id` = departments.`department_id`
    # 2. #查询员工名、工种号、工种名
    # 表中一旦起了别名,则查询的字段*能用原表名
    SELECT `last_name`, j.`job_id`, `job_title`
    FROM employees AS e, jobs AS j
    WHERE e.`job_id` = j.`job_id`
    # 3. 查询每个城市的部门个数
    SELECT `city`, COUNT(*) 部门个数
    FROM departments AS d, locations AS l
    WHERE d.`location_id` = l.`location_id`
    GROUP BY city
    # 4. 查询有奖金的每个部门的部门名和部门的领导编号和该部门的最低工资
    SELECT `department_name`, d.`manager_id`, MIN(`salary`)
    FROM employees e, departments d
    WHERE `commission_pct` IS NOT NULL AND e.`department_id` = d.`department_id`
    GROUP BY `department_name`, d.`manager_id`
    
    /*
       非等值连接
    */
    # 1. 查询员工的工资和工资级别
    SELECT salary, grade_level
    FROM employees e, job_grades
    WHERE salary BETWEEN lowest_sal AND highest_sal
    
    /*
       自连接
    */
    # 1. 查询员工名和上级的名称
    SELECT e1.`employee_id`, e1.`last_name`, e2.`manager_id`, e2.`last_name` 
    FROM employees e1, employees e2
    WHERE e1.`employee_id` = e2.`manager_id`
    

    自连接解释:如:现在查询员工名和上级的名称,在employee表中manager_id中的100对应着employee_id中100,从而找到last_name:K_ing

    sql99语法-内连接

    • 语法:
    select查询列表
    from 表1 别名【连接类型】
    join 表2 别名
    on 连接条件
    【where 筛选条件】
    【group by 分组】
    【having 筛选条件】
    【order by 排序列表】
    
    连接类型:
        内连接:inner
        外连接
           左外:left【outer】
           右外:right【outer】
           全外:full【outer】
        交叉连接:cross
    
    # sql99语法
    /*
    	等值连接
    */
    # 1.查询员工名、部门名
    SELECT `last_name`,`department_name`
    FROM employees e 
    INNER JOIN departments d
    ON e.`department_id` = d.`department_id`
    # 2. 查询名字中包含e的员工名和工种名(筛选)
    SELECT `last_name`, `job_title`
    FROM employees e
    INNER JOIN jobs	j
    ON e.`job_id` = j.`job_id`
    WHERE `last_name` LIKE '%e%'
    # 3.查询部门个数>3的城市名和部门个数(分组+筛选)
    SELECT city,COUNT(*) 个数
    FROM locations l
    INNER JOIN departments d
    ON d.`location_id` = l.`location_id`
    GROUP BY city
    HAVING COUNT(*) > 3
    # 4. 查询员工名、部门名、工种名,并按部门名降序()
    SELECT `last_name`, `department_name`, `job_title`
    FROM employees e
    INNER JOIN departments d ON e.`department_id` = d.`department_id`
    INNER JOIN jobs j ON e.`job_id` = j.`job_id`
    ORDER BY `department_name` DESC
    /*
    	非等值连接
    */
    # 1. 查询员工的工资级别
    SELECT salary, `grade_level`
    FROM employees e
    INNER JOIN `job_grades` j ON salary BETWEEN `lowest_sal` AND `highest_sal`
    # 2. #查询工资级别的个数>20个数,并且按工资级别降序
    SELECT `grade_level` 级别, COUNT(*) 个数
    FROM employees e
    INNER JOIN job_grades j ON salary BETWEEN `lowest_sal` AND `highest_sal`
    GROUP BY  `grade_level`
    HAVING COUNT(*) > 20
    /*
    	自连接
    */
    # 1. 查询员工的名字、上级的名字
    SELECT e1.`employee_id`, e1.`last_name`, e2.`manager_id`, e2.`last_name`
    FROM employees e1
    INNER JOIN employees e2 ON e1.`employee_id` = e2.`manager_id`
    
    

    外连接(左外连接,右外连接,全外连接)

    • 应用场景:用于查询一个表中有,另一个表没有
    • 特点:外连接的查询结果为主表中的所有记录
      ① 如果从表中有和它匹配的,则显示匹配的值
      ② 如果从表中没有和它匹配的,则显示null
    • 主从表区分:
      ① 左外连接,left join左边的是主表
      ② 右外连接,right join右边的是主表
    # 左/右外连接
    # 1. 查询没有男朋友的女生信息
    /*
    这里用到boys和beauty表,根据题意 beauty为主表,boys为从表
    从表中数据可以看出 beauty中boyfriend_id的值*在`boys`中则显示为null
    */
    SELECT b.*, bo.`boyName`
    FROM beauty b
    LEFT JOIN boys bo ON b.`boyfriend_id` = bo.`id`
    


    又如

    # 1. 查询哪个部门没有员工
    SELECT `department_name`
    FROM departments d
    LEFT JOIN employees e ON d.`department_id` = e.`department_id`
    WHERE d.`manager_id` IS NULL
    

    全外连接/交叉连接

    • 全外连接 = 内连接的结果 + 表1中有但表2没有的 + 表2中有但表1没有的
    • 交叉连接: 结果是笛卡尔乘积,如表1 3条记录,表2 5条记录,则全外连接结果是:3 * 5 = 15条记录

    子查询

    • 出现在其他语句中的查询语句,称为子查询或内查询
    • 分类:
      ① 按子查询出现的位置:
      Ⅰ: select后面: 仅仅支持标量子查询
      Ⅱ: from后面: 支持表子查询
      Ⅲ:wherehaving后面:支持标量子查询(单行);列子查询(多行);行子查询
      Ⅳ:exists后面(相关子查询):支持表子查询
      ② 按结果集的行列数*同:
      Ⅰ: 标量子查询(结果集只有一行一列)
      Ⅱ: 列子查询(结果集只有一列多行)
      Ⅲ:行子查询(结果集有一行多列)
      Ⅳ:表子查询(结果集一般为多行多列)

    where或having后面

    • 支持:标量子查询(单行子查询),列子查询(多行子查询),行子查询(多列多行)
    • 特点:
      ① 子查询放在小括号内
      ② 子查询一般放在条件的右侧
      ③ 标量子查询,一般搭配着单行操作符使用。单行操作符:>,<,>=,<=,=,<>
      ④ 列子查询,一般搭配着多行操作符使用in、any/some、all
      多行操作符含义
    操作符 含义
    IN,NOT IN 等于列表中的任意一个
    ANY/SOME 和子查询返回的某一个值比较
    ALL 和子查询返回的所有值比较

    标量子查询

    # 1. 谁的工资比Abel高?
    SELECT last_name, salary 
    FROM employees
    WHERE salary > (
    	SELECT salary FROM employees WHERE last_name = 'Abel')
    # 2. 返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资
    SELECT job_id FROM employees WHERE employee_id = 141 # 查询员工id=141的job_id
    SELECT salary FROM employees WHERE employee_id = 143 # 查询员工id=143的薪水
    
    SELECT `last_name`, `job_id`, `salary` FROM employees	
    WHERE job_id = (
    	SELECT job_id FROM employees WHERE employee_id = 141
    )AND salary > (
    	SELECT salary FROM employees WHERE employee_id = 143
    );
    # 3. 返回公司工资最少的员工的last_name,job_id和salary
    SELECT MIN(salary) FROM employees  # 查询最低薪水
    SELECT `last_name`, `job_id`, `salary` FROM employees
    WHERE `salary` = (
    	SELECT MIN(salary) FROM employees
    );
    

    列子查询

    # 1. 返回location_id是1400或1700的部门中的所有员工姓名
    SELECT DISTINCT department_id FROM departments WHERE `location_id` IN(1400,1700) # location_id是14/700的部门id
    SELECT `last_name` FROM employees WHERE department_id IN(
    	SELECT DISTINCT department_id FROM departments WHERE `location_id` IN(1400,1700)
    );
    # 2. 返回其它工种中比job_id为IT_PROG部门任一工资低的员的员工号、姓名、job_id以及salary
    SELECT salary FROM employees WHERE job_id = 'IT_PROG'
    SELECT `employee_id`, `last_name`, `job_id`, `salary` FROM employees
    WHERE salary < ANY(
    	SELECT salary FROM employees WHERE job_id = 'IT_PROG'
    ) AND `job_id` <> 'IT_PROG';
    

    行子查询

    # 行子查询
    # 查询员工编号最小并且工资最高的员工信息
    SELECT MIN(`employee_id`) FROM employees
    SELECT MAX(`salary`) FROM employees
    SELECT * FROM employees WHERE employee_id = (
    	SELECT MIN(`employee_id`) FROM employees
    ) AND salary = (
    	SELECT MAX(`salary`) FROM employees
    );
    # 或者
    SELECT * FROM employees 
    WHERE (`employee_id`, `salary`) = (
    	SELECT MIN(`employee_id`), MAX(`salary`) FROM employees
    );
    

    select后面

    # select后面
    # 1. 查询每个部门的员工个数
    SELECT d.*, (
    	SELECT COUNT(*) FROM employees e
    	WHERE e.`department_id` = d.`department_id`
    ) AS 个数
    FROM departments d;
    # 2. 查询员工号=102的部门名
    SELECT (
    	SELECT department_name FROM departments d, employees e
    	WHERE e.`employee_id` = 102 AND e.`department_id` = d.`department_id`
    )
    

    from后面

    # from 后面
    # 放到from后面的查询的表 必须起别名
    # 1.查询每个部门的平均工资的工资等级
    SELECT dep_avg.*, `grade_level` 工资等级
    FROM(
    	SELECT `department_id`, AVG(`salary`) 平均工资 FROM employees 
    	GROUP BY `department_id`
    ) dep_avg, job_grades j
    WHERE dep_avg.平均工资 BETWEEN `lowest_sal` AND `highest_sal`
    

    exists后面

    • 语法:exists(完整的查询语句) ,结果: 1或0
    # exists后面
    SELECT EXISTS(SELECT `department_id` FROM employees WHERE salary = 1) #0 没有结果就返回0
    SELECT EXISTS(SELECT `department_id` FROM employees ) #1 查询到结果就返回1
    

    分页查询

    • 语法:
    select 查询列表
    from 表
    ...
    limit offset,size;
    # offset要显示条目的起始索引(起始索引从0开始)
    # size要显示的条目个数
    
    • 特点:
      1imit语句放在查询语句的最后
      ②公式: 要显示的页数page,每页的条目数size;则查询语句: select 查询列表 from 表 limit(page-1)*size,size
    # 分页查询
    # 1. 查询前五条员工信息
    SELECT * FROM employees LIMIT 0,5;
    SELECT * FROM employees LIMIT 5; # 当从0开始查询时,offset可省略
    # 2. 查询第11条—第25条
    SELECT * FROM employees LIMIT 10,15
    # 3. 有奖金的员工信息,并且工资较高的前10名显示出来
    SELECT * FROM employees WHERE `commission_pct` IS NOT NULL ORDER BY `salary` DESC LIMIT 10
    

    联合查询

    • 所用关键字,union 联合,合并:将多条查询语句的结果合并成一个结果
    • 特点:
      ① 要求多条查询语句的查询列数是一致的!
      ② 要求多条查询语句的查询的每一列的类型和顺序最好一致
      union关键字默认去重,如果使用union all可以包含重复项
    # 联合查询
    # 1.查询部门编号>90或邮箱包含a的员工信息
    SELECT * FROM employees WHERE `department_id` > 90 OR email LIKE '%a%';
    
    SELECT * FROM employees WHERE `department_id` > 90
    UNION 
    SELECT * FROM employees WHERE email LIKE '%a%';
    
  • 相关阅读:
    Java接口面面观
    Java之今天的异常处理了吗
    Java中自动装箱与拆箱详解
    java中this关键字解析
    Java语言实现机制
    Centos7 中 service iptables save 失效
    基于JQuery网页漂浮广告窗口Js详解
    JS日历
    js时间转换
    两种方法实现在HTML页面加载完毕后运行某个js
  • 原文地址:https://www.cnblogs.com/huyuqing/p/14403296.html
Copyright © 2011-2022 走看看