第四章 mysql数据库基本操作

一、数据库存储引擎(扩展)

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引、锁定等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。

MySQL存储引擎介绍
文件系统: 操作系统组织和存取数据的一种机制。文件系统是一种软件。
类型:ext2 3 4 ,xfs 数据
不管使用什么文件系统,数据内容不会变化 不同的是,存储空间、大小、速度。
MySQL引擎: 可以理解为,MySQL的“文件系统”,只不过功能更加强大。
MySQL引擎功能: 除了可以提供基本的存取功能,还有更多功能事务功能、锁定、备份和恢复、优化以及特殊功能。和磁盘打交道,mysql中 组织。

1、InnoDB存储引擎:默认引擎,最常用的。
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键;InnoDB是默认的MySQL引擎

InnoDB特点:

 

    支持事务处理,支持外键,支持崩溃修复和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

2、MyISAM存储引擎:(了解)

 

    MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。

MyISAM特点:

 

    插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。

3、MEMORY内存型引擎(了解)

MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问

MEMORY特点:

 

    所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

4、Archive(归档引擎)

如何选择引擎:如果要提供提交、回滚、并要求实现并发控制,InnoDB是一个好的选择;如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率;如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎;MySQL中使用该引擎作为临时表,存放查询的中间结果;如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive。
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

存储引擎查看:

 

mysql> show engines;

image.png

 

修改搜索引擎

 

ALTER TABLE 表名 ENGINE=引擎;

看你的mysql当前默认的存储引擎:

 

mysql> show variables like '%storage_engine%';

如何查看Mysql服务器上的版本

 

mysql> select version();

创建时候指定引擎

 

mysql> create table t1(id int,manager char(10)) engine =innodb;

了解

1.什么是外键:外键的主要作用是保持数据的一致性、完整性。
2.什么是索引:索引相当于书中的目录,可以提高数据检索的效率,降低数据库的IO。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的
3.什么是事务:事务是由一步或几步数据库操作这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性也简称ACID性。
(1)原子性:事务是应用中最小的执行单位,就如原子是自然界最小颗粒,具有不可再分的特征一样。事务是应用中不可再分的最小执行体。(最小了,不可再分了)
(2)一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。(说罢了就是白狗变成了黑狗,不能出现斑点狗!)
(3)隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能相互影响。(说白了,就是你做你的,我做我的!)
(4)持续性:持续性也称为持久性,指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。(说白了就是一条道跑到黑)
4.什么是行锁定与锁表:可以将一张表锁定和可以单独锁一行的记录。为了防止你在操作的同时也有别人在操作。

二、sql语句

增删改查

SQL(Structured Query Language 即结构化查询语言)
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。

DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如(create drop alter)

DML语句 数据库操纵语言(对记录的操作): 插入数据insert、删除数据delete、更新数据update

DCL语句 数据库控制语言(和权限有关): 例如控制用户的访问权限grantrevoke

DQL语句 数据库查询语言: 查询数据select

程序连接数据库的文件:

 

A. ODBC --------- PHP<.php>
B. JDBC ----------- JAVA <.jsp>

====================================================
库----相当于一个目录,存放数据的

 

库里面存放的表, 相当于是文件。
每一行叫做记录,除第一行。
每一列叫一个字段。列上面的第一个叫字段名称。
创建一个库:---->查看库--->进入这个库----->创建表----->查看表:查看表名,表的字段(表结构),表里面的内容(表记录),查看表的状态----->修改表:添加字段,删除字段,修改字段----->修改记录(更新记录),添加记录,删除记录。各种查询,删除表,删除库

创建库

 

mysql> create database 库名;
2.查看数据库
mysql> show databases;
3.进入数据库
mysql> use 库名
4.查看当前所在的库
mysql> select database();

创建表

 

语法:
create table 表名(
        字段名1  类型[(宽度) 约束条件],
        字段名2  类型[(宽度) 约束条件],
        字段名3  类型[(宽度) 约束条件]
)[存储引擎 字符集];
==在同一张表中,字段名是不能相同
==宽度和约束条件可选
==字段名和类型是必须的
=========================================================
1.创建表:
创建表 create table t1(id int,name varchar(20),age int); 
                      字段 类型 字段 类型(长度),字段 类型 
mysql> create table t1(id int,name varchar(50),sex enum('m','f'),age int);
2.查看有哪些表
mysql> show tables;
3.查看表结构:
mysql> desc t1;
4.查看表里面的所有记录:
语法: select 内容 from 表名;
mysql> select * from t1;
*:代表所有内容
5.查看表里面的指定字段:
语法:select 字段,字段 from 表名;
mysql> select name,sex from t1;
6.查看表的状态
mysql> show table status like '表名'\G    ---每条SQL语句会以分号结尾,想看的清楚一些以\G结尾,一条记录一条记录显示。(把表90度向左反转,第一列显示字段,第二列显示记录)使用的\G就不用添加分号了
7.修改表名称
方式一、语法:rename table 旧表名 to 新表名;
mysql> rename table t1 to t2;
Query OK, 0 rows affected (0.00 sec)
方式二、语法:alter table 旧表名 rename 新表名;
mysql> alter table t2 rename t3;
8.使用edit(\e)编辑------了解
mysql> \e  #可以写新的语句,调用的vim编辑器,在里面结尾的时候不加分号,保存退出之后在加“;”
    -> ;
9.删除表
mysql> drop table 表名;
10.删除库
mysql> drop database 库名;

三、数据类型

1、数据类型

在MySQL数据库管理系统中,可以通过存储引擎来决定表的类型。同时,MySQL数据库管理系统也

提供了数据类型决定表存储数据的类型。

 

1.整型
作用:用于存储用户的年龄、游戏的Level、经验值等。
分类:tinyint  smallint  mediumint  int  bigint
常用的是int
显示宽度:类型后面小括号内的数字是显示宽度,不能限制插入数值的大小    
比如:bigint(2)    2是显示宽度
结论:整形的宽度仅为显示宽度,不是限制。因此建议整形无须指定宽度。
=====================================================
2.浮点数类型      FLOAT DOUBLE
作用:用于存储用户的身高、体重、薪水等
float(5.3)      #一共5位,小数占3位.做了限制
mysql> create table test4(float_test float(5,2));  #案例
宽度不算小数点
==================================================================================
定点数类型        DEC
定点数在MySQL内部以字符串形式存储,比浮点数更精确,适合用来表示货币等精度高的数据。
3.字符串类型  
作用:用于存储用户的姓名、爱好、发布的文章等 
字符类型 char varchar  --存字符串
char(10)          根据10,占10个.
    列的长度固定为创建表时声明的长度: 0 ~ 255
varchar(10)     根据实际字符串长度占空间,最多10个
    列中的值为可变长字符串,长度: 0 ~ 65535
案例:
mysql> create table t8(c char(5),v varchar(12));
Query OK, 0 rows affected (0.42 sec)

mysql> insert into t8 values('abcde','abcdef');
Query OK, 1 row affected (0.38 sec)

mysql> insert into t8 values('abc','abcdef');  #char可以少于规定长度。
Query OK, 1 row affected (0.05 sec)

mysql> insert into t8 values('abc777','abcdef7');  #char不能大于规定的长度。
ERROR 1406 (22001): Data too long for column 'c' at row 1
mysql> 
=====================================================================
1.经常变化的字段用varchar
2.知道固定长度的用char
3.尽量用varchar
4.超过255字符的只能用varchar或者text
5.能用varchar的地方不用text
text:文本格式
-----------------------------------------------------------------
4.枚举类型 enum 
mysql> create table t101(name enum('tom','jim'));
只能从tom,jim两个里面2选其1
(enumeration)  
 有限制的时候用枚举
==================================================================
5.日期类型
===时间和日期类型测试:year、date、time、datetime、timestamp
作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等
注意事项:
==插入年份时,尽量使用4位值
==插入两位年份时,<=69,以20开头,比如65,  结果2065      
                 >=70,以19开头,比如82,结果1982
案例:
mysql> create table test_time(d date,t time,dt datetime);
Query OK, 0 rows affected (0.03 sec)
mysql> desc test_time;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d     | date     | YES  |     | NULL    |       |
| t     | time     | YES  |     | NULL    |       |
| dt    | datetime | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> insert into test_time values(now(),now(),now());
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> select * from test_time;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2019-08-23 | 00:26:29 | 2019-08-23 00:26:29 |
+------------+----------+---------------------+
1 row in set (0.00 sec)
测试年:
mysql> create table t3(born_year year);
Query OK, 0 rows affected (0.40 sec)

mysql> desc t3;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| born_year | year(4) | YES  |     | NULL    |       |
+-----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into t3 values (12),(80);
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from t3;
+-----------+
| born_year |
+-----------+
|      2012 |
|      1980 |
+-----------+
2 rows in set (0.00 sec)
mysql> insert into t3 values (2019),(80);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from t3;
+-----------+
| born_year |
+-----------+
|      2012 |
|      1980 |
|      2019 |
|      1980 |
+-----------+
4 rows in set (0.00 sec)
mysql>

2、约束

表完整性约束

作用:用于保证数据的完整性和一致性

 

约束条件                        说明
PRIMARY KEY (PK)        标识该字段为该表的主键,可以唯一的标识记录,不可以为空  UNIQUE + NOT NULL
FOREIGN KEY (FK)        标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键)之间的关联
NULL                    标识是否允许为空,默认为NULL。
NOT NULL                标识该字段不能为空,可以修改。
UNIQUE KEY  (UK)        标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
AUTO_INCREMENT          标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT                 为该字段设置默认值
UNSIGNED                无符号,正数

 

1.主键
每张表里只能有一个主键,不能为空,而且唯一。
定义两种方式:
mysql> create table t7(hostname char(20) primary key,ip char(150));
mysql> create table t9(hostname char(20),ip char(150),primary key(hostname));
删除主键
mysql> alter table t7  drop  primary key;

image.png

 

index(key)每张表可以有很多列做index,必须的起名
面试题:
导致SQL执行慢的原因:
1.硬件问题。如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等。
2.没有索引或者索引失效.
3.数据过多(分库分表)
4.服务器调优及各个参数设置(调整my.cnf)
索引:当查询速度过慢可以通过建立优化查询速度,可以当作调优
创建索引:两种
mysql> create table t100(hostname char(20) primary key,ip char(150),index (ip));
mysql> create table t101(hostname char(20) primary key,ip char(150),index dizhi(ip));
                                                                  #给ip做的索引,名字叫dizhi

 

auto_increment--------自增  (每张表只能有一个字段为自曾) (成了key才可以自动增长)
mysql> CREATE TABLE department3 (
    -> dept_id INT PRIMARY KEY AUTO_INCREMENT,
    -> dept_name VARCHAR(30),
    -> comment VARCHAR(50)
    -> );

image.png

 

设置唯一约束 UNIQUE
mysql> CREATE TABLE department2 (
    -> dept_id INT,
    -> dept_name VARCHAR(30) UNIQUE,
    -> comment VARCHAR(50)
    -> );

image.png

 

image.png

 

插入数据的时候id和comment字段相同可以插入数据,如果有相同的名字不唯一。所以插入数据失败

 

1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum('male','female') not null default 'male'  #只能选择maie和female,不允许为空,默认是male
age int unsigned NOT NULL default 20        #必须为正值(无符号) 不允许为空  默认是20

mysql> create table t5(id int(5),name varchar(10),age int(5) not null default 20);

image.png

 

image.png

 

指定字符集:

一、数据库存储引擎(扩展)

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引、锁定等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。

MySQL存储引擎介绍
文件系统: 操作系统组织和存取数据的一种机制。文件系统是一种软件。
类型:ext2 3 4 ,xfs 数据
不管使用什么文件系统,数据内容不会变化 不同的是,存储空间、大小、速度。
MySQL引擎: 可以理解为,MySQL的“文件系统”,只不过功能更加强大。
MySQL引擎功能: 除了可以提供基本的存取功能,还有更多功能事务功能、锁定、备份和恢复、优化以及特殊功能。和磁盘打交道,mysql中 组织。

1、InnoDB存储引擎:默认引擎,最常用的。
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键;InnoDB是默认的MySQL引擎

InnoDB特点:

 

    支持事务处理,支持外键,支持崩溃修复和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。

2、MyISAM存储引擎:(了解)

 

    MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。

MyISAM特点:

 

    插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。

3、MEMORY内存型引擎(了解)

MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问

MEMORY特点:

 

    所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

4、Archive(归档引擎)

如何选择引擎:如果要提供提交、回滚、并要求实现并发控制,InnoDB是一个好的选择;如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率;如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎;MySQL中使用该引擎作为临时表,存放查询的中间结果;如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive。
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

存储引擎查看:

 

mysql> show engines;

image.png

 

修改搜索引擎

 

ALTER TABLE 表名 ENGINE=引擎;

看你的mysql当前默认的存储引擎:

 

mysql> show variables like '%storage_engine%';

如何查看Mysql服务器上的版本

 

mysql> select version();

创建时候指定引擎

 

mysql> create table t1(id int,manager char(10)) engine =innodb;

了解

1.什么是外键:外键的主要作用是保持数据的一致性、完整性。
2.什么是索引:索引相当于书中的目录,可以提高数据检索的效率,降低数据库的IO。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的
3.什么是事务:事务是由一步或几步数据库操作这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这四个特性也简称ACID性。
(1)原子性:事务是应用中最小的执行单位,就如原子是自然界最小颗粒,具有不可再分的特征一样。事务是应用中不可再分的最小执行体。(最小了,不可再分了)
(2)一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。(说罢了就是白狗变成了黑狗,不能出现斑点狗!)
(3)隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能相互影响。(说白了,就是你做你的,我做我的!)
(4)持续性:持续性也称为持久性,指事务一旦提交,对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。(说白了就是一条道跑到黑)
4.什么是行锁定与锁表:可以将一张表锁定和可以单独锁一行的记录。为了防止你在操作的同时也有别人在操作。

二、sql语句

增删改查

SQL(Structured Query Language 即结构化查询语言)
SQL语言主要用于存取数据、查询数据、更新数据和管理关系数据库系统,SQL语言由IBM开发。

DDL语句 数据库定义语言: 数据库、表、视图、索引、存储过程,例如(create drop alter)

DML语句 数据库操纵语言(对记录的操作): 插入数据insert、删除数据delete、更新数据update

DCL语句 数据库控制语言(和权限有关): 例如控制用户的访问权限grantrevoke

DQL语句 数据库查询语言: 查询数据select

程序连接数据库的文件:

 

A. ODBC --------- PHP<.php>
B. JDBC ----------- JAVA <.jsp>

====================================================
库----相当于一个目录,存放数据的

 

库里面存放的表, 相当于是文件。
每一行叫做记录,除第一行。
每一列叫一个字段。列上面的第一个叫字段名称。
创建一个库:---->查看库--->进入这个库----->创建表----->查看表:查看表名,表的字段(表结构),表里面的内容(表记录),查看表的状态----->修改表:添加字段,删除字段,修改字段----->修改记录(更新记录),添加记录,删除记录。各种查询,删除表,删除库

创建库

 

mysql> create database 库名;
2.查看数据库
mysql> show databases;
3.进入数据库
mysql> use 库名
4.查看当前所在的库
mysql> select database();

创建表

 

语法:
create table 表名(
        字段名1  类型[(宽度) 约束条件],
        字段名2  类型[(宽度) 约束条件],
        字段名3  类型[(宽度) 约束条件]
)[存储引擎 字符集];
==在同一张表中,字段名是不能相同
==宽度和约束条件可选
==字段名和类型是必须的
=========================================================
1.创建表:
创建表 create table t1(id int,name varchar(20),age int); 
                      字段 类型 字段 类型(长度),字段 类型 
mysql> create table t1(id int,name varchar(50),sex enum('m','f'),age int);
2.查看有哪些表
mysql> show tables;
3.查看表结构:
mysql> desc t1;
4.查看表里面的所有记录:
语法: select 内容 from 表名;
mysql> select * from t1;
*:代表所有内容
5.查看表里面的指定字段:
语法:select 字段,字段 from 表名;
mysql> select name,sex from t1;
6.查看表的状态
mysql> show table status like '表名'\G    ---每条SQL语句会以分号结尾,想看的清楚一些以\G结尾,一条记录一条记录显示。(把表90度向左反转,第一列显示字段,第二列显示记录)使用的\G就不用添加分号了
7.修改表名称
方式一、语法:rename table 旧表名 to 新表名;
mysql> rename table t1 to t2;
Query OK, 0 rows affected (0.00 sec)
方式二、语法:alter table 旧表名 rename 新表名;
mysql> alter table t2 rename t3;
8.使用edit(\e)编辑------了解
mysql> \e  #可以写新的语句,调用的vim编辑器,在里面结尾的时候不加分号,保存退出之后在加“;”
    -> ;
9.删除表
mysql> drop table 表名;
10.删除库
mysql> drop database 库名;

三、数据类型

1、数据类型

在MySQL数据库管理系统中,可以通过存储引擎来决定表的类型。同时,MySQL数据库管理系统也

提供了数据类型决定表存储数据的类型。

 

1.整型
作用:用于存储用户的年龄、游戏的Level、经验值等。
分类:tinyint  smallint  mediumint  int  bigint
常用的是int
显示宽度:类型后面小括号内的数字是显示宽度,不能限制插入数值的大小    
比如:bigint(2)    2是显示宽度
结论:整形的宽度仅为显示宽度,不是限制。因此建议整形无须指定宽度。
=====================================================
2.浮点数类型      FLOAT DOUBLE
作用:用于存储用户的身高、体重、薪水等
float(5.3)      #一共5位,小数占3位.做了限制
mysql> create table test4(float_test float(5,2));  #案例
宽度不算小数点
==================================================================================
定点数类型        DEC
定点数在MySQL内部以字符串形式存储,比浮点数更精确,适合用来表示货币等精度高的数据。
3.字符串类型  
作用:用于存储用户的姓名、爱好、发布的文章等 
字符类型 char varchar  --存字符串
char(10)          根据10,占10个.
    列的长度固定为创建表时声明的长度: 0 ~ 255
varchar(10)     根据实际字符串长度占空间,最多10个
    列中的值为可变长字符串,长度: 0 ~ 65535
案例:
mysql> create table t8(c char(5),v varchar(12));
Query OK, 0 rows affected (0.42 sec)

mysql> insert into t8 values('abcde','abcdef');
Query OK, 1 row affected (0.38 sec)

mysql> insert into t8 values('abc','abcdef');  #char可以少于规定长度。
Query OK, 1 row affected (0.05 sec)

mysql> insert into t8 values('abc777','abcdef7');  #char不能大于规定的长度。
ERROR 1406 (22001): Data too long for column 'c' at row 1
mysql> 
=====================================================================
1.经常变化的字段用varchar
2.知道固定长度的用char
3.尽量用varchar
4.超过255字符的只能用varchar或者text
5.能用varchar的地方不用text
text:文本格式
-----------------------------------------------------------------
4.枚举类型 enum 
mysql> create table t101(name enum('tom','jim'));
只能从tom,jim两个里面2选其1
(enumeration)  
 有限制的时候用枚举
==================================================================
5.日期类型
===时间和日期类型测试:year、date、time、datetime、timestamp
作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等
注意事项:
==插入年份时,尽量使用4位值
==插入两位年份时,<=69,以20开头,比如65,  结果2065      
                 >=70,以19开头,比如82,结果1982
案例:
mysql> create table test_time(d date,t time,dt datetime);
Query OK, 0 rows affected (0.03 sec)
mysql> desc test_time;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d     | date     | YES  |     | NULL    |       |
| t     | time     | YES  |     | NULL    |       |
| dt    | datetime | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> insert into test_time values(now(),now(),now());
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> select * from test_time;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2019-08-23 | 00:26:29 | 2019-08-23 00:26:29 |
+------------+----------+---------------------+
1 row in set (0.00 sec)
测试年:
mysql> create table t3(born_year year);
Query OK, 0 rows affected (0.40 sec)

mysql> desc t3;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| born_year | year(4) | YES  |     | NULL    |       |
+-----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into t3 values (12),(80);
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from t3;
+-----------+
| born_year |
+-----------+
|      2012 |
|      1980 |
+-----------+
2 rows in set (0.00 sec)
mysql> insert into t3 values (2019),(80);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from t3;
+-----------+
| born_year |
+-----------+
|      2012 |
|      1980 |
|      2019 |
|      1980 |
+-----------+
4 rows in set (0.00 sec)
mysql>

2、约束

表完整性约束

作用:用于保证数据的完整性和一致性

 

约束条件                        说明
PRIMARY KEY (PK)        标识该字段为该表的主键,可以唯一的标识记录,不可以为空  UNIQUE + NOT NULL
FOREIGN KEY (FK)        标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键)之间的关联
NULL                    标识是否允许为空,默认为NULL。
NOT NULL                标识该字段不能为空,可以修改。
UNIQUE KEY  (UK)        标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY
AUTO_INCREMENT          标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT                 为该字段设置默认值
UNSIGNED                无符号,正数

 

1.主键
每张表里只能有一个主键,不能为空,而且唯一。
定义两种方式:
mysql> create table t7(hostname char(20) primary key,ip char(150));
mysql> create table t9(hostname char(20),ip char(150),primary key(hostname));
删除主键
mysql> alter table t7  drop  primary key;

image.png

 

index(key)每张表可以有很多列做index,必须的起名
面试题:
导致SQL执行慢的原因:
1.硬件问题。如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等。
2.没有索引或者索引失效.
3.数据过多(分库分表)
4.服务器调优及各个参数设置(调整my.cnf)
索引:当查询速度过慢可以通过建立优化查询速度,可以当作调优
创建索引:两种
mysql> create table t100(hostname char(20) primary key,ip char(150),index (ip));
mysql> create table t101(hostname char(20) primary key,ip char(150),index dizhi(ip));
                                                                  #给ip做的索引,名字叫dizhi

 

auto_increment--------自增  (每张表只能有一个字段为自曾) (成了key才可以自动增长)
mysql> CREATE TABLE department3 (
    -> dept_id INT PRIMARY KEY AUTO_INCREMENT,
    -> dept_name VARCHAR(30),
    -> comment VARCHAR(50)
    -> );

image.png

 

设置唯一约束 UNIQUE
mysql> CREATE TABLE department2 (
    -> dept_id INT,
    -> dept_name VARCHAR(30) UNIQUE,
    -> comment VARCHAR(50)
    -> );

image.png

 

image.png

 

插入数据的时候id和comment字段相同可以插入数据,如果有相同的名字不唯一。所以插入数据失败

 

1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum('male','female') not null default 'male'  #只能选择maie和female,不允许为空,默认是male
age int unsigned NOT NULL default 20        #必须为正值(无符号) 不允许为空  默认是20

mysql> create table t5(id int(5),name varchar(10),age int(5) not null default 20);

image.png

 

image.png

 

指定字符集:

 

 

注意

 

如果报错进入server端服务器登陆mysql执行:

mysql> use mysql

mysql> update user set host = '%' where user = 'root';

mysql> flush privileges;


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值