zoukankan      html  css  js  c++  java
  • 零散的MySQL基础总是记不住?看这一篇就够了!

    SQL命令

    SQL命令分可以分为四组:DDL、DML、DCL和TCL。四组中包含的命令分别如下

     DDL

    DDL是数据定义语言(Data Definition Language)的简称,它处理数据库schemas和描述数据应如何驻留在数据库中。

    • CREATE:创建数据库及其对象(如表,索引,视图,存储过程,函数和触发器)

    • ALTER:改变现有数据库的结构

    • DROP:从数据库中删除对象

    • TRUNCATE:从表中删除所有记录,包括为记录分配的所有空间都将被删除

    • COMMENT:添加注释

    • RENAME:重命名对象

    常用命令如下:

    # 建表
    CREATE TABLE sicimike  (
      id int(4) primary key auto_increment COMMENT '主键ID',
      name varchar(10) unique,
      age int(3) default 0,
      identity_card varchar(18)
      # PRIMARY KEY (id) // 也可以通过这种方式设置主键
      # UNIQUE KEY (name) // 也可以通过这种方式设置唯一键
      # key/index (identity_card, col1...) // 也可以通过这种方式创建索引
    ) ENGINE = InnoDB;
    
    # 设置主键
    alter table sicimike add primary key(id);
    
    # 删除主键
    alter table sicimike drop primary key;
    
    # 设置唯一键
    alter table sicimike add unique key(column_name);
    
    # 删除唯一键
    alter table sicimike drop index column_name;
    
    # 创建索引
    alter table sicimike add [unique/fulltext/spatial] index/key index_name (identity_card[(len)] [asc/desc])[using btree/hash]
    create [unique/fulltext/spatial] index index_name on sicimike(identity_card[(len)] [asc/desc])[using btree/hash]
    example: alter table sicimike add index idx_na(name, age);
    
    # 删除索引
    alter table sicimike drop key/index identity_card;
    drop index index_name on sicimike;
    
    # 查看索引
    show index from sicimike;
    
    # 查看列
    desc sicimike;
    
    # 新增列
    alter table sicimike add column column_name varchar(30);
    
    # 删除列
    alter table sicimike drop column column_name;
    
    # 修改列名
    alter table sicimike change column_name new_name varchar(30);
    
    # 修改列属性
    alter table sicimike modify column_name varchar(22);
    
    # 查看建表信息
    show create table sicimike;
    
    # 添加表注释
    alter table sicimike comment '表注释';
    
    # 添加字段注释
    alter table sicimike modify column column_name varchar(10) comment '姓名';

    DML

    DML是数据操纵语言(Data Manipulation Language)的简称,包括最常见的SQL语句,例如SELECTINSERTUPDATEDELETE等,它用于存储,修改,检索和删除数据库中的数据。

    分页

    -- 查询从第11条数据开始的连续5条数据
    select * from sicimike limit 10, 5

    group by

    默认情况下,MySQL中的分组(group by)语句,不要求select返回的列,必须是分组的列或者是一个聚合函数。

    如果select查询的列不是分组的列,也不是聚合函数,则会返回该分组中第一条记录的数据。对比下面两条SQL语句,第二条SQL语句中,cname既不是分组的列,也不是以聚合函数的形式出现。所以在liming这个分组中,cname取的是第一条数据。

    mysql> select * from c;
    +-----+-------+----------+
    | CNO | CNAME | CTEACHER |
    +-----+-------+----------+
    |   1 | 数学  | liming   |
    |   2 | 语文  | liming   |
    |   3 | 历史  | xueyou   |
    |   4 | 物理  | guorong  |
    |   5 | 化学  | liming   |
    +-----+-------+----------+
    5 rows in set (0.00 sec)
    
    mysql> select cteacher, count(cteacher), cname from c group by cteacher;
    +----------+-----------------+-------+
    | cteacher | count(cteacher) | cname |
    +----------+-----------------+-------+
    | guorong  |               1 | 物理  |
    | liming   |               3 | 数学  |
    | xueyou   |               1 | 历史  |
    +----------+-----------------+-------+
    3 rows in set (0.00 sec)

    having

    having关键字用于对分组后的数据进行筛选,功能相当于分组之前的where,不过要求更严格。过滤条件要么是一个聚合函数( ... having count(x) > 1),要么是出现在select后面的列(select col1, col2 ... group by x having col1 > 1)

    多表更新

    update tableA a inner join tableB b on a.xxx = b.xxx set a.col1 = xxx, b.col1 = xxx where ...
    多表删除
    delete a, b from tableA a inner join tableB b on a.xxx = b.xxx where a.col1 = xxx and b.col1 = xxx

    DCL

    DCL是数据控制语言(Data Control Language)的简称,它包含诸如GRANT之类的命令,并且主要涉及数据库系统的权限,权限和其他控件。

    • GRANT :允许用户访问数据库的权限

    • REVOKE:撤消用户使用GRANT命令赋予的访问权限

    TCL

    TCL是事务控制语言(Transaction Control Language)的简称,用于处理数据库中的事务

    • COMMIT:提交事务

    • ROLLBACK:在发生任何错误的情况下回滚事务

    横表纵表

    SQL脚本

    # 横表
    CREATE TABLE `table_h2z` (
    `name` varchar(32) DEFAULT NULL,
    `chinese` int(11) DEFAULT NULL,
    `math` int(11) DEFAULT NULL,
    `english` int(11) DEFAULT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    
    /*Data for the table `table_h2z` */
    insert  into `table_h2z`(`name`,`chinese`,`math`,`english`) values 
    ('mike',45,43,87),
    ('lily',53,64,88),
    ('lucy',57,75,75);
    
    # 纵表
    CREATE TABLE `table_z2h` (
      `name` varchar(32) DEFAULT NULL,
      `subject` varchar(8) NOT NULL DEFAULT '',
      `score` int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    /*Data for the table `table_z2h` */
    insert  into `table_z2h`(`name`,`subject`,`score`) values 
    ('mike','chinese',45),
    ('lily','chinese',53),
    ('lucy','chinese',57),
    ('mike','math',43),
    ('lily','math',64),
    ('lucy','math',75),
    ('mike','english',87),
    ('lily','english',88),
    ('lucy','english',75);

    横表转纵表

    SELECT NAME, 'chinese' AS `subject`,  chinese AS `score` FROM table_h2z
    UNION ALL
    SELECT NAME, 'math' AS `subject`,  math AS `score` FROM table_h2z
    UNION ALL
    SELECT NAME, 'english' AS `subject`, english AS `score` FROM table_h2z

    执行结果

    +------+---------+-------+
    | name | subject | score |
    +------+---------+-------+
    | mike | chinese |    45 |
    | lily | chinese |    53 |
    | lucy | chinese |    57 |
    | mike | math    |    43 |
    | lily | math    |    64 |
    | lucy | math    |    75 |
    | mike | english |    87 |
    | lily | english |    88 |
    | lucy | english |    75 |
    +------+---------+-------+
    9 rows in set (0.00 sec)

    纵表转横表

    SELECT NAME,
     SUM(CASE `subject` WHEN 'chinese' THEN score ELSE 0 END) AS chinese,
     SUM(CASE `subject` WHEN 'math' THEN score ELSE 0 END) AS math,
     SUM(CASE `subject` WHEN 'english' THEN score ELSE 0 END) AS english
    FROM table_z2h
    GROUP BY NAME

    执行结果

    +------+---------+------+---------+
    | name | chinese | math | english |
    +------+---------+------+---------+
    | lily |      53 |   64 |      88 |
    | lucy |      57 |   75 |      75 |
    | mike |      45 |   43 |      87 |
    +------+---------+------+---------+
    3 rows in set (0.00 sec)

     https://zhuanlan.zhihu.com/p/256993352

    故乡明
  • 相关阅读:
    Javascript高性能编程-提高Dom访问速度
    获取在线人数
    js倒计时
    支付宝支付
    微信扫码支付
    多条sql语句实现事物处理
    防止页面重复刷新
    bootstrapTable.js 使用
    org_chart.js 使用方法
    js上传图片及时显示
  • 原文地址:https://www.cnblogs.com/luweiweicode/p/14207193.html
Copyright © 2011-2022 走看看