MySQL入门笔记(一)

MySQL入门笔记(二)

设计二个层次鲜明的目录结构,就是为着达到那两点:

一 、数据类型

  1. 可读性高:不熟悉项指标人,一眼就能看懂目录结构。
  2. 可维护性高:随着时间的推迟,代码/配置的框框追加,项目组织不会混杂,照旧可以组织非凡。

1. 整型

起名 1

目录组织章程:

2. 浮点型

起名 2

ATM
├── bin
│   └── start.py
├── conf
│   └── settings.py
├── core
│   └── test_main.py
├── db
│   └── db.json
├── docs
├── lib
│   └── common.py
├── log
│   └── access.log
└── README

3. 字符型

起名 3

简不难单解释一下:

4. 日期时间型

起名 4

  1. bin :存放项目标一对可执行文件,当然你可以起名script/之类的也行。
  2. conf :配置文件目录
  3. core:大旨代码目录
  4. db:数据目录
  5. docs :存放一些表明文书档案。
  6. lib:库文件,存放一些自定义模块和包
  7. log:日志目录
  8. README 安装表达

② 、数据库操作

关于README的内容:

1. 创建库

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name;

  上述代码中DATABASE和SCHEMA完全相同,可任选1个(花括号内的参数为任选其一);

  添加IF NOT
EXISTS的意义则是,若新建数据库的名称与已有数据库名称争执,则发出七个警示,若无该重庆大学字,则会产生错误(中括号内的参数为可粗略参数);

  db_name为数据库名称;

  [DEFAULT] CHARACTER SET [=]
为钦赐数据库的字符编码,可不内定而利用暗许的字符编码。

  例1:创设一个名为test的数据库

CREATE DATABASE test;

  例2:成立三个名为test2的数据库并钦命字符编码为GBK

CREATE DATABASE test2 CHARACTER SET gbk;

  有少数亟待小心的是,这一步骤仅仅是开创了数据库,在前面必要创立数量表时,要求开辟钦命数据库:

USE db_name;

README的功能是描述该类型的音信,让读者非常的慢领会这一个类型。
它须要验证以下多少个事项:

2. 删除库

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;

  参数与成立数据库基本一致。

  1. 软件定位,软件的基本作用。
  2. 运转代码的法门:安装环境、运转命令等。
  3. 简单易行的采用验证。
  4. 代码目录结构表明,更详细点能够评释软件的基本原理。
  5. 常见难题求证。

3. 修改库

ALTER {DATABASE | SCHEMA} [db_name] [DEFAULT] CHARACTER SET [=] charset_name;

  可修改的仅为字符编码情势。若不点名数据库名称,则修改当前当选的数据库。例:将名为test的数据库的字符编码格局改为utf-8

ALTER DATABASE test CHARACTER SET utf8;

关于requirements.txt和setup.py

4. 查看库

起名 5起名 6

4.1 查看当前全数库

SHOW DATABASES;
一般来说,用setup.py来管理代码的打包、安装、部署问题。业界标准的写法是用Python流行的打包工具setuptools来管理这些事情。这种方式普遍应用于开源项目中。不过这里的核心思想不是用标准化的工具来解决这些问题,而是说,一个项目一定要有一个安装部署工具,能快速便捷的在一台新机器上将环境装好、代码部署好和将程序运行起来。
这个我是踩过坑的。
我刚开始接触Python写项目的时候,安装环境、部署代码、运行程序这个过程全是手动完成,遇到过以下问题:
1、安装环境时经常忘了最近又添加了一个新的Python包,结果一到线上运行,程序就出错了。
2、Python包的版本依赖问题,有时候我们程序中使用的是一个版本的Python包,但是官方的已经是最新的包了,通过手动安装就可能装错了。
3、如果依赖的包很多的话,一个一个安装这些依赖是很费时的事情。
4、新同学开始写项目的时候,将程序跑起来非常麻烦,因为可能经常忘了要怎么安装各种依赖。
setup.py可以将这些事情自动化起来,提高效率、减少出错的概率。"复杂的东西自动化,能自动化的东西一定要自动化。"是一个非常好的习惯。
setuptools的文档比较庞大,刚接触的话,可能不太好找到切入点。学习技术的方式就是看他人是怎么用的,可以参考一下Python的一个Web框架,flask是如何写的: setup.py
当然,简单点自己写个安装脚本(deploy.sh)替代setup.py也未尝不可。

4.2 查看内定数据库的创建新闻

SHOW CREATE DATABASE db_name;

setup.py说明

4.3 查看当前开拓的数据库

SELECT DATABASE();

起名 7起名 8

③ 、数据表操作

这个文件存在的目的是:
1、方便开发者维护软件的包依赖。将开发过程中新增的包添加进这个列表中,避免在setup.py安装依赖时漏掉软件包。
2、方便读者明确项目使用了哪些Python包。
这个文件的格式是每一行包含一个包依赖的说明,通常是flask>=0.10这种格式,要求是这个格式能被pip识别,这样就可以简单的通过 pip install -r requirements.txt来把所有Python包依赖都装好了。

1. 创制表(各个束缚)

requirements.txt说明

1.1 定义

CREATE TABLE [IF NOT EXISTS] table_name(
    column_name data_type [constraint],
    ···
);

  constraint为束缚,可选参数。(详情见1.2
约束)例:创制三个称号为t1,蕴含id、username以及age三个字段的数据表

CREATE TABLE t1(
    id SMALLINT UNSIGNED,
    username VARCHAR(20),
    age TINYINT UNSIGNED
);

有关配置文件的选取办法:

1.2 约束

  约束,顾名思义,即对某个列或任何表发生约束、限制,增添输入规则,例如某个列不容许为空、有个别列不容许再次等。依照职能划分,有以下三种:

起名 9起名 10

(1)主键约束

PRIMARY KEY

  主键约束用于唯一地方统一标准识表中的每一条记下,通俗地说,就是加了主键约束的列大概表,不容许存在重复的笔录。==添加了主键约束的列自动为NOT
NULL。==

  例:某表中存在一列用于存款和储蓄用户名,用主键约束限制其不可能存在重复的用户名

username VARCHAR(20) PRIMARY KEY

  ==自动编号:==

AUTO_INCREMENT

  顾名思义,即自行编号,序号从1上马。要求留意,AUTO_INCREMENT必须与主键约束配套使用。

  例:

id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT
1、配置文件写在一个或多个python文件中,比如此处的conf.py。
2、项目中哪个模块用到这个配置文件就直接通过import conf这种形式来在代码中使用配置。
这种做法我不太赞同:
1、这让单元测试变得困难(因为模块内部依赖了外部配置)
2、另一方面配置文件作为用户控制程序的接口,应当可以由用户自由指定该文件的路径。
3、程序组件可复用性太差,因为这种贯穿所有模块的代码硬编码方式,使得大部分模块都依赖conf.py这个文件。
所以,我认为配置的使用,更好的方式是,
1、模块的配置都是可以灵活配置的,不受外部配置文件的影响。
2、程序的配置也是可以灵活控制的。
能够佐证这个思想的是,用过nginx和mysql的同学都知道,nginx、mysql这些程序都可以自由的指定用户配置。
所以,不应当在代码中直接import conf来使用配置文件。上面目录结构中的conf.py,是给出的一个配置样例,不是在写死在程序中直接引用的配置文件。可以通过给main.py启动参数指定配置路径的方式来让程序读取配置内容。当然,这里的conf.py你可以换个类似的名字,比如settings.py。或者你也可以使用其他格式的内容来编写配置文件,比如settings.yaml之类的。

(2)唯一约束

UNIQUE KEY

  唯一约束与主键约束服从一样,也用于标识记录的唯一性,差异之处在于,同一个数据表中可存在八个唯一约束,但主键约束只可以存在二个。其余,主键约束分化意为空,唯一约束则允许存在唯一的NULL值。

安插文件注明

(3)非空约束

NOT NULL

  非空约束的用来禁止用户在非空约束的列中输入NULL。

 

(4)暗中同意约束

DEFAULT value

  用于安装字段的私下认可值,当用户未输入当前字段时,将自动填入私下认可值。

  例:定义二个sex字段,默许景况下为3

sex ENUM('1', '2', '3') DEFAULT 3

至于作业:

(5)外键约束

FOREIGN KEY(column_name1) REFERENCES table_name(column_name2)

  外键约束一般用于八个设有某种关联的字段,实现一对一或一对多的涉嫌。

  例1:成立2个父表location和二个子表users,通过外键约束关联location中的id与users中的lid

CREATE TABLE location(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL
);

CREATE TABLE users(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20) NOT NULL,
    lid SMALLINT UNSIGNED,
    FOREIGN KEY(lid) REFERENCES location(id)
);

  使用外键约束需求留意一些难点,第三,父表和子表禁止行使权且表;第3,父表和子表必须选用同样的积存引擎,且务必为InnoDB;第二,外键列与参照列必须具备相似的数据类型,在那之中若为==数字==(INT、FLOAT等),则其==类型长度和是或不是有号子位都无法不完全一样==,若为==字符==,则可为==分歧长短==;第⑥,向子表插入记录时,需保障父表不为空。

外键约束的参照操作:

  钦定当删除或更新父表中的记录时,对子表进行的操作。使用格局为在外键约束末尾加上ON DELETE,然后加上相应操作的显要字。操作分别有以下三种:

  1)CASCADE:当删除或更新父表中的记录时,自动更新或删除子表中相应的笔录。

  2)SET NULL:当删除或更新父表中的记录时,将子表中相应的笔录的外键列设置为NULL。==注意,需保障改外键列没有点名为NOT
NULL。==

  3)RESTRICT:当父表中的记录被子表中的记录所参照时,那一个被参照的笔录不容许进行删除或更新操作,而未被参照的笔录则可随机删除或更新。

  例:

  父表:

id(参照列) name
1 A
2 B
3 C

  子表:

name aid(外键列)
a 1
b 1
c 2

  在上边这种气象中,若子表的外键约束加了RESTRICT重点字,则由于父表中id为1和2的两条记下被参照,无法被删去或更新;而id为3的记录未被参照,因而能够去除或更新。

  4)NO ACTION:标准SQL中的关键字,在MySQL中平等REST宝马7系ICT。

学业必备知识:

2. 删除表

DROP TABLE tbl_name;
  1. 模块导入
  2. 目录社团结构
  3. 函数
  4. 其三方模块(种类化、logging)
  5. 装饰器
  6. 应用面向进程开发(ATM程序是不常常改变得程序)

3. 更改表名称

软件开发流程:

3.1 更改单个数据表名称

ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name;
  1. 画流程图
  2. 写README
  3. 残忍根据软件开发规范去开发顺序

3.2 更改多少个数据表名称

RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ……

学业供给:

4. 查看表

依傍完结一个ATM + 购物商城先后

4.1 查看数据库内部存款和储蓄器在的表

SHOW TABLES [FROM db_name];
  1. 额度 1五千或自定义
  2. 贯彻购物商城,买东西参预 购物车,调用信用卡接口结账
  3. 能够提现,手续费5%
  4. 每月22号出账单,每月10号为还款日,过期未还,按欠款总额
    极度之5 天天计算利息
  5. 支撑多账户登录
  6. 支撑账户间转账
  7. 笔录每月一般消费流水
  8. 提供还款接口
  9. ATM记录操作日志 
  10. 提供管理接口,包涵丰硕账户、用户额度,冻结账户等。。。
  11. 用户认证用装饰器

4.2 查看表的制造新闻(存款和储蓄引擎、编码情势等)

SHOW CREATE TABLE table_name;

演示代码 https://github.com/triaquae/py3\_training/tree/master/atm 

4.3 查看表结构

SHOW COLUMNS FROM table_name;

简单流程图:https://www.processon.com/view/link/589eb841e4b0999184934329 

5. 列操作

 

5.1 添加列

参考链接:http://www.cnblogs.com/alex3714/articles/5765046.html

(1)添加单列

ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name2];

  关键字COLUMN可不加;FIRST的法力是将扩充列置于内定表的最前方,AFTER col_name2则是将追加列置于col_name2的下一列。

  例:存在一表test,含有id字段,以往id字段的下一列扩充三个name字段

ALTER TABLE test ADD name VARCHAR(20) NOT NULL AFTER id;

(2)添加多列

ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition, ……)

  添加多列时四个字段写进小括号内,以逗号相隔,添加多列与添加单列的不相同之处在于添加多列不能够钦点添加地点,而是私下认可添加到数据表的最终。

5.2 删除列

ALTER TABLE tbl_name DROP [COLUMN] col_name;

  如需同时删除多列,则调用多次DROP。

  例:存在表test,含有password、sex字段,现与此同时删除那八个字段

ALTER TABLE test DROP password, DROP sex;

5.3 修改列定义

(1)MODIFY

ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name];

  MODIFY可用于修改列定义以及列地方。例:存在以下数据表t2,

+-------+----------------------+------+-----+---------+-------+
| Field | Type                 | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| id    | smallint(5) unsigned | NO   |     | NULL    |       |
| name  | varchar(20)          | YES  | MUL | NULL    |       |
| age   | tinyint(4)           | YES  | UNI | NULL    |       |
| sex   | enum('1','2','3')    | YES  |     | NULL    |       |
| aid   | smallint(5) unsigned | YES  | MUL | NULL    |       |
+-------+----------------------+------+-----+---------+-------+

  现将id字段移至name字段下一列,操作为:

ALTER TABLE t2 MODIFY id SMALLINT UNSIGNED NOT NULL AFTER name;

起名,  再将id字段的数据类型改为INT,操作为:

ALTER TABLE t2 MODIFY id INT UNSIGNED NOT NULL;

  也能够将两步操作同时举行:

ALTER TABLE t2 MODIFY id INT UNSIGNED NOT NULL AFTER name;

  (2)CHANGE

ALTER TABLE tbl_name CHANE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name];

  CHANGE与MODIFY基本一致,分歧之处在于CHANGE可修改列名称而MODIFY不得以。

5.4 添加约束

  考虑到入门级其余读者大多未读书索引,由此对约束的操作中关系到目录的有的全体刨除,仅介绍最基本的用法,供给商量完整意义的读者可自动检索有关资料。

(1)主键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY (col_name)

  symbol为束缚的记号或外号,自行定义。例:为表test中的id字段添加主键约束并起名为PK_test_id

ALTER TABLE test ADD CONSTRAINT PK_test_id PRIMARY KEY (id);

(2)唯一约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE (col_name, ……);

  添加唯一约束的措施与主键约束基本一致,区别之处在于唯一约束可同时加上八个,而主键约束只可以有贰个。

(3)暗中认可约束

ALTER TABLE tbl_name ALTER [COLUMN] col_name SET DEFAULT literal;

  literal为默许值。例:为表test中的age字段设置暗中同意值为18

ALTER TABLE test ALTER age SET DEFAULT 15;

(4)外键约束

ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY (col_name) reference_definition;

  例:为表test中的aid字段添加外键约束,参照列为表test第22中学的id字段

ALTER TABLE test ADD FOREIGN KEY(aid) REFERENCES test2(id); 

5.5 删除约束

(1)主键约束

ALTER TABLE tbl_name DROP PRIMARY KEY;

(2)唯一约束

ALTER TABLE tbl_name DROP {INDEX | KEY} index_name;

  花括号内的INDEX和KEY任选这么些。注意,在那里不可不利用要删减的自律所在字段的==索引==而不是字段名称,查看索引可利用命令SHOW INDEXES FROM tbl_name\G(\G是内定结果以网格方式出口,可不加),输出结果中的Key_name即为索引名称。

*************************** 1. row ***************************
    Table: t2
    Non_unique: 0
    Key_name: name
    Seq_in_index: 1
    Column_name: name
    Collation: A
    Cardinality: 0
    Sub_part: NULL
    Packed: NULL
    Null: YES
    Index_type: BTREE
    Comment:
    Index_comment:

  例如地点这一字段的目录名称即为name。

(3)暗中同意约束

ALTER TABLE tbl_name ALTER [COLUMN] col_name DROP DEFAULT;
(4)外键约束
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;

  删除外键约束不需求钦定列,但必须输入外键的符号fk_symbol,查看外键标记可采纳命令SHOW CREATE TABLE tbl_name,即查看数据表的成立消息。

| t2    | CREATE TABLE `t2` (
  `id` smallint(5) unsigned NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `age` tinyint(4) DEFAULT NULL,
  `sex` enum('1','2','3'),
  `aid` smallint(5) unsigned DEFAULT NULL,
  UNIQUE KEY `name` (`name`,`age`),
  UNIQUE KEY `age` (`age`),
  UNIQUE KEY `age_2` (`age`),
  KEY `aid` (`aid`),
  CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`aid`) REFERENCES `t1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

  例如,上边这一数额表t第22中学,aid为外键列,因此找到呼应的外键标记,为t2_ibfk_1,所以删除这一外键约束的操作为:

ALTER TABLE t2 DROP FOREIGN KEY t2_ibfk_1;

④ 、记录操作

1. 添加记录

1.1 INSERT

INSERT [INTO] tbl_name [(col_name,···)] {VALUES | VALUE} ({expr | DEFAULT}, ...), (...), ...;

  添加记录可不内定列,那种气象下必须逐一输入当前记录全体字段的多寡;若要求仅输入在这之中一些字段的值,则在表名后内定相应的列名称;{expr
|
DEFAULT}的情趣为,能够从来输入相应的值,也足以输入表明式;其它,使用INSECRUISERT语句插入记录可同时插入多条记下。

  例:向二个名为test,含有id、username、age多个字段的表中插入一条记下:

INSERT test VALUES(DEFAULT, 'Kity', 16+2);

  若仅输入username、age:

INSERT test(username, age) VALUES('Kity', 18);

  若同时插入两条记下:

INSERT test(username, age) VALUES('Kity', 18), ('Smith', 26);

1.2 INSERT-SET

INSERT [INTO] tbl_name SET col_name = {expr | DEFAULT}, ...;

  那种艺术与第3种形式的区分在于,那种情势能用于子查询,同时那种方法每回只能输入一条记下。

1.3 INSERT-SELECT

INSERT [INTO] tbl_name [(col_name, ...)] SELECT ...

  这种形式的功能是将SELECT(若对SELECT的语法不亮堂,可先看前边的4.询问记录)的询问结果插入到钦定数量表中(实际上利用了子查询,不驾驭的读者可查看MySQL入门笔记(二)),要求小心,查询的字段数量必须与插入的字段数量相匹配,不然就会冒出谬误。

  例:将表t第11中学age大于30的记录的name、age字段插入到表t第22中学:

INSERT t2(username, age) SELECT name, age FROM t1 WHERE age > 30;

2. 去除记录

DELETE FROM tbl_name [WHERE where_condition]

  WHERE关键字为对立异记录的准绳(也正是Java中的if),若不加,则删除全数记下。

  例:删除表test中id为偶数的记录:

DELETE FROM test WHERE id % 2 = 0;

3. 更新记录(单表更新)

UPDATE [LOW_PRIORITY] [IGNORE] tbl_references SET col_name1 = {expr1 | DEFAULT} [, col_name2 = {expr2 | DEFAULT}] ... [WHERE where_condition];

  tbl_reference为表格名称。例1:更新表t第11中学的age字段,使其全部充实5:

UPDATE t1 SET age = age + 5;

  例2:使表t第22中学的age字段全体为0,sex字段(非枚举类型)全体取相反数:

UPDATE t2 SET age = 0, sex = -sex;

  例3:使表t3中id为2的一项name为John:

UPDATE t3 SET name = 'John' WHERE id = 2;

4. 查询记录

SELECT select_expr [, select_expr2 ...]
[
    FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | position} [ASC | DESC]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position} [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
];

4.1 SELECT select_expr [, select_expr2 …](最简易也非平常用的款型)

  例:查看数据库版本:

SELECT VERSION();

4.2 FROM table_references

  查询数据表中的钦赐列的笔录。例:查询表test中的全体字段的记录:

SELECT * FROM test;

  或仅查询个中的id、name字段==(顺序可根据需求自由调整)==:

SELECT id, name FROM test;

4.3 AS

  在查询表时,有时(例如单表模拟多表操作)会需求为字段赋予别称,这时就用到AS。

  例:查询表test中的id、username字段,并给username赋予外号name:

SELECT id, username AS name FROM test;

4.4 GROUP BY {col_name | position} [ASC | DESC]

  GROUP
BY用于对查询结果实行排序。能够钦命实行分组的列名称,也足以内定地点position,地方即SELECT语句询问的查询顺序,例如SELECT id, username FROM test;,在那里若输入地点为2,则对username字段进行分组;其它,还足以钦赐分组是的排列顺序,ASC为升序,DESC为降序。

  例:查询表test中的name、age字段,并依照age字段分组从大到小排列:

SELECT name, age FROM test GROUP BY age DESC;

4.5 [HAVING where_condition]

  HAVING用于安装分组条件,即限制举行分组的记录范围。==必要留意的是,若条件中用到表中的一点字段进行判断,那么所采纳的字段必须是在询问列表中的。==

  例:查询表test中的name、age字段,并将age>30的笔录举办分组:

SELECT name, age FROM test GROUP BY age HAVING age > 30;

4.6 ORDER BY {col_name | expr | position} [ASC | DESC], …

  OPAJERODER
BY用于对查询结果进行排序。若添加个尺码,则在率先尺码一致的气象下,相比第1标准化,以此类推。

  例:查询表test中的全体字段,并遵守age升序排列,若age相同,则依据id降序排列:

SELECT * FROM test ORDER BY age, id DESC;

4.7 LIMIT {[offset,] row_count | row_count OFFSET offset}

  LIMIT用于限制重返的询问结果的数据。offset为查询的源点,要留意,同大多数言语一样,==MySQL中首先条记下为0==;row_count则为查询结果的多寡。别的使用LIMIT语句实行限定时,==其依据的逐条是询问结果的逐条==,而不是数据表存款和储蓄的依次。

  例:查询表test中的全部字段,突显第叁到第⑥条记下:

SELECT * FROM test LIMIT 2, 3;

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图