这一篇文章是我在学习Python GUI开发过程中,作为前置知识而总结的知识指南,适合入门学习,对MySQL的操作有一个大体的理解,后续的学习还需要读者多多查阅,希望这一篇文章能对你们有帮助!
The official way to pronounce “MySQL” is “My Ess Que Ell” (not “my sequel”),
MySQL的官方称呼是My-Ess-Que-Ell(不是My-Sequel)
but we do not mind if you pronounce it as “my sequel” or in some other localized way.
但是我们不介意你怎么称呼它
——来自MySQL官方开发手册
在学习MySQL之前就听过很多次它的名字,但是每个人的念法都不一样,我找到了官方对它的发音解释,在这里和各位分享一下,下面是正文。
SQL 是一种操作数据库的语言,包括创建数据库、删除数据库、查询记录、修改记录、添加字段等。SQL 虽然是一种被 ANSI 标准化的语言,但是它有很多不同的实现版本
SQL 是关系型数据库的标准语言,所有的关系型数据库管理系统,比如 MySQL、Oracle、SQL Server、MS Access、Sybase、Informix、Postgres 等,都将 SQL 作为其标准处理语言
从 https://dev.mysql.com/downloads/windows/installer/ 下载Windows版的MySQL安装程序,选择Server Only安装模式,按照提示完成安装,配置环境变量。
启动指令:
net start mysql80
(默认情况,且安装版本为8.0)mysql -h localhost -u root -p123456 -Dtest -P3006
(分别指定数据库IP、用户名、密码、数据库名)创建数据库指令:create database 数据库名;
数据库命名规则:
1. 不可与其他数据库重名
2. 名称可以是字母、阿拉伯数字、下划线等组成,可以用这些类型的任意字符开头,但是不可以生成纯数字命名数据库,会造成数值混淆
3. 库、表、列、索引的命名最多为64个字符,别名最多为256个字符
4. 不可使用关键词作为库名、表名
5. 默认情况下Windows环境中MySQL的库、表名不对大小写敏感,而Linux环境中对大小写敏感,建议以小写命名数据库
Tips: MySQL关键字不区分大小写, CREATE 与 create 是相同的
查询数据库列表指令:show databases;
删除数据库指令:drop database 数据库名;
删除数据库是不可逆转操作,除非有数据库备份,否则没有办法恢复
创建数据表指令:create [TEMPORARY] table [IF NOT EXIST] 数据表名 [(create_definition,...)][table_options][select_statement]
关键字 | 说明 |
---|---|
TEMPORARY | 如果使用这个关键字,则创建一个临时表 |
IF NOT EXIST | 用于避免表格存在时MySQL报错的情况 |
create_definition | 有关表格的列属性部分定义参数 |
table_options | 定义数据表特性 |
select_statement | SELECT语句描述部分,可以快速建表 |
表格列属性定义的指令:col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition]
参数 | 说明 |
---|---|
col_name | 字段名 |
type | 字段类型 |
[NOT NULL] | 是否接受空值,默认允许空值 |
[NULL] | 当不允许存在空值时,需要显性声明NOT NULL |
[DEFAULT default_value] | 默认值 |
[AUTO_INCREMENT] | 是否自动编号,每张表只能存在一个自增字段,且必须被索引 |
[PRIMARY KEY] | 是否为主键,每张表只能存在一个主键。如果存在程序需要主键,但表中没有定义主键的情况,则返回第一个没有任何NULL列的UNIQUE的键作为主键 |
[reference_definition] | 注释 |
在MySQL中数字0与空格都不是空值,只有NULL是空值
创建数据表示例:create table th_users (id int(8) auto_increment primary key, username varchar(255) not null, passwd varchar(255) not null, time DATETIME);
查看数据表指令:show columns;
或 describe(可以缩写为desc) 数据表名;
语法格式:show [full] columns from 数据库名.数据表名;
修改表结构指令:alter [IGNORE] table 数据表名 alter_spec[,alter_spec]..
如果指定了IGNORE参数时,在出现重复的行时,只执行一行,删除其他重复行
上述指令中alter_spec是子句,用于定义要修改的内容:
ADD [COLUMN] create_definition [FIRST | AFTER column_name ] 增加新的字段
ADD INDEX [index_name] (index_col_name, ...) 增加新的索引
ADD PRIMARY KEY (index_col_name, ...) 增加主键名称
ADD UNIQUE [index_name] (index_col_name, ...) 增加唯一索引
ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} 修改字段名称
CHANGE [COLUMN] old_col_name create_definition 修改字段类型
MODIFY [COLUMN] create_definition 修改子句定义字段
DROP [COLUMN] col_name 修改字段名称
DROP PRIMARY KEY 删除主键名称
DROP INDEX index_name 删除索引名称
RENAME [AS] new_tbl_name 更改表名
alter table th_users add address varchar(128) modify username varchar(128);
删除数据表指令:drop table 数据表名;
如果直接输入删除指令,可能会返回数据表不存在错误,可使用drop table if exists 数据表名;
数据表的每个字段都必须指定一个数据类型,MySQL支持三类数据类型:数字类型、字符串类型、日期与时间类型
一般来说,数字类型可以划分为整数以及浮点型两个类型:
数据类型 | 取值范围 | 说明 | 单位 |
---|---|---|---|
TINYINT | -127~128 | 最小整数 | 1字节 |
BIT | -127~128 | 最小整数 | 1字节 |
BOOL | -127~128 | 最小整数 | 1字节 |
SMALLINT | -32768~32767 | 小整数 | 2字节 |
MEDIUMINT | -8388608~8388607 | 中整数 | 3字节 |
INT | -2.14E9~2.14E9-1 | 标准整数 | 4字节 |
BIGINT | -2E63~2E63-1 | 大整数 | 8字节 |
注意:MySQL 并不真正支持 BOOL 类型,BOOL 是 TINYINT(1) 的别名
数据类型 | 取值范围 | 说明 | 单位 |
---|---|---|---|
FLOAT(size, d) | – | 单精度浮点数 | 4字节或8字节 |
DOUBLE(size, d) | – | 双精度浮点数 | 8字节 |
DECIMAL(size, d) | 可变 | 一般整数 | 可变字节 |
size 参数用来指定数字的总个数,d 参数用来指定小数部分(小数点后边)的数字个数
单精度float精度约十进制7位,取值范围10的正负约38次方
双精度double有效位约十进制15位,取值范围10的正负308次方
注意事项:
字符串可以分为三类:文本字符串类型(CHAR和VARCHAR)、可变类型(TEXT和BLOB)、特殊类型(SET和ENUM)
CHAR类型的长度在创建时确定,VARCHAR类似于它,但长度可变
数据类型 | 取值范围 | 说明 |
---|---|---|
CHAR(M) | 0-255字符 | 固定长度为M的字符串,取值范围0~255 |
CHAR | 0-255字符 | 类似CHAR(M) |
VARCHAR(M) | 0-255字符 | 类似CHAR(M),长度可变 |
char和varchar:
二进制数据BLOB
数据类型 | 最大取值 | 说明 |
---|---|---|
SET(‘value1’, ‘value2’,…) | 54 | 可以存一组值,最大可达64个不同的值 |
ENUM(‘value1’, ‘value2’,…) | 65535 | 最大可达65535个不同的枚举值 |
数据类型 | 最大取值 | 说明 |
---|---|---|
DATE | 1000-01-01~9999-12-31 | 日期 |
TIME | -838:58:59~836:59:59 | 时间 |
DATETIME | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 日期与时间 |
DATETIME | 1970-01-01 00:00:00起 | 时间标签 |
YEAR | 1901~2155 | 可以是两位或四位 |
在创建表时,使用哪种字符串类型,应遵循以下原则:
增加数据的指令:insert into 数据表名(column_name1, column_name2,...) values(value1, value2,...);
提示:值的数据类型和字段的数据类型需要相互对应
查询数据的指令格式:select list from 数据表名 where condition;
list是要查找的列名,如果要查询多个列用逗号相隔,查询所有列则用星号表示,where子句后的condition用来限制查询条件
例如select * from th_users;
代表查询th_users表中所有数据;又例如select * from th_users where name='TAHDER';
代表查询th_users表中所有数据里name列中值为TAHDER的数据
进阶查询操作子句的用法:
示例:select avg(price),type from th_books group by type;
示例:select * from th_users order by id desc;
示例:select avg(price),type from th_books group by type having avg(price)>60;
示例:select * from th_users where username like('%TA%') limit 1;
示例:select distinct from th_users;
*
)则统计所有记录update 数据表名 set column1_name='new_value1',column2_name='new_value2' where condition;
delete from 数据表名 where condition;
RENAME old_table _name TO new_table_name;
或者 ALTER TABLE old_table_name RENAME TO new_table_name;
主键(Primary Key)由表中的一个或者多个字段构成,用来唯一标识表中的每一行记录。可以将主键类比为学号、身份证号、车牌号或者 ID
主键必须包含唯一值,换句话说,所有记录的主键都不能出现相同的值。此外,主键必须是一个具体的值,不能是 NULL 值
当主键包含多个字段时,又称为复合键(Composite Primary Key)
SQL 规定,主键长度不能超过 900 个字节
建表时一并设定主键指令示例:CREATE TABLE website ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, url VARCHAR(30), age TINYINT UNSIGNED NOT NULL, alexa INT UNSIGNED NOT NULL, uv FLOAT DEFAULT '0', country CHAR(3) NOT NULL , PRIMARY KEY (id) );
如果是为已存在的表设计主键则为:ALTER TABLE website ADD PRIMARY KEY (id);
删除主键:ALTER TABLE website DROP PRIMARY KEY;
SQL 外键(Foreign Key)用于将两个表连接在一起,让两个表的数据保持同步
外键由表中的一个字段或者多个字段构成,一个表的外键用来指向另一个表的主键(Primary Key)
包含外键的表称为从表,被指向的表称为主表
从表的数据受到主表的约束,向从表中插入或者更新数据时,外键的值必须存在于主表的主键中
对外键约束的几点说明:
REFERENCES 主表名 (主表键)
ALTER TABLE 'order' ADD FOREIGN KEY (uid) REFERENCES user (id);
ALTER TABLE ‘order’ DROP FOREIGN KEY;
SQL注入(SQL injection),是发生于应用程序与数据库层的安全漏洞,可能会导致数据库中的数据被暴露,甚至被损坏
在网页输入框( 标签)
等输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵
例子:
我搭建的网页提供用户查询功能,但是需要提供员工ID才返回查询数据,但是我的程序没有对输入内容做校验,执行的查询语句为:SELECT * FROM employee WHERE id = $input;
这是有人在输入框里输入了10086 or 0=0,那么最终执行的语句为:SELECT * FROM employee WHERE id = $input or 0=0;
这个语句将会返回emploee数据表中的所有数据,导致信息的泄露