深入浅出MySQL数据库——基本数据类型、数据库及表操作

版权声明:作者已开启版权声明,如转载请注明转载地址。 https://blog.csdn.net/qq_34829447/article/details/82263264

一.数据库相关概念

1.什么是数据库

组织管理和存储数据的操作

2.常见数据库

  • Oracle
  • DB2
  • SQL Server
  • Postgre SQL
  • MySQL

3.相关术语

  • 数据库系统(Database System):DBS
    • 数据库(Database)
    • 数据库管理系统(Database Management System):DBMS
    • 应用开发工具
    • 管理员及用户
  • SQL语言(Structured Query Language):结构化查询语言
    • DDL:数据定义语言——用于定义数据库、表、视图、索引、触发器
    • DML:数据操作语言——用于增删改数据
    • DQL:数据查询语言——用于查询数据
    • DCL:数据控制语言——用于控制用户的访问权限

二.MySQL相关操作

1.配置文件

my.cnf是MySQL的配置文件

2.登录/退出MySQL

  • 登录
    • mysql -u root -p
    • mysql -u root -p root
    • 登录的同时打开指定数据库db_name:mysql -u root -p root -D db_name
  • 退出
    • exit
    • quit

3.得到版本号

  • mysql -V
  • mysql --version

4.登录信息中需要掌握的内容

这里写图片描述

  • Commands end with ; or \g表示命令行结果符默认使用;或\g来结束

  • Type 'help;' or '\h' for help.表示可以通过help或者\h或者?加上相关关键字来查看手册

  • Type '\c' to clear the current input statement.表示使用\c取消当前命令的执行

    如执行:show table\c则会跳转到下一行,即该行忽略

5.常用SQL语句

  • 得到登录的用户:SELECT USER();
  • 得到MySQL的版本信息:SELECT VERSION();
  • 得到当前的日期时间:SELECT NOW();
  • 得到当前打开的数据库:SELECT DATABASE();

6.SQL语句语法规范

  • 常用MySQL的关键字我们需要大写;库名、表名、字段名称等使用小写
  • SQL语句支持折行操作,拆分的时候不能把完整单词拆开
  • 数据库名称、表名称、字段名称不要使用MySQL的保留字,如果必须要使用,需要用反引号“将其括起来

三.数据库相关操作

1.创建数据库

  • CREATE (DATABASE|SCHEMA) db_name;

  • 注意:

    • 数据库名称最好有意义
    • 名称不要包含特殊字符或MySQL关键字
  • 检测数据库名称是否存在,不存在再创建:CREATE DATABASE [IF NOT EXISTS] db_name;

  • 在创建数据库的同时指定编码方式:CREATE DATABASE IF NOT EXISTS db_name DEFAULT CHARACTER SET [=] 'charset';

    其中db_name为数据库名,charset为编码字符集。例子如下:

    CREATE DATABASE IF NOT EXISTS test3 DEFAULT CHARACTER SET 'UTF8';

2.查看当前服务器下全部数据库

  • SHOW (DATABASES|SCHEMAS);

3.查看指定数据库的详细信息[查看编码方式]

  • SHOW CREATE DATABASE db_name;

4.修改指定数据库编码方式

  • ALTER DATABASE db_name [DEFAULT] CHARACTER SET [=] 'charset';

5.打开指定数据库

  • USE db_name;

6.得到当前打开的数据库

  • SELECT DATABASE()|SCHEMA();

7.删除指定的数据库

  • DROP DATABASE db_name;
  • 如果数据库存在则删除:DROP DATABASE [IF EXISTS] db_name;

四.数据表相关操作

1.数据表

  • 数据表是数据库最重要的组成部分之一,数据是保存在数据表中
  • 数据表由行(row)和列(column)来组成
  • 每个数据表中至少有一列,行可以有0行、1行或者多行组成
  • 表名要求唯一,不要包含特殊字符,最好含义明确

2.创建数据表

  • 创建数据表语法规范:

    CREATE TABLE [IF NOT EXISTS] tbl_name(
    字段名称 字段类型 [完整性约束条件],
    字段名称 字段类型 [完整的约束条件],
      ...
    )ENGINE=存储引擎 CHARSET=编码方式;
  • 约束条件

    • unsigned无符号,没有负数,从0开始
    • zerofill零填充,当数据的显示长度不够的时候可以使用前补0的效果填充到指定长度[设置为零填充时,自动带有unsigned约束条件]
    • NOT NULL非空约束,也就是插入值的时候这个字段必须要给值
    • DEFAULT默认值,如果插入记录的时候没有给字段赋值,则使用默认值
    • PRIMARY KEY主键,标识表示记录的唯一性,值不能重复,一个表只能有一个主键。【可以使用PRIMARY KEY(主键1,主键2)定义复合主键】
    • UNIQUE KEY唯一性,一个表中可以有多个字段是唯一索引,同样的值不能重复,但NULL值除外
    • AUTO_INCREMENT自动增长,只能用于数值列,而且配合索引使用,默认起始值从1开始,每次增长1,可以通过SHOW CREATE TABLE 表名;的最后一行查看当前增长到的需要。当前增长的序号为所设增长的所有值中最大值+1。
    • FOREIGN KEY外键约束

3.查看当前数据库下已有数据表

  • SHOW TABLES;

  • 完整查看数据表语句:SHOW [FULL] TABLES [{FROM | IN} db_name][LIKE 'pattern'| WHERE expr]

    SHOW [FULL] TABLES FROM db_name;进行查询时,可以不打开指定数据库

4.查看指定数据表的详细信息

  • SHOW CREATE TABLE tbl_name;

5.查看表结构

  • DESC tbl_name;
  • DESCRIBE tbl_name;
  • SHOW COLUMNS FROM tbl_name;

6.删除表

  • DROP TABLE [IF EXISTS] tbl_name;

7.向数据表中插入记录

  • INSERT [INTO] tbl_name (id,username,...) VALUES(1,'KING',...);
  • 如果超出数据类型的范围,则会发生截断的效果

8.查询数据表中所有记录

  • SELECT * FROM tbl_name;

9.表结构相关操作

  • 添加字段到指定字段周围ALTER TABLE tbl_name ADD 字段名称 字段属性[完整性约束条件][FIRST|AFTER 字段名称];

  • 删除字段ALTER TABLE tbl_name DROP 字段名称;

  • 添加默认值ALTER TABLE tbl_name ALTER 字段名称 SET DEFAULT 默认值;

  • 删除默认值ALTER TABLE tbl_name ALTER 字段名称 DROP DEFAULT;

  • 修改字段类型、字段属性ALTER TABLE tbl_name MODIFY 字段名称 字段类型[字段属性][FIRST|AFTER 字段名称]

  • 修改字段名称、字段类型、字段属性ALTER TABLE tbl_name CHANGE 原字段名称 新字段名称 字段类型 字段属性 [FIRST|AFTER 字段名称]

  • 添加主键约束ALTER TABLE tbl_name ADD PRIMARY KEY(字段名称);

  • 删除主键约束ALTER TABLE tbl_name DROP PRIMARY KEY;删除前需要删除自增长的约束

  • 添加唯一ALTER TABLE tbl_name ADD UNIQUE KEY|INDEX index_name (字段名称)index_name为索引名称,可以通过查询表创建语句查看索引名称,添加时index_name可以省略(默认使用字段名称作为索引名称)

  • 删除唯一ALTER TABLE tbl_name DROP KEY|INDEX index_name;

  • 修改数据表名称`ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name

    RENAME TABLE tbl_name TO new_tbl_name;

五.MySQL中的数据类型

1.数值型

  • 整数型

    这里写图片描述

  • 浮点数

    这里写图片描述

2.字符串类型

这里写图片描述

  • CHAR效率高于VARCHAR,CHAR相当于拿空间换时间,VARCHAR拿时间换空间
  • CHAR默认存储数据的时候,后面会用空格填充到指定长度,而在检索的时候会去掉后面空格;VARCHAR在保存的时候不进行填充,尾部的空格会留下
  • TEXT列不能有默认值,检索的时候不存在大小写转换

3.日期时间类型

这里写图片描述

六.MySQL存储引擎

1.MyISAM存储引擎

  • 测试MyISAM存储引擎

    CREATE TABLE test_myisam(
    a INT UNSIGNED,
      b VARCHAR(20),
      c CHAR(32)
    )ENGINE=MyISAM
  • 默认MyISAM的表会在磁盘中产生3个文件

    • .frm表结构文件
    • .MYD数据文件
    • .MYI索引文件
  • 可以在创建表的时候指定数据文件和索引文件的存储位置,只有MyISAM表支持

    • DATA DIRECTORY [=] 数据保存的绝对路径
    • INDEX DIRECTORY [=] 索引文件保存的绝对路劲
  • MyISAM单表最大支持的数据量:2的64次方条数据

  • 每个表最多可以建立64个索引

  • 如果是复合索引,每个复合索引最多包含16个列,索引值最大长度是1000B

  • MyISAM引擎的存储格式【使用SHOW TABLE STATUS LIKE '表名'来查看】

    • 定长(FIXED静态)
      • 是指字段中不包含VARCHAR/TEXT/BLOB
    • 动态(DYNAMIC)
      • 只要字段中包含变长的列(VARCHAR/TEXT/BLOB)则是动态
    • 压缩(COMPRESSED)
      • 使用myisampack创建

2.InnoDB存储引擎

设计遵循ACID模型,支持事务,具有从服务崩溃中恢复的能力,能够最大限度保护用户的数据。

  • ACID
    • 原子性(Atomiocity)
    • 一致性(Consistency)
    • 隔离性(Isolation)
    • 持久性(Durability)
  • 支持行级锁,可以提升多用户并发的读写性能
  • 支持外键,保证数据的一致性和完整性
  • InnoDB拥有自己独立的缓冲池
  • 对于INSERT、UPDATE、DELETE操作,InnoDB会使用一种change buffering的机制来自动优化,还可以提供一致性的读,并且还能够缓存变更的数据,减少磁盘IO,提高性能
  • 创建InnoDB表后会产生两个文件
    • .frm表结构文件
    • .ibd数据和索引存储表空间
  • 所有的表都需要创建主键,最好是配上AUTO_INCREMENT,也可以放到经常查询的列作为主键

七.常用SQL语句

1.查看上一步操作产生的警告信息

  • SHOW WARNINGS;

2.MySQL中的注释

  • #注释内容
  • --注释内容

八.应用实例

  • 创建慕课网imooc数据库

    CREATE DATABASE IF NOT EXISTS imooc DEFAULT CHARACTER SET 'UTF8';

  • 打开imooc

    USE imooc;

  • 创建用户表

    CREATE TABLE IF NOT EXISTS user(
    id INT,
      username VARCHAR(20),
      password CHAR(32),
      email VARCHAR(50),
      age TINYINT,
      card CHAR(18),
      tel CHAR(11),
      salary FLOAT(8,2),
      married TINYINT(1),
      addr VARCHAR(100),
      sex ENUM('男','女','保密')
    )ENGINE=INNODB CHARSET=UTF8;
  • 查看user表结构

    DESC user;
    DESCRIBE user;
    SHOW COLUMNS FROM user;
  • 删除user表

    DROP TABLE [IF EXISTS] user;
  • 查看当前数据库下的数据表

    SHOW TABLES;
  • 查看user表的详细信息

    SHOW CREATE TABLE user;
  • 向user表插入记录

    INSERT user (id,username,password,email,age,card,tel,salary,married,addr,sex) VALUES(1,'king','king','[email protected]',24,'210203199003311777','18041168030',800000.68,0,'Dalian','男');
  • 查询user表中所有记录

    SELECT * FROM user;
  • 创建用于测试整型的表

    CREATE TABLE test_int(
      a tinyint,
      b smallint,
      c mediumint,
      d int,
      e bigint
    );
  • 创建用于测试无符号的表

    CREATE TABLE test_unsigned(
      a tinyint,
      b tinyint unsigned
    );

    这里写图片描述

    INSERT test_signed(a,b)VALUES(-12,-12);#报错:ERROR 1264 (22003): Out of range value for column 'b' at row 1
    INSERT test_unsigned(a,b)VALUES(0,0);#插入成功:Query OK, 1 row affected (0.00 sec)
    INSERT test_unsigned(a,b)VALUES(0,256);#报错:ERROR 1264 (22003): Out of range value for column 'b' at row 1
  • 创建用于测试零填充的表

    CREATE TABLE test_int1(
    a tinyint ZEROFILL,
      b smallint ZEROFILL,
      c mediumint ZEROFILL,
      d int ZEROFILL,
      e bigint ZEROFILL
    );

    这里写图片描述

    INSERT test_int1 (a,b,c,d,e) VALUES (1,1,1,1,1);

    这里写图片描述

  • 创建用于测试浮点型的表

    CREATE TABLE test_float(
    a FLOAT(6,2),
      b DOUBLE(6,2),
      c DECIMAL(6,2)
    );
    INSERT test_float (a,b,c) VALUES (4.143,4.146,4.149);#报出警告:c是被截断进行四舍五入,FLOAT和DOUBLE直接进行四舍五入不报警高

    这里写图片描述

    CREATE TABLE test_float1(
    a FLOAT,
      b DOUBLE,
      c DECIMAL
    );
    INSERT test_float1 (a,b,c) VALUES (4.143,4.146,4.149);#报出警告:c是被截断进行四舍五入,DECIMAL默认保存整数,FLOAT和DOUBLE正常保存

    这里写图片描述

  • 创建用于测试char和varchar【CHAR效率高于VARCHAR,CHAR,相当于拿空间换时间,VARCHAR拿时间换空间】CHAR默认存储数据的时候,后面会用空格填充到指定长度;而在检索的时候会去掉后面的空格;VARCHAR在检索的时候不进行填充,尾部的空格会留下。

    CREATE TABLE test_str(
    a CHAR(5),
      b VARCHAR(5)
    );
    INSERT test_str (a,b) VALUE('','');
    INSERT test_str (a,b) VALUE('a','a');
    INSERT test_str (a,b) VALUE('ab','ab');
    INSERT test_str (a,b) VALUE('abc','abc');
    INSERT test_str (a,b) VALUE('abcd','abcd');
    INSERT test_str (a,b) VALUE('abcde','abcde');
    INSERT test_str (a,b) VALUE('abcdef','abcdef');#报错:ERROR 1406 (22001): Data too long for column 'a' at row 1
    INSERT test_str (a,b) VALUE(' 123 ',' 123 ');#查询时,CHAR会将后面的空格去掉,VARCHAR不会去掉,结果a为" 123",b为" 123 "
    SELECT CONCAT('*',a,'*'),CONCAT('*',b,'*') FROM test_str;#CANCAT用于拼接字符串
  • 测试TEXT不能有默认值,检索的时候不存在大小写转换

    CREATE TABLE test_str1(
    content TEXT DEFAULT 'THIS IS A TEXT'
    );#报错:ERROR 1101 (42000): BLOB, TEXT, GEOMETRY or JSON column 'content' can't have a default value
  • 测试ENUM,枚举类型在插入的时候会自动过滤到空格

    CREATE TABLE test_enum(
    sex ENUM('男','女','保密')
    );
    INSERT test_enum(sex) VALUES('男');
    INSERT test_enum(sex) VALUES('男1');#报错
    INSERT test_enum(sex) VALUES(NULL);#没有指定非空,则可以插入NULL值
    INSERT test_enum(sex) VALUES(1);#则插入的为'男',编号从1开始
  • 测试SET集合

    CREATE TABLE test_set(
    a SET('A','B','C','D','E','F')
    );
    INSERT test_set(a) VALUES ('A');
    INSERT test_set(a) VALUES ('C');
    INSERT test_set(a) VALUES ('C,D,E');
    INSERT test_set(a) VALUES ('C,F,A');#插入时会变成A,C,F
    INSERT test_set(a) VALUES (2);#插入的是B
  • TIME类型存储[D HH:MM:SS] D表示天数0~34。若为2 10:10:10则小时为2*24+10,分钟为10,秒为10

    CREATE TABLE test_time(
    a TIME
    );
    INSERT INTO test_time(a) VALUES ('12:23:45');#12:23:45
    INSERT INTO test_time(a) VALUES ('2 12:23:45');#60:23:45
    INSERT INTO test_time(a) VALUES ('22:22');#22:22:00
    INSERT INTO test_time(a) VALUES ('22');#00:00:22
    INSERT INTO test_time(a) VALUES ('2 22');#70:00:00
    INSERT INTO test_time(a) VALUES ('121212');#12:12:12
    INSERT INTO test_time(a) VALUES ('0');#00:00:00
    INSERT INTO test_time(a) VALUES ('787878');#报错
    INSERT INTO test_time(a) VALUES (NOW());#当前时间
    INSERT INTO test_time(a) VALUES (CURRENT_TIME);#当前时间
  • DATE类型

    
    #YYYY-MM-DD YYYYMMDD
    
    CREATE TABLE test_date(
    a DATE
    );
    INSERT INTO test_date(a) VALUES('2017-03-04');#2017-03-04
    INSERT INTO test_date(a) VALUES('2017-3-4');#2017-03-04
    INSERT INTO test_date(a) VALUES('4017-03-04');#4017-03-04
    INSERT INTO test_date(a) VALUES('20170304');#2017-03-04
    INSERT INTO test_date(a) VALUES('2017@03@04');#2017-03-04 任意分隔符都可以分割时间
    
    #YY-MM-DD YYMMDD(插入方式,查询结果都是YY-MM-DD) 70~99之间转换成1970~1999 00~69之间转换成2000~2069
    
    INSERT INTO test_date(a) VALUES('17-03-04');#2017-03-04
    INSERT INTO test_date(a) VALUES('88-03-04');#1988-03-04
    INSERT INTO test_date(a) VALUES(NOW());#当前日期
    INSERT INTO test_date(a) VALUES(CURRENT_DATE);#当前日期
  • DATETIME类型

    CREATE TABLE test_datetime(
    a DATETIME
    );
    INSERT INTO test_datetime(a) VALUES('2017-03-04 13:05:10');#2017-03-04 13:05:10
    INSERT INTO test_datetime(a) VALUES('170304130510');#2017-03-04 13:05:10
    INSERT INTO test_datetime(a) VALUES(NOW());#当前日期
  • TIMESTAMP类型,与DATETIME类似,就是时间范围比DATETIME小;且自动带有时区

    CREATE TABLE test_timestamp(
    a TIMESTAMP
    );
    INSERT INTO test_timestamp(a) VALUES('2017-03-04 13:05:10');#2017-03-04 13:05:10
    INSERT INTO test_timestamp(a) VALUES('170304130510');#2017-03-04 13:05:10
    INSERT INTO test_timestamp(a) VALUES(CURRENT_TIMESTAMP);#当前日期时间
    INSERT INTO test_timestamp(a) VALUES(NULL);#当前日期时间
    INSERT INTO test_timestamp(a) VALUES();#当前日期时间
  • YEAR类型,用于存储年份(范围1901~~2155)

    CREATE TABLE test_year(
    a YEAR
    );
    INSERT INTO test_year(a) VALUES(1901);#1901
    INSERT INTO test_year(a) VALUES(1900);#报错
    INSERT INTO test_year(a) VALUES(2155);#当前日期时间
    INSERT INTO test_year(a) VALUES(2156);#报错
    INSERT INTO test_year(a) VALUES(0);#0000
    INSERT INTO test_year(a) VALUES('0');#2000
    
    #00~69为2000~2069 70~99表示1970~1969
    

猜你喜欢

转载自blog.csdn.net/qq_34829447/article/details/82263264