美文网首页
MySQL学习笔记

MySQL学习笔记

作者: BeYanJin | 来源:发表于2016-12-09 10:48 被阅读0次

    参考资料

    慕课网——与MySQL的零距离接触

    前言

    本人菜鸟,入IT只为当鼓励师。本编文章主要对 MySQL的一些基础知识进行总结。

    一、常用服务指令

    1. 启动和停止MySQL服务

    • 启动:net start [mysql服务名]
    • 停止:net stop [mysql服务名]
      net start / net stop
      Windows服务

    2. MySQL的登录与退出

    • 登录:mysql -uroot -p -P3306 -h127.0.0.1端口:3306,IP:127.0.0.1)
      登录与退出

    3. 创建新用户

    脚本:CREATE USER 'username'@'host' [IDENTIFIED BY 'PASSWORD']; 其中密码是可选项。
    例子:CREATE USER 'john'@'192.168.189.71' IDENTIFIED BY "123456";这样就创建了一个用户(用户名:john,密码:123456,该用户只能在IP地址为192.168.189.71的内网机子上访问操作数据库。若host为localhost,则该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将localhost改为%,表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录)。

    4. 修改MySQL提示符

    用prompt指令修改提示符
    可选提示符参数
    • 示例:账号:root ,密码:root )
      C:\Users\JIN>mysql -uroot -proot --prompt \h
      localhostprompt \h>
      PROMPT set to ‘\h>’
      localhost>prompt \u#\h \d \D >
      PROMPT set to ‘\u#\h \d \D > ‘
      root#localhost (none) Thu Dec 08 21:15:08 2016 >

    5. 用SELECT显示当前信息

    • 语句规范:
      **1. **关键字与函数名称全部大写。
      **2. **数据库名称、表名称、字段名称全部小写。
      **3. **SQL语句必须以分号结尾。

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

      SELECT指令示例

    二、数据库

    1. 数据库的操作

    1-1. 创建数据库

    CREATE {DATABASE| SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] charset_name(编码方式)
    
    • 基本指令CREATE DATABASE db_name;
      显示Query OK后,可用SHOW DATABASES;指令显示已成功创建出名为test的数据库:
      CREATE DATABASE test;
    • 可选参数IF NOT EXISTS
      若再次尝试创建已存在的数据库,系统会报错(error)。若加了可选参数IF NOT EXISTS,系统不会报错,取而代之的是把原本的错误放到警告(warning)中,可用SHOW WARNINGS;查看所有的警告:
      IF NOT EXISTS
    • 可选指令CHARACTER SET [=] charset_name(编码方式)
      显示Query OK后,可用SHOW CREATE DATABASE db_name;查看某个库使用的编码方式:
      CHARACTER SET gbk;

    1-2. 打开数据库

    USE db_name(数据库名称);
    
    • 显示Database changed即成功打开对应数据库,可用SELECT DATABASE();查看当前打开的数据库:
      USE test;

    1-3. 修改数据库

    ALTER {DATABASE | SCHEMA} db_name [DEFAULT] CHARACTER SET [=] charset_name;
    
    • 可用该指令修改数据库的编码方式:


      ALTER DATABASE test2 CHARACTER SET utf8;

    1-4. 删除数据库

    DROP {DATABASE | SCHEMA} [IF EXISTS] db_name;
    
    • Query OK即为删除成功,可用SHOW DATABASES;再次查看数据库,发现里面没有test2(IF EXISTS作用与创建数据库指令中的IF NOT EXISTS相同):
      DROP DATABASE IF EXISTS test2;

    2. 查看数据库的相关信息

    2-1. 查看数据库列表

    SHOW {DATABASES | SCHEMAS};
    
    • 注:下面显示已存在的6个数据库是软件自带的:
      SHOW DATABASES; / SHOW SCHEMAS;

    2-2. 查看某个库使用的编码方式

    SHOW CREATE DATABASE db_name;
    
    SHOW CREATE DATABASE test;

    2-3. 查看当前打开的数据库

    SELECT DATABASE();
    
    • 默认情况下,打开的数据库为空(NULL):


      SELECT DATABASE(); (默认为NULL)

    2-4. 查看数据库引擎

    SHOW ENGINES;
    
    SHOW ENGINES;

    3. 查看警告信息

    SHOW WARNINGS;
    
    SHOW WARNINGS;

    三、数据表

    • 数据表(或称表)是数据库最重要的组成部分之一。数据库只是一个框架,数据表才是其实质内容。
    • 一个(数据)表由行(记录)列(字段、域)构成,组成一个二维关系表,其中列名也称为字段名。而一个真正的数据库由几个(或更多)表、视图及相关的文件等组成一个统一的、相关联的系统。
    • 列的属性:
      1. 列名:表的列名在同一个表中具有惟一性。
      2. 数据类型:指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。同一列的数据属于同一种数据类型。
      3. NULL、NOT NULL、AUTO_INCREMENT、约束:NULL属性:允许在插入数据时省略该列的值; NOT NULL属性:不允许在没有指定列缺省值的情况下插入省略该列值的数据行;AUTO_INCREMENT:每插入一个新行时,被设值该属性的对应列的值(相对于上一行)递增加1。只有设置了主键约束的列才能使用该属性,一般用于id等序号。详细见第四点; 约束:约束一共有五种,分别拥有不同的目的和功能,详细见第四点。

    1. 数据类型

    CREATE TABLE [IF NOT EXISTS] table_name(
    column_name type_name,
    ...
    );
    
    • type_name即为数据类型。
    • 数据类型:指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型。
      整型
      浮点型
      日期时间型
      字符型

    2. 数据表的操作

    2-1. 创建数据表

    CREATE TABLE [IF NOT EXISTS] table_name(
    column_name type_name,
    ...
    );
    
    • 该命令用来创建数据表的列:


      CREATE TABLE tb( column_name type_name,... );
    • 若当前打开的数据库为空(NULL),创建数据表会报错:


      ERROR:no database selected

    2-2. 修改数据表

    2-2-1.添加列(字段)

    2-3. 插入行(记录)

     INSERT [INTO] tbl_name[(col_name, ...)] VALUES(val, ...);
    
    • 全部列:


      INSERT tb VALUES();
    • 可选列:


      INSERT tb() VALUES();

    3. 查看数据表的相关信息

    3-1. 查看数据表列表

    SHOW TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr];
    
    • 若不加FROM db_name,要确保已经有数据库被打开,否则报错:
      ERROR:no database selected
    • 正确使用指令:
      打开test数据库(USE test;)后再查看。
      SHOW TABLES;
      或直接加FROM db_name,此时与当前打开的数据库无关。
      SHOW TABLES FROM test;

    3-2. 查看数据表的索引

    SHOW INDEXES FROM tbl_name [\G]
    
    主键约束自带的索引 外键约束的索引
    • 以表格的形式显示:


      SHOW INDEXES FROM provinces;
    • 以列表的形式显示


      SHOW INDEXES FROM provinces \G;
      SHOW INDEXES FROM users \G;

    3-3. 查看列(字段)的结构和属性

    SHOW COLUMNS FROM db_name;
    
    • 使用该命令之前要确保已经有数据库被打开,否则报错:


      ERROR:no database selected
    • 正确使用该命令:


      SHOW COLUMNS FROM tb

    3-4. 查看列(字段)的代码与引擎

    SHOW CREATE TABLE tbl_name;
    
    SHOW CREATE TABLE t_group;

    3-5. 查找行(记录)

    SELECT expr,... FROM tbl_name;
    
    SELECT * FROM tb;

    4. 列的其他属性

    表的列名在同一个表中具有惟一性,同一列的数据属于同一种数据类型。除了用列名和数据类型来指定列的属性外,还可以定义其它属性:

    4-1. 自动编号

    CREATE TABLE [IF NOT EXISTS] table_name(
    column_name type_name AUTO_INCREMENT PRIMARY KEY,
    ...
    );
    
    • AUTO_INCREMENT,把字段设置为自动编号。
    • 必须与主键(PRIMARY KEY)组合使用:
      非主键用AUTO_INCREMENT会报错
    • 默认情况下,起始值为1,每次增量为1:


      起始值为1,增量为1
    • 不管INSERT指令是否成功,被设置成AUTO_INCREMENT的列(id)都会自增:
      id=2时,INSERT失败而被跳过

    4-2. 具体的五种约束

    • 约束保证数据的完整性和一致性。
    • 约束分为表级约束和列级约束。
    • 约束类型包括:
      NOT NULL(非空约束)
      PRIMARY KEY(主键约束)
      UNIQUE KEY(唯一约束)
      DEFAULT (value)(默认约束)
      FOREIGN KEY(外键约束)

    4-2-1. 空值和非空约束

    CREATE TABLE [IF NOT EXISTS] table_name(
    column_name type_name NULL(默认),
    column_name type_name NOT NULL,
    ...
    );
    
    • NULL,字段值可以为空(默认)。
      NOT NULL,字段值禁止为空。
    • 若该字段时属性设置为NOT NULL,则插入行(记录)时该字段不能省略,否则报错:
      NULL / NOT NULL

    4-2-2. 主键约束

    CREATE TABLE [IF NOT EXISTS] table_name(
    column_name type_name PRIMARY KEY,
    ...
    );
    
    • PRIMARY KEY,给字段设置主键约束。
    • 每张数据表只能存在一个主键:


      Error:Multiple primary key defined
    • 主键保证记录的唯一性:


      ERROR:Duplicate entry 'xxx' for key 'xxx'
    • 主键自动被设置为NOT NULL
      ERROR:Field 'xxx' doesn't have a default value
    • 主键是默认自带索引的:


      CREATE TABLE provinces
      SHOW INDEXES FROM provinces

    4-2-3. 唯一约束

    CREATE TABLE [IF NOT EXISTS] table_name(
    column_name type_name UNIQUE KEY,
    ...
    );
    
    • UNIQUE KEY,给字段设置唯一约束:
      UNIQUE KEY
    • 唯一约束保证记录的唯一性:


      ERROR:Duplicate entry 'xxx' for key 'xxx'
    • 每张数据表可以存在多个唯一约束:


      Multiple UNIQUE KEY
    • 唯一约束默认被设置为NULL
      唯一约束默认为NULL

    4-2-4. 默认约束

    CREATE TABLE [IF NOT EXISTS] table_name(
    column_name type_name DEFAULT value,
    ...
    );
    
    • DEFAULT (value),默认值。
    • 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值:


      DEFAULT 'unknown'

    4-2-5. 外键约束

    CREATE TABLE [IF NOT EXISTS] table_name(
    ...,
    FOREIGN KEY (column_name) REFERENCES tbl_name(column_name) on [DELETE / UPDATE] [CASCADE / SET NULL / ON ACTION],
    ...
    );
    
    • FOREIGN KEY
    目的:
    • 保持数据一致性和完整性。
    • 实现一对一或一对多的关系。
    要求:
    • 父表和子表必须使用相同的存储引擎,且禁止使用临时表。
    • 数据表的存储引擎只能为InnoDB:
      可以查看或编辑数据表的默认存储引擎(编辑后要重启MySQL服务)——打开MySQL安装目录下的MySQL Server 5.7文件夹并用编辑器打开my.ini文件,找到下面这段代码:
      default-storage-engine=INNODB
    • 外键列和参照列必须具有相似的数据类型。其中数字长度或是否有符号位必须相同;而字符的长度则可以不同
      ERROR:Cannot add foreign key constraint
    • **1. **外键列是不可以以一个没有索引的列作为参照列的,故参照列必须创建索引(该示例为主键(PRIMARY KEY)的索引):
      SHOW INDEXES FROM provinces \G;
      **2. **外键列不存在索引的话,MySQL将自动创建索引:
      SHOW INDEXES FROM users \G;
      SHOW CREATE TABLE users
    参照操作:
    • CASCADE:从表中删除或更新且自动删除或更新子表中匹配的行。
    • SET NULL:从父表中删除或更新行,并设置子表中的外键列为NULL。如果使用该选项,必须保证子表列没有指定NOT NULL。
    • RESTRICT:拒绝对父表的删除或更新操作。
    • NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同。
    -- 父表
    create table t_group (   
    id int not null,  --参照列
    name varchar(30),   
    primary key (id)   
    );  
    insert into t_group values (1, 'Group1');   
    insert into t_group values (2, 'Group2');  
    
    ****************************** 级联(cascade)方式 ******************************
    --子表
    create table t_user (   
    id int not null,   
    name varchar(30),   
    groupid int,  --外键列
    primary key (id),   
    foreign key (groupid) references t_group(id) on delete cascade on update cascade  
    );  
    --参照完整性测试
    insert into t_user values (1, 'qianxin', 1); --可以插入
    insert into t_user values (2, 'yiyu', 2);    --可以插入
    insert into t_user values (3, 'dai', 3);     --错误,用户组3不存在,与参照完整性约束不符
    --约束方式测试
    insert into t_user values (1, 'qianxin', 1);   
    insert into t_user values (2, 'yiyu', 2);   
    insert into t_user values (3, 'dai', 2);   
    delete from t_group where id=2;      --导致t_user中的2、3记录级联删除   
    update t_group set id=2 where id=1;  --导致t_user中的1记录的groupid级联修改为2  
    
    ****************************** 置空(set null)方式 ******************************
    create table t_user (   
    id int not null,   
    name varchar(30),   
    groupid int,   
    primary key (id),   
    foreign key (groupid) references t_group(id) on delete set null on update set null  
    );   
    --参照完整性测试   
    insert into t_user values (1, 'qianxin', 1); --可以插入   
    insert into t_user values (2, 'yiyu', 2);    --可以插入   
    insert into t_user values (3, 'dai', 3);     --错误,用户组3不存在,与参照完整性约束不符   
    --约束方式测试   
    insert into t_user values (1, 'qianxin', 1);   
    insert into t_user values (2, 'yiyu', 2);   
    insert into t_user values (3, 'dai', 2);   
    delete from t_group where id=2;      --导致t_user中的2、3记录的groupid被设置为NULL   
    update t_group set id=2 where id=1;  --导致t_user中的1记录的groupid被设置为NULL  
    
    
    *********************** 禁止(no action / restrict)方式  ***********************
    create table t_user (   
    id int not null,   
    name varchar(30),   
    groupid int,   
    primary key (id),   
    foreign key (groupid) references t_group(id) on delete no action on update no action  
    );     
    --参照完整性测试   
    insert into t_user values (1, 'qianxin', 1); --可以插入   
    insert into t_user values (2, 'yiyu', 2);    --可以插入   
    insert into t_user values (3, 'dai', 3);     --错误,用户组3不存在,与参照完整性约束不符   
    --约束方式测试   
    insert into t_user values (1, 'qianxin', 1);   
    insert into t_user values (2, 'yiyu', 2);   
    insert into t_user values (3, 'dai', 2);   
    delete from t_group where id=2;      --错误,从表中有相关引用,因此主表中无法删除   
    update t_group set id=2 where id=1;  --错误,从表中有相关引用,因此主表中无法修改  
    
    实战经验:
    • 在实际开发中其实很少用到物理的外键约束(即如上设置外键列),很多使用的是逻辑的外键约束,物理的外键约束只有InnoDB这种引擎才能支持,所以一般不定义物理外键。
    • 逻辑外键:定义两张表结构的时候,按照存在着某种结构的方式去定义,但是不使用FOREIGN KEY 这个关键词。

    4-2. 表级约束与列级约束

    • 列级约束:对一个数据列建立的约束。
      表级约束:对多个数据列建立的约束。
    • 列级约束 即可在列定义时声明,也可在列定义后声明。
      表级约束 只能在列定义后声明。
    • 在实际开发中,列级约束用得比较多,表级约束很少用。
    • 在所有的约束中,并不是说每种约束都存在着表级或列级约束。其中:
      NOT NULL 非空约束,DEFAULT约束:只有列级约束而不存在表级约束。
      PRIMARY KEY主键约束,UNIQUE KEY唯一约束,FOREIGN KEY外键约束:都可以存在表级和列级约束。

    相关文章

      网友评论

          本文标题:MySQL学习笔记

          本文链接:https://www.haomeiwen.com/subject/fneemttx.html