zoukankan      html  css  js  c++  java
  • DB、DBMS、MySQL、SQL

      一、DB、DBMS、MySQL

      DB,database,数据库,存储数据的仓库,它保存了一系列有组织的数据,数据库的好处:可以持久化数据到本地、结构化查询,数据库存储数据的特点:数据存放到表中,然后表再放到库中;一个库中可以有多张表,每张表具有唯一的表名用来标识自己;表中有一个或多个列,列又称为“字段”,相当于Java中的“属性”;表中的每一行数据,相当于Java中“对象”

      DBMS,database management system,数据管理系统,数据库(DB)是通过DBMS创建和操作的容器常见的数据库管理系统,MySQL Oracle Db2 SqlServer等

      MySQL,是基于客户机-服务器的DBMS(C/S,客户端 / 服务端),有别于基于共享文件系统的DBMS,如Access

      与DBMS(数据库管理系统)交互,使用SQL语言

      二、什么是SQL

      SQL ( structure query language ) ,专门与DBMS通信的语言,结构化查询语言,是一种非过程化的语言(在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的,由数据库管理系统完成),SQL,是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言

      三、SQL为什么是一种非过程化的语言

      这里的非过程化指的并不是编程语言里面的那个面向过程,而是数据库的Data Manipulation Language ( DML,数据操纵语言 ) 这类语言的一个分类。

      DML这类语言分为两个大类,声明式(Declarative DMLs)和过程式(Procedural DMLs)前者我们也称为非过程式的DML(Non-procedural DMLs)。两者之间的区别是,声明式的DML只需要声明我们需要什么样的数据,像是SQL就是这样的语言。而过程式DML不仅需要声明需要什么样的数据,而且需要给出如何得到数据的方法,类似的DML是relational algebra。

      四、SQL是声明式的非过程语言,那么,查询是如何实现的

      SQL进行数据操作时,只需要考虑做什么,不需要考虑怎么做,用户也无需了解存取路径,存取路径的选择以及SQL的操作过程由DBMS(数据库管理系统)完成

      五、SQL语言的分类

      1、数据查询语言DQL(Data Query Language )
      数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:

      SELECT <字段名表>
      FROM <表或视图名>
      WHERE <查询条件>

      2、数据操纵语言DML(Data Manipulation Language)
      数据操纵语言DML主要有三种形式:

      插入:INSERT
      更新:UPDATE
      删除:DELETE

      3、数据定义语言DDL(Data Definition Language)
      DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上

      如:CREATE、ALTER、DROP

      4、数据控制语言DCL(Data Control Language)
      数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。 

      授权:GRANT
      取消授权:REVOKE

      5、事务控制语言TCL(Transaction Control Language)  

      保存点: SAVEPOINT
      设置事务: SET TRANSACTION
      提交:COMMIT
      回滚:ROLLBACK

      六、数据查询语言DQL(Data Query Language )

      1、基础查询

    #进阶1:基础查询
    /*
    语法:
    select 查询列表 from 表名;
    1、查询列表可以是:表中的字段、常量值、表达式、函数
    2、查询的结果是一个虚拟的表格 ( 不保存 )
    */
    
    #打开数据库
    USE myemployees;
    
    #1、查询表中的单个字段
    SELECT last_name FROM employees;
    
    #2、查询表中的多个字段
    SELECT last_name,salary,email FROM employees;
    
    #3、查询表中的所有字段
     
    #方式一( 栏位,双击字段可以快速添加,选中代码,按F12格式化或按F9执行 ):
    SELECT 
      `first_name`, # 字段两边的着重号`是区分是关键字还是字段的,可以去掉,
      `last_name`,
      `email`,
      `phone_number`,
      `job_id`,
      `salary`,
      `commission_pct`,
      `manager_id`,
      `department_id`,
      `hiredate` 
    FROM
      employees ;
      
    # 方式二,* 代表所有字段,字段与原始表一样:
    SELECT * FROM employees; 
    
    #4、查询常量值
    SELECT 100;
    SELECT 'john'; #查询字符常量
    
    #5、查询表达式
    SELECT 100*98;
    
    #6、查询函数
    SELECT VERSION(); #查询函数VERSION()的返回值
    
    #7、起别名
    /*
    便于理解(提高可读性)
    如果要查询的字段有重名的使用别名可以区分开来
    */
    #方式一:使用as
    SELECT 100%98 AS 结果;
    SELECT last_name AS 姓, first_name ASFROM employees;
    
    #方式二:使用空格
    SELECT last_name 姓, first_name 名 FROM employees;
    
    #别名含有特殊符号的要加双引号或单引号
    SELECT salary AS "out put" FROM employees;
    
    #8、去重
    #查询员工表中涉及的所有的部门编号 ( 去掉重复的编号用distinct )
    SELECT DISTINCT department_id FROM employees;
    
    #9+号的作用
    /*
    java中的+号:
    运算符,两个操作数都为数值型
    连接符,只要一个操作数为字符串
    
    mysql中的+号:
    运算符,仅仅只有一个功能
    select 100+90;   #两个操作数都为数值型,则做加法运算
    select '123'+90; #只要其中一个操作数为字符型,试图把字符型转为数值型,
                #转换成功则继续做加法运算
    select 'john'+90;   #转换失败则字符型数值为0,再做加法运算
    select null+90;  #只要其中一个操作数为null,结果为null
    */
    
    #查询员工名和姓连接成一个字段并显示为姓名,使用字符连接函数concat(),
    #只要其中一个操作数为null,结果为null
    SELECT 
      CONCAT(last_name, ' ', first_name) AS 姓名 
    FROM
      employees ;
    
    #使用ifnull()函数,避免结果为null
    
    SELECT 
      IFNULL(`commission_pct`, 0) AS 奖金率,
      `commission_pct` 
    FROM
      employees ;
    
    SELECT 
      CONCAT(
        `first_name`,
        ',',
        `last_name`,
        ',',
        `email`,
        ',',
        IFNULL(`commission_pct`, 0)
      ) AS out_put 
    FROM
      employees ;
    View Code

      2、条件查询

    #进阶2:条件查询
    /*
    语法:( 执行顺序 from/where/select )
        select
            查询列表
        from
            表名
        where
            筛选条件(结果是true或false);
    分类:
        一、按条件表达式筛选
            条件运算符:
                > < = != <> >= <= <=>
            其中 <> 与 != 相同,<=> 安全等于
        二、按逻辑表达式筛选 ( 作用:是连接条件表达式的 )
            逻辑运算符:
                && || !
                and or not
        三、模糊查询
            like
            between and
            in
            is null|is not null
    */
    
    USE myemployees;
    #一、按条件表达式筛选
    
    #查询工资>12000的员工的信息
    SELECT 
      * 
    FROM
      employees 
    WHERE salary > 12000 ;
    
    #查询部门编号不等于90号的员工名和部门编号
    SELECT 
      first_name,
      department_id 
    FROM
      employees 
    WHERE department_id <> 90 ;
    
    #二、按逻辑表达式筛选
    
    #查询工资在10000到20000之间的员工名、工资及奖金
    SELECT 
      first_name,
      salary,
      commission_pct 
    FROM
      employees 
    WHERE salary >= 10000 
      AND salary <= 20000 ;
    
    #查询部门编号不是在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 ;
    
    #模糊查询
    /*
    like
    一般和通配符搭配使用
        通配符:
        %任意多个字符包含0个字符
        _任意单个字符
    between and
    in
    is null|is not null
    */
    
    #查询员工中包含字符a的员工信息
    SELECT 
      * 
    FROM
      employees 
    WHERE first_name LIKE '%a%' ;
    
    #查询员工中第三个字符为e,第五个字符为a的员工和工资
    SELECT 
      first_name,
      salary 
    FROM
      employees 
    WHERE first_name LIKE '__e_a%' ;
    
    #查询员工姓名中第二个字符为_的员工姓名
    /*select 
      last_name 
    from
      employees 
    where last_name like '_\_%' ; #使用转义字符
    */
    
    SELECT 
      last_name 
    FROM
      employees 
    WHERE last_name LIKE '_$_%' ESCAPE '$' ; # ESCAPE 定义转义字符
    #查询员工编号在100到120之间的员工信息
    SELECT 
      * 
    FROM
      employees 
    WHERE employee_id >= 100 
      AND employee_id <= 120 ;
      
    #查询员工部门号第一个数字为1的员工信息,like 可以查询数值型的字段
    SELECT 
      * 
    FROM
      employees 
    WHERE department_id LIKE '1__' ;
     
    #between and 提高语句简洁度,包含临界值如下的100 120,两个临界值不调换顺序
    SELECT 
      * 
    FROM
      employees 
    WHERE employee_id BETWEEN 100 
      AND 120 ;
    
    #查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
    SELECT 
      first_name,
      job_id 
    FROM
      employees 
    WHERE job_id = 'IT_PROT' 
      OR job_id = 'AD_VP' 
      OR job_id = 'AD_PRES' ;
    
    #IN 判断某个字段的值是否属于in列表中的某一项
    #比使用or提高语句简洁度,in类别的值类型必须一致或兼容,不支持通配符
    SELECT 
      first_name,
      job_id 
    FROM
      employees 
    WHERE job_id IN ('IT_PROT', 'AD_VP', 'AD_PRES') ;
    
    #查询没有奖金的员工名和奖金率
    /*
    = 或 <> 不能判断 null
    is null或is not null 可以判断null值
    */
    SELECT 
      first_name,
      commission_pct 
    FROM
      employees 
    WHERE commission_pct IS NULL ; # 没有奖金 WHERE commission_pct IS NOT NULL ;
    
    #安全等于 <=> ,可读性不好
    SELECT 
      first_name,
      commission_pct 
    FROM
      employees 
    WHERE commission_pct <=> NULL ; #is null
    
    #奖金等于12000的员工名
    SELECT 
      first_name,
      salary
    FROM
      employees 
    WHERE salary <=> 12000 ;
    
    # is null 仅仅可以判断null值,可读性高,建议使用
    # <=> 即可以判断null值,又可以判断普通的数值,可读性较低
    
    #查询员工号为176的员工的姓名和部门和年薪
    SELECT 
      first_name,
      department_id,
      salary * 12 *(1+ IFNULL(commission_pct, 0)) AS 年薪 
    FROM
      employees 
    WHERE employee_id = 176 ;
    
    #查询没有奖金,且工资小于18000的salary,last_name
    SELECT 
      last_name,
      salary 
    FROM
      employees 
    WHERE commission_pct IS NULL 
      AND salary < 18000 ;
    
    #查询 employee 表中,job_id 不为 'IT' 或者 工资为12000的员工的信息
    SELECT 
      * 
    FROM
      employees 
    WHERE job_id <> 'IT' 
      OR salary = 12000 ;
    
    #查看部门 departments 表的结构
    DESC departments;
    
    #查看部门departments表中涉及到了哪些位置编号
     
    SELECT DISTINCT  #distinct 去重
      location_id 
    FROM
      departments ;
    
    #------------------------
    SELECT 
      * 
    FROM
      employees ;
    
    #如果判断的字段有null值下面语句与上面语句不一样
    SELECT 
      * 
    FROM
      employees 
    WHERE commission_pct LIKE '%%' 
      AND last_name LIKE '%%' ;
    View Code

       3、排序查询

    #进阶3:排序查询
    /*
    语法:
        select 查询列表
        from 表
        【where 筛选条件】
        order by 排序列表 【asc|desc】
    特点:
        1、asc是升序,desc是降序
            如果不写,默认是升序
        2、order by 子句中可以支持单个字段、多个字段、表达式、函数、别名
        3、order by 子句一般放在查询语句的最后面,limit子句除外
    */
    #查询员工信息,要求工资从高到低排序
    SELECT 
      * 
    FROM
      employees 
    ORDER BY salary DESC ;
    
    #查询部门编号 >= 90的员工信息,按入职时间的先后进行排序 【 添加筛选条件 】
    SELECT 
      * 
    FROM
      employees 
    WHERE department_id >= 90 
    ORDER BY hiredate ;
    
    #按年薪的高低显示员工的信息和年薪【 按表达式排序 】
    SELECT 
      *,
      salary * 12 * (1 + IFNULL(commission_pct, 0)) AS 年薪 
    FROM
      employees 
    ORDER BY salary * 12 * (1 + IFNULL(commission_pct, 0)) DESC;
    
    #按年薪的高低显示员工的信息和年薪【 按别名排序 】
    SELECT 
      *,
      salary * 12 * (1 + IFNULL(commission_pct, 0)) AS 年薪 
    FROM
      employees 
    ORDER BY 年薪 DESC;
    
    #按姓名的长度显示员工的姓名和工资【按函数排序】
    SELECT 
      LENGTH(last_name) AS 字节长度,
      last_name,
      salary 
    FROM
      employees 
    ORDER BY LENGTH(last_name) DESC ;
    
    #查询员工信息,要求先按工资升序排序,再按员工编号降序排序【按多个字段排序】
    SELECT 
      * 
    FROM
      employees 
    ORDER BY salary ASC,
      employee_id DESC ;
    
    #查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序
    SELECT 
      last_name,
      department_id,
      salary * 12 * (1 + IFNULL(commission_pct, 0)) AS 年薪 
    FROM
      employees 
    ORDER BY 年薪 DESC,
      last_name ASC ;
    
    #选择工资不在8000到17000的员工的姓名和工资,按工资降序
    SELECT 
      last_name,
      salary 
    FROM
      employees 
    WHERE salary NOT BETWEEN 8000 
      AND 17000 
    ORDER BY salary ASC ;
    
    #查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
    SELECT 
      * 
    FROM
      employees 
    WHERE email LIKE '%e%' 
    ORDER BY LENGTH(email) DESC,
      department_id ASC ;
    View Code

      4、函数查询

  • 相关阅读:
    BZOJ-2743: [HEOI2012]采花(树状数组 or TLE莫队)
    BZOJ-1122: [POI2008]账本BBB (单调栈神题)
    2017年10月18日23:54:18
    [校内自测 NOIP模拟题] chenzeyu97要请客(单调栈)
    BZOJ-1057: [ZJOI2007]棋盘制作(单调栈)
    [校内自测] 奶牛编号 (递推+智商)
    [校内自测] Incr (LIS+智商)
    BZOJ1486 [HNOI2009]最小圈
    BZOJ2400 Spoj 839 Optimal Marks
    BZOJ2595 [Wc2008]游览计划
  • 原文地址:https://www.cnblogs.com/GoldenEllipsis/p/14498989.html
Copyright © 2011-2022 走看看