MySQL之一:数据库、数据表

1.知识点提炼

  • MySQL默认的端口号是多少:3306
  • MySQL中的超级用户叫什么:root
  • 创建数据库:CREATE DATABASE
  • 修改数据库:ALTER DATABASE
  • 删除数据库:DROP DATABASE

2.常用命令:

  • 显示当前服务器版本:SELECT VERSION();
  • 显示当前日期时间:SLELECT NOW();
  • 显示当前用户:SELECT USER();

3.MySQL语句的规范(默认规范,实际不区分大小写):

  • 关键字函数名称全部大写
  • 数据库名称、表名称、字段名称全部小写
  • SQL语句必须以分号结尾

注:关键字:是指在SQL中有意义的字,某些关键字(例如SELECT, DELETE, 或 BIGINT)是保留的,需要特殊处理才能用作表和列名称等标识符。这一点对于内置函数的名称也适用。

4.数据库操作

  • 创建数据库

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

其中:[DEFAULF]   CHARACTER   SET   [=]   charset_name;,代表设置数据库的编码方式,不写默认是数据库的编码方式。

  • 查看当前服务器下的数据库列表

SHOW   {DATABASES | SCHAMAS}   [LIKE 'pattern' | WHERE expr]

  • 修改数据库

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

  • 删除数据库

DROP   {DATABASE | SCHAMA}   [IF EXISTS]   db_name

注:查看警告信息:SHOW WARNINGS;

5.数据类型

  • 定义:数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。

注:以TINYINT为例,讨论取值范围:

1)对于无符号数:1111 1111 ~ 0000 0000 即 255 ~ 0

2)对于有符号数:最大值是0111 1111 即 +127,最小值为什么是-128呢?因为在计算机中,表示负值是用补码,虽然  -0 也是 0,这样就出现两个补码代表一个数值的情况,为例将补码与数字一一对应,所以认为规定 0 一律用 +0 代表,同时为了充分利用资源,九江原来本应该表示 -0 的补码规定为代表 -128.

注:M >= D

注:CHAR(M)是定长类型,如果不足长度则通过空格来补全;VARCHAR(M)是变长类型;

ENUM枚举值,即给定几个选项,从选项中做选择,最多有65535个选择;

SET代表在集合中选择任意的排列组合都是可以的;

6.操作数据表

  • 定义:数据表(或称表)是数据库最重要的组成部分之一,是其他对象的基础。

1)USE

  • 打开数据库
  • USE 数据库名称

注:显示当前打开的数据库:SELECT DATABASE();

  • 创建数据表,注意每句结束用逗号分隔,最后一句除外

CREATE TABLE [IF NOT EXISTS] table_name (

    column_name data_type ,

    ......

)

eg:创建数据表

mysql> CREATE TABLE tb1(
       username VARCHAR(20),
       age TINYINT UNSGINED,
       salary FLOAT(8,2) UNSIGNED    
);

2)SHOW TABLES

  • 查看数据表列表
  • SHOW   TABLES   [FROM db_name]   [LIKE 'pattern' | WHERE expr]

3)SHOW COLUMNS

  • 查看数据表的结构
  • SHOW COLUMNS FROM tb_name

4)INSERT

  • 插入记录
  • INSERT   [INTO]   tb1_name[(column_name , ...)]   VALUES(val , ...)

注:如果省略列名(字段值),那么就需要对每一个字段逐一赋值,否则会报错。如果不省略就可以为某些字段赋值。

5)SELECT

  • 记录查找
  • SELECT   expr,...   FROM   tb1_name

eg:

6)空值与非空

  • NULL,字段值可以为空
  • NOT NULL,字段值禁止为空

7)AUTO_INCREMENT

  • 自动编号,且必须与主键组合使用
  • 默认情况下,起始值为1,每次的增量为1
  • 一般为整型,如果为浮点型,小数位数一定为0

8)PRIMARY KEY

  • 主键约束
  • 每张数据只能存在一个主键
  • 主键保证记录的唯一性
  • 主键自动NOT NULL
  • 主键不一定与AUTO_INCREMENT一起使用

9)UNIQUE KEY

  • 唯一约束
  • 唯一约束可以保证记录的唯一性
  • 唯一约束的字段可以为空值(NULL)
  • 每张数据表可以存在多个唯一约束

10)DEFAULT

  • 默认值
  • 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。

11)约束

  • 约束保证数据的完整性和一致性
  • 约束分为表级约束和列级约束(根据字段数目的多少决定的,如果约束只针对某个字段使用,则称为列级约束;如果针对两个到多个字段使用,则称为标记约束)
  • 约束类型包括(按照功能划分):
  1. NOT NULL(非空约束)
  2. PRIMARY KEY(主键约束)
  3. UNIQUE KEY(唯一约束)
  4. DEFAULT(默认约束)
  5. FOREIGN KEY(外键约束)

12)FOREIGN KEYp

  • 保持数据一致性,完整性
  • 实现数据表的一对一或一对多关系
  • 外键约束的要求:
  1. 父表(子表所参照的表)和子表(具有外键列的表)必须使用相同的存储引擎,而且禁止使用临时表。
  2. 数据表的存储引擎只能为 InnoDB。
  3. 外键列(曾经加过FOREIGN 关键字的列)和参照列(外键列参照的那一列)必须具有相似的数据类型。其中数字的长度是否有符号位必须相同;而字符的长度则可以不同。
  4. 外键列参照列必须创建索引。如果外键列不存在索引的话,MySQL将自动创建索引。

 

  • 编辑数据表的默认存储引擎:

MySQL配置文件my.ini:default-storage-engine = INNODB,然后重启MySQL相关服务

  •  对于3进行实现举例:
1.登录MySQL客户端
mysql -uroot -ppassword

2.打开一个数据库
USE test;

3.创建两张数据表
CREATE TABLE provices(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    pname VARCHAR(20) NOT NULL
);
创建完成如果不确定可以通过SHOW CREATE TABLE Provices来查看创建命令

CREATE TABLE user(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(10) NOT NULL,
    pid BIGINT,
    FOREIGN KEY (pid) REFERENCES provices (id)
);
此时会报错:无法创建user表,原因是违反了条件3,pid的数据类型和父表中的id的数据类型不同导致的。

于是对其进行修改,而且对于整型也一定要保证有无符号的统一,重新创建user表:
CREATE TABLE user(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(10) NOT NULL,
    pid SMALLINT UNSIGNED,
    FOREIGN KEY (pid) REFERENCES provices (id)
);

注:目前的父表是provices,子表是user,子表user中有外键,其参照的表叫做父表。

  • 对于4进行分析:

外键列是pid,参照列是id。在参照列中并未创建索引,如果没有创建,会自动创建索引,这里由于id是主键,在创建时MySQL自动为其创建了索引,所以参照列已经存在索引。检验:显示索引:SHOW IINDEXS FROM provices[\G是以网格形式呈现]

再查看子表是否存在索引:

发现存在两个索引,分别是id主键和pid外键也被创建了索引。

  • 外键约束的参照操作:在进行了外键约束的创建以后,在更新表的时候,子表是否也进行相应的操作
  1. CASCADE  级联:从父表删除或更新且自动删除或更新子表中匹配的行
  2. SET NULL          :从父表删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL`
  3. RESTRICT  限制:拒绝对父表的删除或更新操作
  4. NO ACTION        :标准SQL的关键字,在MySQL中与RESTRICT相同

eg:而且需要注意,父表要在子表前插入记录,否则子表的记录无法参照

1.为了演示CASCADE,首先创建一张新的用户表users1:
CREATE TABLE users1(
    id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(10) NOT NULL,
    pid SMALLINT UNSIGNED,
    FOREIGN KEY (pid) REFERENCES provices (id) ON DELETE CASCADE
);

2.查看users1表的创建命令:SHOW CREATE TABLE users1

注:其中ON DELETE CASCADE表示的是在父表中删除相应的行,同时也删除,更新子表中相应的行。

如果插入到子表中的记录中的外键列对应的约束列还不存在,那么就会插入(eg第二条记录插入失败)失败,并且下一条记录插入时,如果是AUTO_INCREMENT的话就会从第三条记录插入。

在外键约束中,在实际开发中,很少使用物理的外键约束,一般使用逻辑外键约束,因为物理的外键约束,只有InnoDB引擎才支持,所以一般不会去实际定义物理的外键。逻辑约束的意思是,两张表按照某种联系去创建,但是不使用FOREIGN KEY这个关键词来定义。

13)表级约束与列级约束

  • 对一个数据列建立的约束,称为列级约束
  • 对多个数据列建立的约束,称为表级约束
  • 列级约束既可以在列定义时声明,也可以在列定义后声明。
  • 表级约束只能在列定义后声明
  • NOT NULL和DEFAULT只存在列级约束,而对于其他三种PRIMARY KEY、UNIQUE KEY、FOREIGN KEY都是既存在表级约束又存在表级约束。

14)修改数据表

  • 添加单列

ALTER TABLE tb1_name ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name]

发现默认是在之后添加

  • 添加多列

ALTER TABLE tb1_name ADD [COLUMN] (col_name column_definition , ...)

注:添加多列时,不能指定位置关系,只能在规定的位置下方添加

  • 删除列

ALTER TABLE tb1_name DROP [COLUMN] col1_name , DROP [COLUMN] col2_name , ADD [COLUMN] col3_name col_definition

  • 添加主键约束

ALTER TABLE tb_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name , ...)

  • 添加唯一约束

ALTER TABLE tb_name ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY] [index_name] [index_type] (index_col_name,...)

  • 添加外键约束

ALTER TABLE tb_name ADD [CONSTRAINT[symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition

eg: 

ALTER TABLE users ADD FOREIGN KEY (pid) REFERENCES provices (id);
  • 添加 / 删除默认约束

ALTER TABLE tb_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

  • 删除主键约束

ALTER TABLE tb_name DROP PRIMARY KEY

  • 删除唯一约束

ALTER TABLE tb_name DROP {INDEX | KEY} index_name

  • 删除外键约束

ALTER TABLE tb_name DROP FOREIGN KEY fk_symbol

注:查看外键约束的名称,通过:SHOW CREATE TABLE users;   找到[约束]CONSTRAINT 'fk_symbol'

  • 修改列定义:有可能字段的数据类型、位置上存在问题

ALTER TABLE tb_name MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]

注:由大类型转换到小类型时要注意数据的丢失

  • 修改列名称

ALTER TABLE tb_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]

  • 修改数据表名称
  1. 方法1:ALTER TABLE tb_name RENAME [TO | AS] new_tb_name
  2. 方法2:RENAME TABLE tb_name TO new_tb_name [,tb_name2 TO new_tb_name2] ...

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值