MySQL 常用数据类型

连接服务器

CMD里面的命令:mysql -uroot -p

若显示Can’t connect to MySQL sever on ‘localhost’,那么右键计算机-管理-服务-重新启动MySQL即可

MySQL语句规范
SQL必须用分隔符结尾
数据名称和表名称最好都小写

将分隔符由;改为了//,程序见到//才会停止

mysql -uroot -p delimiter=//

开启输出日志

\T D:\MySQL\output_diary\mysql1.txt
\t ##表示停止写日志

数据库操作

创建数据库

CREATE DATABASE [IF NOT EXISTS] maizi1;

[ ]表示可选,就是可敲可不敲

创建不同于默认的编码方式的数据库

SHOW CREATE DATABASE maizi1 DEFAULT CHARACTER SET = 'gck'

修改已有数据库的编码方式

ALTER DATABASE maizi3 DEFAULT CHARACTER SET utf8

常用命令

查看上一步产生的警告

SHOW WARNINGS;

查看已有的数据库

 SHOW DATABASES;

查看已有数据库的定义

SHOW CREATE DATABASE maizi1;

打开数据库

USE db_name

查看当前打开数据库的名称

SELECT DATABASE();

删除指定数据库

DROP DATABASE maizi4

数据表的相关操作

数据表是数据库最重要的组成部分之一,是其他对象的基础,数据表是存储数据的数据结构,数据表是包含了行和列构成的二维网络。
数据表至少有一列,可以没有行或者多行,数据表名称要求唯一,而且不要包含特殊字符。

创建数据表

MySQL 中的数据类型

整数类型
TINYINT
有符号:±27-1,无符号:(0,28-1)
SMALLINT:跟上面一样,不过指数部分分别为215,216
MEDIUMINT:223,224
INT:231,232
BIGINT:265,264
BOOL,BOOLEN:TINYINT(1),0为TRUE,其他为FALSE

不用死记硬背,可以通过help \h ? 来查看数据类型的范围

浮点类型
FLOAT[(M,D)]:M代表数字总位数,D代表小数后面的位数。

字符串类型

  1. CHAR(M):定长字符串,M个字节
  2. VARCHAR(M):变长字符串,L+1字节,L<=M
  3. TINYTEXT
  4. TEXT
  5. MEDIUMTEXT
  6. LONGTEXT
  7. ENUM(‘value1’,‘value2’,…):当值可以列举的时候,从列举之中选择一个
  8. SET(‘value1’,‘value2’),可以选择多个值

日期时间类型

  1. TIME
  2. DATE
  3. DATETIME
  4. TIMESTAMP
  5. TEAR

MQL存储引擎

什么是存储引擎?
用户可以根据不同的存储方式,来选择存储引擎。
如何查看MySQL数据引擎

  1. 查看MySQL支持的存储引擎
SHOW ENGINES\G;

\G:表示分行显示

  1. 查看显示支持的存储引擎信息
SHOW VARIABLES LIKE 'have%';
  1. MySQL常用的存储引擎及特点
    1. InnoDB存储引擎:读取效率低,占用数据大
    2. MyISAM存储引擎:占用磁盘空间小,但是不支持事务
    3. MEMORY存储引擎:速度快,提高表的处理,但是数据存储在内存中,用了必须删掉。安全性不高,适合一次性。

同一个数据库可以使用多个数据引擎,根据不同的表进行选择。

建立TABLE的步骤

  1. 建立TABLE第一步:找到表头的数据类型,比如:
    编号:MEDIUMINT 无符号
    姓名:VARCHAR(20)
    性别:ENUM(‘男’,‘女’,‘保密’)
    电话:字符串|整数 无负数
    地址:变长字符串(200)
    邮箱:变长字符串(50)
    薪水:浮点数FLOAT(8,2)
    是否结婚:布尔类型 TINYINT(1)
  2. 创建数据表
    添加注释:# 或者 –
# 注释内容
-- 注释内容
-- 创建maizi数据库
CREATE DATABASE IF NOT EXISTS `maizi` DEFAULT CHARACTER SET 'UTF8';

USE `maizi`;

-- 创建学员表(user)
-- 编号 id
-- 用户名 username
-- 年龄 age
-- 性别 sex
-- 邮箱 email
-- 地址 addr
-- 生日 birth
-- 薪水 salary
-- 电话 tel
-- 是否结婚 married
-- 注意:当需要输入中文的时候,需要临时转换客户端的编码方式
-- SET NAMES GBK;
-- 字段注释 通过COMMENT 注释内容 给字段添加注释
CREATE TABLE IF NOT EXISTS `user`(
id SMALLINT,
username VARCHAR(20),
age TINYINT,
sex ENUM('男','女','保密'),
email VARCHAR(50),
addr VARCHAR(200),
birth YEAR,
salary FLOAT(8,2),
tel INT,
married TINYINT(1) COMMENT '0代表未结婚,非0代表已婚'
)ENGINE=INNODB CHARSET=UTF8;

  1. 查看指定表的表结构
DESC tbl_name
DESCRIBE tbl_name
SHOW COLUMNS FROM tbl_name
  1. 向表中插入记录
INSERT tbl_name VALUE|VALUES(值,...);
  1. -查询表中所有记录
SELECT * FROM tbl_name;
SELECT * FROM test1;

测试整型

  1. 添加无符号的数据类型

CREATE TABLE test2(
num1 TINYINT UNSIGNED,
num2 TINYINT 
);

INSERT test2 VALUES(0,-12);
  1. 零填充
CREATE TABLE test3(
num1 TINYINT ZEROFILL,
num2 SMALLINT ZEROFILL,
num3 MEDIUMINT ZEROFILL,
num4 INT ZEROFILL,
num5 BIGINT ZEROFILL
);

用零填充默认用零填充,使得位数达到最大值,作用是显示美观,长度一致

测试浮点型

CREATE TABLE test4(
num1 FLOAT(6,2),
num2 DOUBLE(6,2),
num3 DECIMAL(6,2)
);
INSERT test4 VALUES(3.1415,3.1415,3.1415);

INSERT test4 VALUES(3.1495,3.1495,3.1495);
mysql> SELECT * FROM test4;
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
| 3.14 | 3.14 | 3.14 |
| 3.15 | 3.15 | 3.15 |
+------+------+------+
2 rows in set (0.00 sec)

查询数据

mysql> SELECT * FROM test4 WHERE num1=3.15;
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
| 3.15 | 3.15 | 3.15 |
+------+------+------+
1 row in set (0.00 sec)

区别DECIMAL和FLOAT和DOUBLE的区别

mysql> SELECT * FROM test4 WHERE num1='3.14';
Empty set (0.00 sec)

mysql> SELECT * FROM test4 WHERE num3='3.14';
+------+------+------+
| num1 | num2 | num3 |
+------+------+------+
| 3.14 | 3.14 | 3.14 |
+------+------+------+
1 row in set (0.00 sec)

所以说DECIMAL的精度更高。

查询字符串
CHAR定长字符串,占用空间大,速度快。
VARCHAR变长字符串,占用空间小,速度慢。

-- 测试CHAR和VARCHAR
CREATE TABLE IF NOT EXISTS test5(
str1 CHAR(5),
str2 VARCHAR(5)
);
INSERT test5 VALUES('1','1');

INSERT test5 VALUES('12345','12345');

INSERT test5 VALUES('123456','123456');

枚举类型

mysql> -- 测试枚举类型
mysql> CREATE TABLE IF NOT EXISTS test7(
    -> sex ENUM('男','女','保密    ')
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT test7 VALUES('男     ');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> INSERT test7 VALUES('女     ');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> INSERT test7 VALUES('保密');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> INSERT test7 VALUES('保密1');
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
mysql>
mysql> INSERT test7 VALUES(2);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> INSERT test7 VALUES(0);
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
mysql>
mysql> INSERT test7 VALUES(NULL);
Query OK, 1 row affected (0.00 sec)

ENUM会自动去掉空格,保密1不属于二者之一,所以传入失败,NULL可以传入,0不可以传入

集合类型


mysql> -- 测试集合类型
mysql>
mysql> CREATE TABLE IF NOT EXISTS test8(
    -> fav SET('A','B','C','D')
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> INSERT test8 VALUES('A,C,D');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> INSERT test8 VALUES('D,B,A');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> INSERT test8 VALUES(3);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> INSERT test8 VALUES(15);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM test8;
+---------+
| fav     |
+---------+
| A,C,D   |
| A,B,D   |
| A,B     |
| A,B,C,D |
+---------+
4 rows in set (0.00 sec)

A B C D在二进制里面分别代表1 2 4 8,所以Values(3)代表前两个爱好

测试年份

mysql> -- 测试日期时间
mysql> CREATE TABLE IF NOT EXISTS test9(
    -> birth YEAR
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql> INSERT test9 VALUES(1901);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT test9 VALUES(2155);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT test9 VALUES(2156);
ERROR 1264 (22003): Out of range value for column 'birth' at row 1

mysql> SELECT * FROM test9;
+-------+
| birth |
+-------+
|  1901 |
|  2155 |
+-------+
2 rows in set (0.00 sec)
  1. 年份不能插入超过范围的数字
  2. 0-69,输入这个范围内的数字或者字符串,会转化为2000-2099年之间,70-99会自动转化成90年代的。
  3. 插入一个数字0和一个字符串0的时候,结果是截然不同的。
mysql> INSERT test9 VALUES(0);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT test9 VALUES('0')
    -> ;
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM test9;
+-------+
| birth |
+-------+
|  1901 |
|  2155 |
|  0000 |
|  2000 |
+-------+

测试时间

mysql>
mysql> CREATE TABLE IF NOT EXISTS test10(
    -> test TIME
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT test10 VALUES('1 12:12:12');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> INSERT test10 VALUES('11:11');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT test10 VALUES('1234');
Query OK, 1 row affected (0.01 sec)

mysql>  INSERT test10 VALUES('0');
Query OK, 1 row affected (0.01 sec)

mysql>  INSERT test10 VALUES('66');
ERROR 1292 (22007): Incorrect time value: '66' for column 'test' at row 1
mysql> SELECT * FROM test10;
+----------+
| test     |
+----------+
| 36:12:12 |
| 11:11:00 |
| 00:12:34 |
| 00:00:00 |
+----------+
4 rows in set (0.00 sec)

测试Date

mysql> CREATE TABLE IF NOT EXISTS test11(
    -> test DATE
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT test11 VALUES('12-6-7');
Query OK, 1 row affected (0.01 sec)

+------------+
| test       |
+------------+
| 2012-06-07 |
+------------+
1 row in set (0.00 sec)

最大值是9999-12-31,不超过这个范围就可以。

发布了25 篇原创文章 · 获赞 2 · 访问量 832

猜你喜欢

转载自blog.csdn.net/Di_Panda/article/details/105267883