zoukankan      html  css  js  c++  java
  • 数据库-Mysql

    Mysql

    基本语法

    # 查看数据库
    show database;
    # 选择test库
    use test;
    # 查看当前库的所有表
    show tables;
    # 查看其他库的所有表
    show tables form 库名;
    # 创建表
    create table 表名(
    
    	列名 列类型,
    	列名 列类型,
    	。。。
    );
    # 查看表结构
    desc 表名;
    

    基础查询

    语法:

    # SELECT 查询列表 FORM 表名;
    # 查询所有字段
    SELECT * FORM user;
    # 查询单个、多个字段
    SELECT name,salary FROM user;
    # 字段可以加反引号来区分是字段还是关键字
    SELECT `select` FROM user;
    

    起别名

    # 方式一:使用AS
    SELECT 10%98 AS 结果;
    SELECT last_name AS 姓,first_name AS 名 FROM employees;
    # 方式二:使用空格
    SELEC1 last_name 姓,first_name 名 FROM employees;
    ### 去重`DISTINCT`
    ```sql
    # 案例 查询字段中不重复的值
    SELEC1 DISTINCT department_id FROM employees;
    

    +号 和 CONCAT()

    没有拼接字符串的作用,只能是运算符(如果非数值型强转为数值型做加法运算)

    # 不是将字符串拼接
    SELECT
      last_name+first_name AS 姓名
    FROM
      employees;
    # CONCAT字符串拼接
    SELECT
      CONCAT(last_name,first_name) AS 姓名
    FROM
      employees;
    # 其中一方为字符
    SELECT '123'+2; # 125(转换成功)
    SELECT 'john'+2; # 2(转换失败的按0计算)
    SELECT NULL+2; # NULL(有一个为MULL则输出MULL)
    

    IFNULL()判断是否为空

    # 如果是NULL,转为0
    SELECT IFNULL(NULL,0) # 0
    # 如果不是是NULL,输出原值
    SELECT IFNULL(300,0) # 300
    

    条件查询

    语法:

    # SELECT 查询列表 FORM 表名 WHERE 筛选条件;
    

    按条件表达式筛选

    > < = != <> >= <=

    #案例1:查询工资>12000的员工信息  大于>
    SELECT * FROM employees WHERE salary>10000;
    #案例2:查询部门编号不等于90号的员工名和部门名  不等于 <> !=
    SELECT last_name,department_id FROM employees WHERE department_id<>90;
    SELECT last_name,department_id FROM employees WHERE department_id!=90;
    

    按逻辑表达式筛选

    && ||
    and or not

    # 查询工资在10000到20000之间的员工名、工资以及奖金  && and 条件都为真时才执行
    SELECT last_name,salary,commission_pct FROM employees WHERE salary >=10000 AND salary <= 20000;
    SELECT last_name,salary,commission_pct FROM employees WHERE salary >=10000 && salary <= 20000;
    # 查询部门编号不是在90到110之间,或者工资高于15000的员工信息 
    # (不在什么区间)可以用 not( * and * ) 或 !( * and * )
    SELECT
        *
    FROM
        employees
    WHERE
        NOT(department_id>=90 AND department_id<=110) OR salary>15000;
    # !( * and * )
    SELECT
        *
    FROM
        employees
    WHERE
        !(department_id>=90 AND department_id<=110) OR salary>15000;
    

    模糊查询

    • like
      特点:
      一般和通配符使用:
      % 任意多个字符,包含0个
      _ 任意单个字符(精准匹配)

    • between and
      特点:
      提高语句简洁度
      包含两个临界值,两个临界值不要调换顺序

    • in()
      特点:
      提高语句简洁度
      in列表的值类型必须一致或兼容
      in列表中不支持通配符

    • is nullis not null
      特点:
      =或<>不能用于判断null值
      is nullis not null 可以判断null值

    # like
    #案例1:查询员工名包含字符a的员工信息
    SELECT last_name FROM employees WHERE last_name LIKE "%a%";
    
    #案例2:查询员工名中包含第三个字符为u,第五个字符为o的员工名和工资
    SELECT last_name,salary FROM employees WHERE last_name LIKE '__u_o%';
    
    #案例3:查询员工名中第二个字符为_的员工名 可以用转义  ,也可以用ESCAPE $把 $当成转义符号.
    SELECT last_name FROM employees WHERE last_name LIKE "_$_%" ESCAPE "$";
    SELECT last_name FROM employees WHERE last_name LIKE "_\_%";
    
    # between and
    #案例1:查询员工编号在100到120之间的员工信息
    #第一种方法 >= and <=
    SELECT
        *
    FROM
        employees
    WHERE
        employee_id>=100 AND employee_id<=120;
    
    
    #第二种方法 between and
    SELECT
        *
    FROM
        employees
    WHERE
        employee_id BETWEEN 100 AND 120; # 临界值不能调换
    
    # in()
    #案例:查询员工的工种编号是IT——PROG、AD_VP、AD_PRES中的一个员工和工种编号
    SELECT
        last_name,
        job_id
    FROM
        employees
    WHERE
        job_id = "IT_PROG" OR job_id="AD_VP" OR job_id="AD_PRES";
    
    SELECT 
        last_name,
        job_id
    FROM
        employees
    WHERE
        job_id IN("IT_PROG","AD_VP","AD_PRES");
    
    # is null 和 is not null
    #案例1:查询没有奖金的员工名和奖金率
    SELECT
        last_name,salary,commission_pct
    FROM
        employees
    WHERE
        commission_pct IS NULL;
    
    #案例2:查询有奖金的员工名和奖金率,奖金
    SELECT last_name,salary,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
    

    安全等于<=>is null

    is null:仅仅可以判断NULL值,可读性高,推荐使用
    <=>:既可以判断NULL值,又可以判断普通数值,可读性低

    #案例3:查询没有奖金的员工名和奖金率
    SELECT
        last_name,salary,commission_pct
    FROM
        employees
    WHERE
        commission_pct <=> NULL; # 相当于commission_pct is NULL
    
    #案例4:查询工资为12000的员工信息
    SELECT * FROM employees WHERE salary <=>12000;
    #IS NULL:仅仅可以判断NULL值,可读性较高,建议使用
    #<=>    :既可以判断NULL值,又可以判断普通的数值,可读性较低
    
    #案例5:查询员工为176的员工的姓名和部门名和年薪
    SELECT
        last_name,employee_id,department_id,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
    FROM
        employees
    WHERE
        employee_id = 176;
        #employee_id <=>176
    
    SELECT job_id FROM employees;
    SELECT DISTINCT job_id FROM employees;
    

    排序查询

    SELECT 查询列表 FORM 表名
    	[WHERE 筛选条件]
        ORDER BY 排序列表[asc|desc];
    

    特点:
    asc代表的是升序,可以省略

    ​ order by子句可以支持 单个字段、别名、表达式、函数、多个字段

    ​ order by子句在查询语句的最后面,除了limit子句

    1. 对单个字段排序

      #这里不写默认是asc代表升序,后面添加desc代表降序
      SELECT * FROM employees ORDER BY salary;
      SELECT * FROM employees ORDER BY salary DESC;
      
    2. 筛选+排序

      #案例:查询部门编号>=90的员工信息,并按员工编号降序
      SELECT *
      FROM employees
      WHERE department_id>=90
      ORDER BY employee_id DESC;
      
    3. 按表达式排序

      #案例:查询员工信息  按年薪降序
      SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
      FROM employees
      ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
      
    4. 按别名排序

      #案例:查询员工信息  按年薪排序
      SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
      FROM employees
      ORDER BY 年薪 DESC;
      
    5. 按函数排序

      #案例:查询员工名,并且按名字的长度排序
      SELECT LENGTH(last_name) AS 名字长度,last_name
      FROM employees
      ORDER BY 名字长度 DESC;
      
      SELECT LENGTH(last_name) AS 名字长度,last_name
      FROM employees
      ORDER BY LENGTH(last_name) ASC;
      
    6. 按多个字段排序

      #案例: 查询员工信息,要求先按工资降序,再按employee_id升序
      SELECT *
      FROM employees
      ORDER BY salary DESC,employee_id ASC;
      

    常见函数

    概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
    好处:

    1. 隐藏了实现细节
    2. 提高代码的重用性
    

    调用:select 函数名(实参列表) 【from 表】;
    特点:
    ①叫什么(函数名)
    ②干什么(函数功能)

    分类:

    1. 单行函数

      如 concat、length、ifnull等

    2. 分组函数

      功能:做统计使用,又称为统计函数、聚合函数、组函数

    单行函数

    字符函数

    函数 描述
    length 获取字节个数(utf-8一个汉字代表3个字节,gbk为2个字节)
    concat 拼接字符串
    substr|substring 截取字符串
    instr 返回字符串第一次出现的索引,如果找不到返回0,默认索引是从1开始的
    trim 去掉前后的空格或指定其他的字符(默认只能去掉空格,不能去掉制表符/t,也可以指定去掉的字符)
    upper 小写变大写
    lower 大写变小写
    lpad 用于指定字符串实现左填充指定长度
    rpad 用于指定字符串实现右填充长度
    replace 替换
    • substr截取字符串

      # substr 索引从1开始
      # 截取从指定索引出到末尾
      SELECT SUBSTR('1234567890',6) out_put; # 结果:67890
      # 从指定索引处截取指定长度(从索引2截取5个字符)
      SELECT SUBSTR('1234567890',2,5) out_put; # 结果:23456 
      
    • trim去掉前后的空格或指定其他的字符(默认只能去掉空格,不能去掉制表符/t,也可以指定去掉的字符)

      SELECT TRIM('    张翠   山    '); # 结果:张翠   山
      SELECT TRIM('a' FROM 'aaaaa张aaaaa翠山aaaaaaaaaaaaaaaaaaa'); # 结果:张aaaaa翠山
      
    • lpadrpad填充长度

      SELECT LPAD("殿速速", 6, "$"); # 结果:$$$殿速速
      SELECT RPAD("你是谁",6,"$"); # 结果:你是谁$$$
      # 如果左填充长度小于字段长度,会被截断(右填充截前面的)
      SELECT LPAD("殿速速", 2, "$"); # 结果:殿速
      

    数学函数

    函数 描述
    round 四舍五入
    ceil 向上取整
    floor 向下取整
    truncate 截断小数点后几位
    mod 取余
    • round四舍五入

      SELECT ROUND(-132.633511) result; # 结果:-133
      # 第二个参数保留几位小数
      SELECT ROUND(-132.233511,2) result; # 结果:132.23
      SELECT ROUND(431.5345) result; # 结果:432
      SELECT ROUND(431.2345,2) result;# 结果:431.23
      
    • truncate截断小数点后几位

      SELECT TRUNCATE(1.45646,1); # 结果:1.4
      

    日期函数

    函数 描述
    now 返回当前系统日期+时间
    curdate 返回当前系统的日期(不包含时间)
    [year|month|day|hour|minute|second] 获取指定的部分,年,月,日,小时,分钟,秒
    str_to_date 将指定字符通过指定格式转换成日期
    date_format 将日期转成字符
    #now 返回当前系统日期+时间
    SELECT NOW();
    
    #curdate 返回当前系统的日期(不包含时间)
    SELECT CURDATE();
    
    #也可以获取指定的部分,年,月,日,小时,分钟,秒 (YEAR,MONTH,DAY,minute,second)
    SELECT YEAR(NOW());
    SELECT YEAR("1893-10-12");
    SELECT YEAR(hiredate) FROM employees;
    
    SELECT  MONTH(NOW());
    SELECT DAY(NOW());
    SELECT HOUR(NOW());
    SELECT MINUTE(NOW());
    SELECT SECOND(NOW());
    
    #str_to_date 将指定字符通过指定格式转换成日期: "%Y-%c-%d"
    SELECT STR_TO_DATE("1952_3_5","%Y_%m_%d"); #按照它指定字符格式去取日期
    SELECT STR_TO_DATE("1952_3_5","%Y_%c_%d"); #按照它指定字符格式去取日期
    
    #查询日志日期为1992-4-3的员工信息
    SELECT hiredate,last_name FROM employees; #1992-04-03 00:00:00  K_ing 
    SELECT hiredate,last_name FROM employees WHERE hiredate="1992-4-3";
    SELECT hiredate,last_name FROM employees WHERE hiredate=STR_TO_DATE('4-3 1992','%c-%d %Y');
    
    #date_format 将日期转成字符
    SELECT DATE_FORMAT(NOW(),"%Y年%m月%d日");
    SELECT DATE_FORMAT(NOW(),"%y年%m月%d日");
    SELECT DATE_FORMAT(NOW(),"%Y年%c月%d日");
    SELECT DATE_FORMAT(NOW(),"%Y年%m月%d日%W%H时%i分%s秒");
    SELECT DATE_FORMAT(NOW(),"%Y年%c月%d日-星期%w-%H时%i分%s秒");
    
    #查询有奖金的员工名和入职日期
    SELECT last_name,DATE_FORMAT(hiredate,"%Y年%m月%d日") 日期,commission_pct
    FROM employees
    WHERE commission_pct IS NOT NULL;
    

    其他函数

    函数 描述
    VERSION 版本号
    DATABASE 当前数据库
    USER 当前用户

    流程控制函数

    函数 描述
    if 类似三元运算符
    case 类似switch-case
    # IF
    SELECT IF(10<3,'小','大');
    SELECT last_name,commission_pct 奖金,IF(commission_pct IS NULL,"没奖金 呵呵","有奖金,嘻嘻") 备注
    FROM employees
    ORDER BY commission_pct DESC;
    # CASE
    /*
    mysql中
    #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 last_name,salary 原工资,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 新工资
    FROM employees;
    
    #case:第二种写法
    /*
    mysql中:
    case 
    when 条件1 then 要显示的值1或语句1
    when 条件2 then 要显示的值2或语句2
    。。。
    else 要显示的值n或语句n
    end
    */
    SELECT last_name 姓名,salary 工资,
    CASE
    WHEN salary>20000 THEN "A"
    WHEN salary>15000 THEN "B"
    WHEN salary>10000 THEN "C"
    ELSE "D"
    END 工资登记
    FROM employees
    ORDER BY salary DESC;
    

    分组函数

    功能:用作统计使用,又称为聚合函数或统计函数或组函数

    分类:

    ​ sum 求和、avg 平均值、max 最大值 、min 最小值 、count 计算个数

    特点:

    1. sum、avg一般用于处理数值型

      max、min、count可以处理任何类型

    2. 以上分组函数都忽略null值

    3. 可以和distinct搭配实现去重的运算

    4. count函数的单独介绍
      一般使用count(*)用作统计行数

    5. 和分组函数一同查询的字段要求是group by后的字段

    #1.简单使用
    SELECT SUM(salary) FROM employees;
    SELECT AVG(salary) FROM employees;
    SELECT MAX(salary) FROM employees;
    SELECT MIN(salary) FROM employees;
    SELECT COUNT(salary) FROM employees;
    
    SELECT SUM(salary) 总和,TRUNCATE(AVG(salary),2) 平均值取两位,MAX(salary) 最大值,MIN(salary) 最小值,COUNT(salary) 个数
    FROM employees;
    
    #2.参数支持哪些类型
    SELECT SUM(last_name) FROM employees;
    
    SELECT AVG(last_name) FROM employees;
    
    SELECT MIN(last_name) FROM employees;
    
    SELECT COUNT(last_name) FROM employees;
    
    #3. 是否会忽略null不计
    SELECT MAX(last_name) FROM employees;   #null会忽略不计
    SELECT MIN(commission_pct) FROM employees; #null会忽略不计
    SELECT COUNT(commission_pct) FROM employees; #null会忽略不计
    
    #4.和distinct去重搭配
    SELECT SUM(DISTINCT(salary)),SUM(salary) FROM employees;
    SELECT COUNT(DISTINCT(salary)),COUNT(salary) FROM employees;
    
    #5. count合并函数的详细介绍
    SELECT COUNT(salary) FROM employees;
    # 统计数据表的行数
    SELECT COUNT(*) FROM employees; #所需时间慢些在inndob引擎慢,在myisam引擎下快
    # 统计数据表的行数(可以将* 换为1,2等,或者字符)
    SELECT COUNT(1) FROM employees; #所需时间快些在inndob引擎快,在myisam引擎下慢
    #扩展:查看当前什么存储引擎(利用系统变量和函数进行查询或模糊匹配)
    SHOW TABLE STATUS FROM myemployees WHERE NAME="employees";
    SHOW TABLE STATUS FROM mysql WHERE NAME="db";
    SHOW VARIABLES LIKE "%storage_engine%";
    
    #查看创建的表示什么引擎,
    USE myemployees;
    SHOW CREATE TABLE jobs; #这条命令不仅可以查看表示用什么引擎,还可以看到怎么创建表的
    USE mysql;
    SHOW CREATE TABLE db;
    
    #desc table只能查看表的一部分结构
    DESC jobs;
    SELECT VERSION(); #查看版本号
    SHOW ENGINES; #查看系统默认支持的存储引擎
    USE mysql;
    SHOW TABLES;
    
    #6.和分组函数一同查询的字段有限制
    USE myemployees;
    SELECT AVG(salary),employee_id FROM employees; #可以执行但无意义,所查询字段要有同样的行数,否则必有缺失
    

    分组查询

    语法:

    select 查询列表
    from 表
    【where 分组前筛选条件】
    group by 分组的字段
    【having 分组后筛选条件】
    【order by 排序的字段】;
    

    特点:

    1. 和分组函数一同查询的字段必须是group by后出现的字段

    2. 筛选分为两类:分组前筛选和分组后筛选

      针对的表 位置 连接的关键字
      分组前筛选 原始表 group by 前 where
      分组后筛选 group by后的结果集 group by 后 having
      1. 分组函数做条件肯定是放在having字句后
      2. 能用分组前筛选的,就优先考虑使用分组前筛选
    3. group by分组可以按单个字段也可以按多个字段(多个字段之间使用逗号隔开没有顺序要求),也支持表达式或函数(用得比较少)

    4. 可以搭配着排序order by使用,放在整个分组查询之后的

    简单分组

    #案例1:查询每个工种的员工平均工资
    SELECT AVG(salary),job_id
    FROM employees
    GROUP BY job_id;
    
    #案例2:查询每个位置的部门个数
    SELECT COUNT(*),department_name
    FROM departments
    GROUP BY department_name;
    

    分组前筛选

    分组前筛选:按照分组字段分组后,每组按照筛选条件过滤

    SELECT 列名 FROM 表名 WHERE 筛选条件 GROUP BY 分组字段
    
    #案例1:查询邮箱中包含a字符的每个部门的最高工资
    SELECT department_id,MAX(salary)
    FROM employees
    WHERE email LIKE "%a%"
    GROUP BY department_id;
    
    SELECT DISTINCT(department_id)
    FROM employees;
    
    #案例2: 查询有奖金的每个领导手下员工的平均工资
    
    SELECT AVG(salary),manager_id
    FROM employees
    WHERE commission_pct IS NOT NULL
    GROUP BY manager_id;
    
    SELECT DISTINCT(manager_id)
    FROM employees
    WHERE commission_pct IS NOT NULL;
    

    分组后筛选

    分组后筛选:将筛选后的数据按字段分组

    SELECT 列名 FROM 表名 GROUP BY 分组字段 HAVING 筛选条件
    
    #案例1:查询部门的员工个数大于5个的部门
    SELECT COUNT(*) 员工个数,department_id
    FROM employees
    GROUP BY department_id
    HAVING COUNT(*) > 5;
    
    SELECT COUNT(*) 员工个数,department_id
    FROM employees
    GROUP BY department_id
    HAVING 员工个数 > 5;
    
    #案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
    # ①查询每个工种有奖金的员工的最高工资
    SELECT job_id,MAX(salary)
    FROM employees
    WHERE comission_pct IS NOT NULL
    GROUP BY job_id
    
    # ②根据①的结果继续筛选最高工资>12000
    SELECT job_id,MAX(salary)
    FROM employees
    WHERE comission_pct IS NOT NULL
    GROUP BY job_id
    HAVING MAX(salary)>12000;
    
    #案例3:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资
    #①查询每个领导手下的员工固定最低工资
    SELECT MIN(salary),management_id
    FROM employees
    GROUP BY manager_id;
    
    #②添加筛选条件领导标号 > 102(分组前筛选)
    SELECT MIN(salary),management_id
    FROM employees
    WHERE manager_id>102
    GROUP BY manager_id;
    
    #③添加筛选条件最低工资>5000(分组后筛选)
    SELECT MIN(salary),management_id
    FROM employees
    WHERE manager_id>102
    GROUP BY manager_id
    HAVING MIN(salary)>5000;
    

    TODO:待更新!!。。。

    heroes never die!
  • 相关阅读:
    码农雷林鹏:php环境搭建
    HashMap底层实现原理
    Java基础面试题
    ==和equals的区别,为什么重写equals要重写hashCode
    Java8 函数式接口,方法引用,stream
    ArrayList、Vector、LinkedList的区别
    第二章——信息的表示和处理
    第一章——计算机系统漫游
    通过zuul修改请求参数——对请求参数进行解密
    Java 扫描实现 Ioc 动态注入,过滤器根据访问url调用自定义注解标记的类及其方法
  • 原文地址:https://www.cnblogs.com/daiSir/p/14432692.html
Copyright © 2011-2022 走看看