关于intellij-idea:零散的MySQL基础总是记不住看这一篇如何拯救你

44次阅读

共计 5994 个字符,预计需要花费 15 分钟才能阅读完成。

前言

在日常开发中,一些不罕用且又比拟根底的常识,过了一段时间之后,总是容易遗记或者变得有点不置可否。本篇次要记录一些对于 MySQL 数据库比拟根底的常识,以便日后疾速查看。

SQL 命令

SQL 命令分能够分为四组:DDLDMLDCLTCL。四组中蕴含的命令别离如下

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 '姓名';
————————————————
版权申明:本文为 CSDN 博主「Sicimike」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。原文链接:https://blog.csdn.net/Baisitao_/article/details/104714764

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:在产生任何谬误的状况下回滚事务

范式

数据库规范化,又称正规化、标准化,是数据库设计的一系列原理和技术,以缩小数据库中数据冗余,增进数据的一致性。关系模型的发明者埃德加·科德最早提出这一概念,并于 1970 年代初定义了第一范式、第二范式和第三范式的概念,还与 Raymond F. Boyce 于 1974 年独特定义了第三范式的改良范式——BC 范式。
除外还包含针对多值依赖的第四范式,连贯依赖的第五范式、DK 范式和第六范式。

当初数据库设计 最多满足 3NF,普遍认为范式过高,尽管具备对数据关系更好的约束性,但也导致数据关系表减少而令数据库 IO 更易忙碌,原来交由数据库解决的关系束缚现更多在数据库应用程序中实现。

第一范式

定义:数据库中的所有 字段 (列)都是繁多属性, 不可再分 的。这个繁多属性由根本的数据类型所形成,如整型、浮点型、字符串等。
第一范式是为了保障列的原子性。

上表不满足第一范式,其中的地址列是能够再拆分的,能够拆分成省、市、区等

第二范式

定义:数据库中的表不存在非关键字段对任一关键字字段的 局部函数 依赖
局部函数依赖 是指存在着 组合关键字 中的某一关键字决定非关键字的状况
第二范式在满足了第一范式的根底上,打消非主键列对 联结主键 的局部依赖

下面这张表中想要设置主键,只能是 商品名称 供应商名称 一起组成联结主键。然而 价格 分类 只依赖于 商品名称 ,供应商电话只依赖于 供应商名称 ,所以下面的表不满足第二范式,能够改成如下模式:
商品信息表

供应商信息表

商品 - 供应商关联表

第三范式

定义:所有非主键属性都只和候选键有相关性,也就是说非主键属性之间应该是独立无关的。
第三范式是在满足了第二范式的根底上,打消列与列之间的 传递依赖

在下面的表中,商品的 分类形容 依赖 分类 ,而 分类 依赖 商品名称 ,而不是 分类形容 间接依赖 商品名称 。这样就造成了 传递依赖,所以不合乎第三范式。能够改成如下模式

商品表

商品分类表

数据库设计时,遵循范式和反范式始终以来是一个颇受争议的问题。遵循范式对数据关系更好的约束性,并且缩小数据冗余,能够更好地保证数据一致性。而反范式则是为了取得更好地性能。所以范式还是反范式并没有明确的规范,适宜本人业务场景的才是最好的。

反范式设计时,须要思考以下几个问题,别离是插入异样、更新异样和删除异常

  • 插入异样:如果某个实体随着另一个实体的存在而存在,即短少某个实体是无奈示意这个实体,那么这个表就存在插入异样。
  • 更新异样:如果更改表所对应的某个实体实例的独自属性时,须要将多行更新,那么就阐明这个表存在更新异样
  • 删除异常:如果删除表的某一行来示意某实体实例生效时,导致另一个不同实体实例信息失落,那么这个表就存在删除异常

以违反第二范式的表为例

如果可乐第二制造厂这个供应商尚未开始供货,表中就不存在第二条记录,也就无奈记录供应商的电话,这样就存在插入异样;如果须要把可乐的价格进步,须要更新表中的多条记录,这样就存在更新异样;如果删除可乐第二制造厂的供货信息,那么该供应商的电话也就失落了,这样就存在删除异常。

个别存在插入异样的表,都会存在更新异样和删除异常。

横表纵表

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://www.w3schools.in/mysq…

作者:Sicimike

起源:https://blog.csdn.net/Baisita…

本文首发于公众号:Java 版 web 我的项目,欢送关注获取更多精彩内容

正文完
 0