MySQL快速入门基础知识指南

这一篇文章是我在学习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之前就听过很多次它的名字,但是每个人的念法都不一样,我找到了官方对它的发音解释,在这里和各位分享一下,下面是正文。

MySQL数据库基础入门

SQL简述

SQL 是一种操作数据库的语言,包括创建数据库、删除数据库、查询记录、修改记录、添加字段等。SQL 虽然是一种被 ANSI 标准化的语言,但是它有很多不同的实现版本
SQL 是关系型数据库的标准语言,所有的关系型数据库管理系统,比如 MySQL、Oracle、SQL Server、MS Access、Sybase、Informix、Postgres 等,都将 SQL 作为其标准处理语言

它能做什么

  • SQL 面向数据库执行查询
  • SQL 可从数据库取回数据
  • SQL 可在数据库中插入新的记录
  • SQL 可更新数据库中的数据
  • SQL 可从数据库删除记录
  • SQL 可创建新数据库
  • SQL 可在数据库中创建新表
  • SQL 可在数据库中创建存储过程
  • SQL 可在数据库中创建视图
  • SQL 可以设置表、存储过程和视图的权限

命令类型

  1. DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP
  2. DML(Data Manipulation Language) 数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE
  3. DCL(Data Control Language) 数据控制语言,用来操作访问权限和安全级别; 常用语句:GRANT、DENY
  4. DQL(Data Query Language) 数据查询语言,用来查询数据 常用语句:SELECT

安装与启动

从 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]

create table语句参数声明

关键字 说明
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]

create_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_user数据表添加一个地址字段并修改用户名类型,则输入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次方
注意事项:

  • 根据实际用到的数据选择数据类型,如果要处理的数字不大于128,则应该使用TINYINT而不是BIGINT
  • 全数字情况下,可选择整数类型
  • 支付金额等情况下适用浮点数数据类型

字符串类型

字符串可以分为三类:文本字符串类型(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:

  1. char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
  2. char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),
    所以varchar(4),存入3个字符将占用4个字节。
  3. char类型的字符串检索速度要比varchar类型的快。
    varchar和text:
  4. varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
  5. text类型不能有默认值。
  6. varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

TEXT和BLOB类型

二进制数据BLOB

  1. BLOB和text存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写。
  2. _BLOB存储的数据只能整体读出。
  3. TEXT可以指定字符集,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 可以是两位或四位

在创建表时,使用哪种字符串类型,应遵循以下原则

  1. 从速度方面考虑,要选择固定的列,可以使用CHAR 类型
  2. 要节省空间,使用动态的列,可以使用 VARCHAR类型
  3. 要将列中的内容限制在一种选择,可以使用 ENUM 类型
  4. 允许在一个列中有多于一个的条目,可以使用SET 类型
  5. 如果要搜索的内容不区分大小写,可以使用 TEXT 类型
  6. 如果要搜索的内容区分大小写,可以使用BLOB类型
  7. 在指定数据类型的时候一般是采用从小原则,比如能用TINY INT的最好就不用INT,能用FLOAT类型的就不用DOUBLE类型,这样会对MYSQL在运行效率上提高很大,尤其是大数据量测试条件下

数据的增删改查

增加数据的指令: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的数据
进阶查询操作子句的用法

  • group by 示例:select avg(price),type from th_books group by type;
  • order by 示例:select * from th_users order by id desc;
  • having 示例:select avg(price),type from th_books group by type having avg(price)>60;
  • limit 示例:select * from th_users where username like('%TA%') limit 1;
  • distinct 示例:select distinct from th_users;
  • like `示例:select * from th_users where username like(‘%TA%’);
  • concat `示例:select concat(id,‘:’,username) as info from th_users;
  • 还有其他子句可以从网上查询
    MySQL中常用的统计函数
  • avg 取平均值
  • count 如果指定字段则统计非空记录, 如果是count(*)则统计所有记录
  • min 取最小值
  • max 取最大值
  • std 取背离值
  • stdtev 同上
  • sum 求和
    修改数据指令: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;
    主键和外键的一些重要区别:
  • 主键不能包含 NULL 值,外键可以包含 NULL 值。
  • 每条记录的主键都必须是唯一的,不能重复,而不同记录的外键可以是相同的。
  • 表中只能有一个主键,但是可以有多个外键。
  • 默认情况下,数据库引擎会自送为主键创建索引;而外键不会,您必须手动为外键创建索引

有关SQL注入

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数据表中的所有数据,导致信息的泄露

你可能感兴趣的:(mysql,数据库,sql)