MySQL入门教程之基本操作实例讲解

时间:2018-09-18
本文章向大家介绍MySQL入门教程之基本操作实例讲解,需要的朋友可以参考一下

1.mysql是什么?
  mysql本质就是一个c/s架构的套接字软件

2.数据库基本概念
  数据库服务器:运行有数据库管理软件的计算机
  数据库管理软件:mysql
  库:文件夹
  表:文件
  记录:文件中的一行的内容

3.针对库、表、记录的操作
  3.1 库文件夹:
    增:
      CREATE DATABASE 库名 CHARSET 编码;
    改:
      ALITER DATABASE 库名 CHARSET 编码;
    查:
      SHOW DATABASES;
      SHOW CREATE DATABASE 库名;
    删:
      DROP DATABASE 库名;

  3.2 表文件:
    操作表前要先切换到库下:use 库名;
    建表的完整语法:
      CREATE TABLE 表名(
      字段名1 类型[(宽度) 约束条件],
      字段名2 类型[(宽度) 约束条件],
      字段名3 类型[(宽度) 约束条件]
      );

    增:
      CREATE TABLE 表名(字段名 类型,...);
    改:
      改字段类型约束条件:
        ALTER TABLE 表名 modify 字段名 类型(长度宽度);
      改字段名类型约束条件:
        ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度宽度);
    查:
      查看所有表:
        SHOW TABLES;
      查看指定表:
        SHOW CREATE TABLE t1;
      查看表结构:
        DESC 表名;
    删:
      DROP TABLE 表名;
    清空表:
      TRUNCATE 表名;
      #清空表应该使用TRUANCATE,不仅删除所有记录,而且将自增字段的值归0


  3.3 记录文件中一行行内容:
    增:
      方式一(指定字段名插入):
        INSERT INTO 表名 (字段名,字段名,...) VALUES (值1,值2,...),...;
      方式二(默认位置插入):
        INSERT INTO 表名 values (值1,值2,...),...;
    改:
      UPDATE 表名 SET 字段名=内容 where 条件;
    查:
      SELECT 字段名 FROM 表名;
    删:
      DELETE FROM 表名 WHERE 条件;
      #DELETE 只能用于删除符合条件的某几条记录,不能用于清空表

4.存储引擎
  存储引擎就是表的类型
  不同的类型会对应不同的处理机制
  测试:
  CREATE TABLE t3(id INT)ENGINE='InnoDB';
  CREATE TABLE t4(id INT)ENGINE='MyISAM';
  CREATE TABLE t5(id INT)ENGINE='BLACKHOLE';
  CREATE TABLE t6(id INT)ENGINE='MEMORY';

  INSERT INTO t3 VALUES(1);
  INSERT INTO t4 VALUES(1);
  INSERT INTO t5 VALUES(1);
  INSERT INTO t6 VALUES(1);

5.数据类型
  PRIMARY         #主键(不能为空的意思)
  AUTO_INCREMENT  #自动增长
  DEFAULT         #默认值

  5.1 数字类型:整型(默认有符号),浮点型
  类型设置成无符号:unsigned
  #整型类型:数据类型宽度限制的是显示宽度而非存储宽度
  整型:
    TINYINT      #占1字节
    SMALLINT     #占2字节
    MEDIUMINT  #占3字节
    INT      #占4字节
    BIGINT          #占8字节
  浮点型:
    FLOAT                #占4字节
    DOUBLE            #占8字节
    DECIMAL           #手动指定字节

  5.2 字符类型:
    CHAR_LENGTH(字段名)   #用于查看某字段包含的字符个数

    CHAR      #定长
    VARCHAR    #变长

    例:
      CHAR(5)
        相同点:最大能存放5个字符
        不同点:假设传入3个字符,会补全2个字符
    #注意:
        针对CHAR类型,在存放时会将字符补全为5个,在查询时又会将末尾补全的空格去掉
        不让MySQL去掉末尾空格的方法:
          通过修改sql_mode,添加 SQL_PAD_CHAR_TO_FULL_LENGTH
    VARCHAR(5)
      相同点:最大能存放5个字符
      不同点:假设传入3个字符,就存3个字符

    LIKE:
      WHERE 字段名 LIKE
      LIKE是模糊匹配
      %:任意个数的任意字符
      _:1个任意字符

    大文本类型:
      TEXT系列(文本是带有编码)
      TINYTEXT
      TEXT
      MEDIUMTEXT
      LONGTEXT
      BLOB系列(也是字符数据,但是不带编码)
      TINYBLOB
      BLOB
      MEDIUMBLOB
      LONGBLOB
    二进制类型:
      BINARY系列(存储二进制数据)
      BINARY
      VARBINARY

  5.3 日期类型:TIME,DATE,DATETIME,TIMESTAMP,YEAR,
    NOW() #此函数用于获取当前时间

  5.4 枚举类型:
    ENUM #多选一
  5.5 集合类型:
    SET #多选多


6.表操作之约束条件
  约束条件:约束条件是在类型之外为字段附加的限制
  强调:如果表的类型为InnoDB储存引擎,在创建表时,必须定义一个主键
  如果不指定,InnoDB存储引擎会自上而下寻找一个不为空且唯一的字段当做主键
  如果不指定并且也没有NOT NULL+UNIQUE的字段,那么InnoDB存储引擎会生成一个隐藏的字段当做主键
  PRIMARY KEY    #标识该字段为该表的主键,可以唯一的标识记录
    单从约束角度去看,主键的约束效果是NOT NULL+UNIQUE

  FOREIGN KEY #标识该字段为该表的外键
  限制关联表某一个字段的值必须是来自于被关联表的一个字段
  注意:
    1.被关联的字段必须是一个KEY,通常是ID字段
    2.创建表时:必须先建立被关联的表,才能建立关联表
    3.插入记录时:必须先往被关联的表插入记录,才能往关联表中插入记录
  #关联表
  CREATE TABLE emp(
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(15),
  age INT,
  dep_id INT,
  FOREIGN KEY(dep_id) REFERENCES dep(id)
  ON UPDATE CASCADE
  ON DELETE CASCADE
  );

  INSERT INTO emp(name,age,dep_id) VALUES
  ('hades',18,1),
  ('iggy',28,2),
  ('egon',38,2),
  ('alex',30,1),
  ('xingchen',18,3);

  #被关联表
  CREATE TABLE dep(
  id INT PRIMARY KEY AUTO_INCREMENT,
  dname VARCHAR(20),
  info VARCHAR(50)
  );

  INSERT INTO dep(dname,info) VALUES
  ('IT','技术部门'),
  ('Sale','销售部'),
  ('HR','人事部');

  #ps:删除时,应该先删除关联表emp中的记录,再删除被关联表对应的记录

  NOT NULL              #标识该字段不能为空

  UNIQUE KEY               #标识该字段的值是唯一的

  AUTO_INCREMENT #标识该字段的值自动增长(整数类型,而且为主键)

  DEFAULT                     #为该字段设置默认值

  UNSIGNED                  #无符号
  ZEROFILL                    #使用0填充

  #找两张表关系的窍门
    emp   dep
  #1.先站在左边的角度去找左表emp的多条记录能否对应右表dep的一条记录
    翻译:多个员工能否属于一个部门
  #2.然后站在右表的角度:去找右表dep的多条记录能否对应左表emp的一条记录
    翻译:多个部门能否拥有同一名员工
  #多对一结果的判断
    1.如果只有单向多对一成立,最终关系就是多对一
    2.在emp表新增一个字段dep_id,该字段外键关联dep(id)
  #多对多结果的判断
    1.双向的多对一就是多对多
    2.需要建立第三张表,有一个字段的值fk左表,一个字段的值fk右表
    CREATE TABLE author(
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(16),
    age INT
    );

    CREATE TABLE book(
    id INT PRIMARY KEY AUTO_INCREMENT,
    bname VARCHAR(20),
    price INT
    );

    CREATE TABLE author2book(
    id INT PRIMARY KEY AUTO_INCREMENT,
    author_id INT,
    book_id INT,
    FOREIGN KEY(author_id) REFERENCES author(id)
    ON UPDATE CASCADE
    ON DELETE CASCADE,
    FOREIGN KEY(book_id) REFERENCES book(id)
    ON UPDATE CASCADE
    ON DELETE CASCADE
    );
  #一对一:无需参考窍门,左表的一条数据唯一对应右表的一条记录

7.表操作
  1.修改表名
    ALTER TABLE 表名 RENAME 新表名;
  2.增加字段
    ALTER TABLE 表名 ADD 字段名 数据类型[完整性约束条件...],ADD 字段名 数据类型[完整性约束条件...];
    ALTER TABLE 表名 ADD 字段名 数据类型[完整性约束条件...] FIRST;
    ALTER TABLE 表名 ADD 字段名 数据类型[完整性约束条件...] AFTER 字段名;
  3.删除字段
    ALTER TABLE 表名 DROP 字段名;
  4.修改字段
    ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件...];
    ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件...];
    ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件...];

  5.复制表
   #在查询语句前加上CREATE TABLE 表名
    CREATE TABLE user SELECT host,user,password,select_priv FROM mysql.user;
   #复制表结构
    CREATE TABLE user1 SELECT host,user,password,select_priv FROM mysql.user WHERE 3<1;

8.记录的增、删、改
  1.插入完整数据(顺序插入)
    语法一:
      INSERT INTO 表名(字段1,字段2,字段3...字段n) VALUES(值1,值2,值3...值n);
    语法二:
      INSERT INTO 表名 VALUES (值1,值2,值3...值n);
    2.指定字段插入数据
      语法:
      INSERT INTO 表名(字段1,字段2,字段3...) VALUES (值1,值2,值3...);
    3.插入多条记录
      语法:
      INSERT INTO 表名 VALUES
      (值1,值2,值3...值n),
      (值1,值2,值3...值n),
      (值1,值2,值3...值n);
    4.插入查询结果
      语法:
      INSERT INTO 表名(字段1,字段2,字段3...字段n)
      SELECT (字段1,字段2,字段3...字段n) FROM 表2
      WHERE ...;

9.更新数据UPDATE
  语法:
    UPDATE 表名 SET
    字段1=值1,
    字段2=值2,
    WHERE CONDITION;
  示例:
    UPDATE mysql.user SET password=password('123')
    WHERE user='root' and host='localhost';

10.删除数据DELETE
  语法:
    DELETE FROM 表名
    WHERE CONDITION;
  示例:
    DELETE FROM mysql.user
    WHERE password='';