MySQL基础语法


  • 怎么查看一个表

    1. 使用desc 包含列和属性 主要用于查看表中的列的时候 经常用于写SQL

    2. SHOW CREATE TABLE table_name\G

      包含建表语句和索引创建语句 主要用于给别人提供信息的时候

    3. SHOW table status like

      包含表的物理大小 索引大小和行数 主要用于优化 判断物理i\o

  • MySQL表的特性

    1. Myisam 有点类似Oracle 但是没有buffpool的概念 只能存索引,且索引中不包含主键

    2. Innodb

      主键当回表的key point用 类似Oracle的rowid

      所以这些特点导致Innodb pk不能太长

SQL语法

  • 聚合语法

    • group by 分组 分组之后的数据 每组只能出一行 特点1 去重 特点2 可以结合聚合函数使用(count, min, max, sum)

      开启完全group by形式之后 select后面的字段中不能出现非聚合函数包裹的字段否则会报错

    SELECT dept_no,emp_no,count(*),sum(dept_no) FROM t_group WHERE dept_no = 'd005' GROUP BY dept_no
    

    ​ 在完全group by形式下 上述语句会报错 不完全group by形式下是可以运行的

    ​ 通过set session sql_mode = ' '; 这个配置来控制

  • order by 对结果集进行升序和降序 默认asc

  • limit 最终返回数 主要用于分页

  • having 一般应用于group by之后对聚合的结果集上进行二次过滤

  • 标量子查询 指select和from之间使用的子查询 只能返回一行或者NULL 所以在子查询中加limit 1来避免

    SELECT t.*,(SELECT e.emp_no FROM employees e WHERE e.emp_no=t.emp_no) s FROM t_group t;
    
  • 多表查询

    • 笛卡尔积 JOIN join的本质就是形成笛卡尔积 然后按着连接条件进行过滤

    • between join 一般情况下不使用 但是特殊情况下会使用 主要运用在如下情况下 求出dept_no为d008的组的人员上班天数 主要用于计算剩余天数 统计人数


      betweenjoin1.png

      betweenjoin2.png
  • In 和exists的区别 区别在于半连接条件位置

    in可以去除重复值

    SELECT * FROM t_group t WHERE t.emo_no in (SELECT e.emp_no FROM employees e);
    
```mysql

SELECT * FROM t_group t WHERE EXISTS (SELECT e.emp_no FROM employees e WWHERE e.emp_no=t.emp_no);
```

Exists的过滤条件写在子查询中
  • not exists 表示查询不存在两个半连接交集的部分

    SELECT COUNT(1) FROM employees t WHERE NOT EXISTS (SELECT e.emp_no FROM t_group e WHERE e.emp_no = t.emp_no)
    
  • distinct 使用位置不同 优化效果也不同

    SELECT DISTINCT a.*,b.* FROM (
        SELECT 1 x,'a' a FROM dual UNION ALL
        SELECT 2, 'a' FROM dual UNION ALL
        SELECT 3, 'b' FROM dual 
    ) a
    JOIN
    (
        SELECT 1 b FROM dual UNION ALL
        SELECT 1 b FROM dual UNION ALL
        SELECT 2  FROM dual UNION ALL
        SELECT 2 FROM dual 
    ) b ON a.x=b.b
    
    SELECT a.*,b.* FROM (
        SELECT 1 x,'a' a FROM dual UNION ALL
        SELECT 2, 'a' FROM dual UNION ALL
        SELECT 3, 'b' FROM dual 
    ) a
    JOIN
    (
      SELECT DISTINCT b.b FROM
      (
        SELECT 1 b FROM dual UNION ALL
        SELECT 1 b FROM dual UNION ALL
        SELECT 2  FROM dual UNION ALL
        SELECT 2 FROM dual
       ) b
    ) b ON a.x=b.b
    

    上面的SQL是34 对12的结果集进行distinct 后者是对32的处理 所以聚合处理要提前

  • 创建fk(外键)的时候使用not exists查出依赖关系

    -- 查询重复行
    SELECT COUNT(1) FROM t_group t WHERE NOT EXISTS (SELECT 1 FROM employees e WHERE e.emp_no = t.emp_no);
    
    -- 删除重复行
    WITH t1 AS (SELECT DISTINCT t.emp_no FROM t_group t WHERE NOT EXISTS (SELECT 1 FROM employees e WHERE e.emp_no = t.emp_no))
    DELETE t_group FROM t_group,t1 WHERE t_group.emp_no=t1.emp_no;
    
  • 查询问题需要如下工具

    • SQL文本 执行计划
    • show create table,show table status
    • show variables like '%heap%'
    • show variables like '%tmp_table_size%'
    • show variables like '%innodb_buffer_pool_size%'
    • show variables like '%join%_size%'

你可能感兴趣的:(MySQL基础语法)