目录
一、常用的数据类型
类型 | 解释 | 举例 |
---|---|---|
int | 整型 | 用户定义整数类型的数据(1、2、3、4、5…) |
fliat | 单精度浮点(4字节32位) | 准确表示小数点后6位 |
double | 双精度浮点(8字节64位) | 小数位更多,更精确 |
char | 固定长度的字符类型 | 定义字符长度(存的少,会补空格,存的多被截取,高版本报错) |
varchar | 可变长度的字符类型 | 定义字符最大长度(存的少,总长度变小,存的大于最大,报错) |
text | 文本 | |
image | 图片 | |
decimal(5,2) | 总共5个有效长度数字,小数点后面有两位 |
char和varchar的区别
- **char:**如果存入数据的实际长度比指定长度要小,会补空格至指定长度,如果存入的数据的实际长度大于指定长度,低版本被截取,高版本会报错
- **varchar:**如果存入的数据实际长度比指定长度要小,那么指定长度会变成实际长度一样,如果存入的数据的实际长度大于指定长度,会报错
截取和截断的区别
截取会对后一位进行四舍五入,截断直接获取要的数字,不进行四舍五入
varchar存储规则
4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65535字节
二、MySQL数据文件
MysQL数据库的数据文件存放在**/usr/local/mysql/data**目录下,每个数据库对应一个子目录,用于存储数据表文件。每个数据表对应为三个文件,扩展名分别为".frm"、“.MYD"和”.MYI”。
MYD文件
MYD文件是MyISAM存储引擎专用,存放MyISAM表的数据。每一个MyISAw表都会有一个"“.MYD"文件与之对应,同样存放于所属数据库的文件夹下,和”.frm"文件在一起。
MYI文件
“.MYI"文件也是专属于MyISAM存储引擎的,主要存放MyISAM表的索引相关信息。对于MyISAM4存储来说,可以被 cache 的内容主要就是来源于”.MYI"文件中。每一个MyISAM表对应一个".MYI”文件,存放于位置和".frm"以及".MYD”一样。
MyISAM存储引擎
MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件(frm,myd,myi)。每个表都有且仅有这样三个文件做为MyISAM
存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI文件中。
另外还有".ibd"和 ibdata文件,这两种文件都是用来存放Innodb数据的,之所以有两种文件来存放Innodb的数据(包括索引),是因为Innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是独享表空间存放存储数据。独享表空间存储方式使用".ibd"文件来存放数据,且每个表一个".ibd"文件,文件存放在和MyISAM数据相同的位置。如果选用共享存储表空间来存放数据,则会使用ibdata文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata文件。
数据库SQL语句
SQL语句用于维护管理数据库,包括数据查询、数据更新、访问控制、对象管理等功能。
SQL语言分类
- DDL:数据定义语言,用于创建数据库队先后,如库、表、索引等
- DML:数据操纵语言,用于对表中的数据进行管理
- DQL:数据查询语言,用于从数据表中查找符合条件的数据记录
- DCL:数据控制语言,用于设置或更改数据库用户或角色权限
三、MySQL基础语句操作
1.登录数据库
mysql -uroot -p123456 #直接登录数据库,用-P输入密码,这样不安全
mysql -uroot -p #登录数据库,不输入密码,回车之后再输入
2.查询数据库结构
show databases; #查看有多少数据库
use mysql; #进入一个数据库中
show tables; #查看该数据库中有多少个表
3.查看表的结构
describe db; #查看db表的结构(可缩写位desc db;)
四、DDL语句:定义数据中的操作
DDL语句可用于创建数据库对象(库、表、索引)
删除数据库和表
1.创建数据库和表-create
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...][,PRIMARY KEY (主键名)]);
create database wu; #创建一个名为wu的数据库
create table wxj (id int not null,name char(10) not null,gender char(1),primary key (id));
创建一个表wxj id int整形 not null 不为空
name char(10)固定长度的字符串(10字节)
gender char(1)固定长度的字符串(1字节)
prinmary key(id)z指定主键为id的字段
创建一个名为wu的数据库,并查看数据库
进入创建的数据库中,查看数据库中的表,为空
在数据库中创建名为wxj的表
2. 删除指定的数据表
use 数据库名
DROP TABLE 表名;
DROP TABLE [数据库名].表名;
删除指定的数据库
DROP DATABASE 数据库名;
3.DML数据操控语言
数据操纵语言,用于对表中的数据进行管理,用来插入、删除和修改数据库中的数据。
insert
update
delete
格式
INSERT INTO 表名(字段1,字段2[,...]) VALUES(字段1的值,字段2的值,...);
向数据表中插入新的数据记录
use wu1;
create table wxj1 (id int not null,name char(10) not null,score decimal(5,2),passwd char(48) default’',primary key (id));
insert into wxj1 (id,name,score,passwd) values(1,‘wu’,100,PASSWORD(‘123456’));
insert into wxj1 (id,name,score,passwd) values(2,‘xin’,99,123456);
#PASSWORD(‘123456’):查询数据记录时,密码字串以加密形式显示:若不使用PASSWORD(),查询时以明文显示。
查询数据记录
SELECT 字段名1,字段名2[,…] FROM 表名 [WHERE 条件表达式];
select * from wxj1;
select name,score from wxj1 where id=1;
查询wxj1表中id为1的name和score
修改、更新数据表中的数据记录
UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] [WHERE 条件表达式];
insert into wxj1 (id,name,score,passwd) values(4,‘zhangsan’,98,123456);
insert into wxj1 (id,name,score,passwd) values(5,‘lisi’,66,123456);
select * from class;
update wxj1 set id=6 where name=‘wu’;
把name为wu的id改为6
select * from class;
update wxj1 set name=‘wangwu’,score=100 where id=5;
把id=5的name改为wangwu,score改成100
select * from wxj1;
在数据表中删除指定的数据记录
DELETE FROM 表名 [WHERE 条件表达式];
delete from wxj1 where id=5;
删除id=5的数据记录
select * from wxj1;
4.DQL数据查询语言
select name from class\G #以列表方式竖向显示
select * from class limit 2; #只显示头2行
select * from class limit 2,3; #显示第2行后的前3行
select name from wxj1\G #以列表方式竖向显示
select * from wxj1 limit 2; #只显示头2行
select * from wxj1 limit 2,3; #显示第2行后的前3行
5.DCL数据控制语言
修改表名
ALTER TABLE 旧表名 RENAME 新表名;
alter table wxj1 rename nanjing; #修改表名wxj1为nanjing
show tables;
select * from nanjing;
拓展表结构(增加字段)
ALTER TABLE 表名 ADD address varchar(50) default ‘地址未知’;
#default ‘地址未知’:表示此字段设置默认值 地址不详;可与 NOT NULL 配合使用
alter table nanjing add address varchar(50) default ‘地址未知’;
修改字段(列)名,添加唯一键
ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型 [unique key];
alter table nanjing change name student varchar(20) unique key; #把name改为student并设为唯一键
select * from nanjing;
insert into nanjing (id,student,score,passwd) values(1,‘lisi’,50,123456);
select * from nanjing;
insert into nanjing (id,student,score,passwd) values(6,‘wu’,90,123456); #因为id=6已经有用户使用了,主键id有唯一性。
insert into nanjing (id,student,score,passwd) values(7,‘wu’,90,123456); #因为student设为了唯一键,所以同名也不行。
每个表中只能由一个主键 ,但是许多内容都需要唯一性,这就是唯一键的作用
删除字段
ALTER TABLE 表名 DROP 字段名;
alter table nanjing drop address; #删除address字段
select * from nanjing;
拓展一
use wu1;
create table if not exists info ( id int(4) zerofill primary key auto_increment, name varchar(10) not null,cardid int(18) not null unique key, hobby varchar(50));
if not exists 表示检测要创建的表是否已存在,如果不存在就继续创建
int(4) zerofill 表示若数值不满4位数,则前面用“0”填充,例如0001
auto_increment 表示此字段为自增长字段,即每条记录自动递增1,默认从1开始递增;自增长字段数据不可以重复;自增长字段必须是主键;如添加的记录数据没有指定此字段的值且添加失败也会自动递增一次
unique key 表示此字段唯一键约束,此字段数据不可以重复;一张表中只能有一个主键, 但是一张表中可以有多个唯一键
not null 表示此字段不允许为NULL
insert into info (id,name,cardid,hobby) values (1,‘zhangsan’,888,‘chi’);
此时id为0001,id为主键,指定为1,从1开始
五、克隆/复制表格
方法一
create table 新表名 like 复制的表名;
仅复制格式,不复制内容
insert into 新表名 select * from 复制的表名;
复制原表内容到新表
方法二
create table 新表名 (select * from 复制的表名)
数据结构和数据一起复制过来了,克隆
六、清空表/删除表内数据
方法一
delete from info;
#DELETE清空表后,返回的结果内有删除的记录条目;
清空表内数据但是不会删除表的数据结构
工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用DELETE FROM
删除所有记录后,在此添加的记录会从原来最大的记录id后面继续自增写入数据
方法二
truncate table CLASS1;
#TRUNCATE清空表后,没有返回被删除的条目:TRUNCATE
工作时是将表结构按原样重新建立
因此在速度上TRUNCATE会比DELETE清空表快
使用TRUNCATE TABLE 清空表内数据后,id会从1开始重新记录
七、 drop、truncate、delete区别
drop table 数据表名
- 属于DDL
- 不可回滚(无法恢复)
- 不可带where
- 表内容和结构删除
- 删除速度快
truncate table 数据表名
- 属于DDL
- 不可回滚
- 不可带where
- 表内容删除
- 删除速度快
delete from 数据表名
- 属于DML
- 可回滚(可恢复)
- 可带where
- 表结构在,表内容要看where执行的情况
- 删除速度慢,需要逐行删除
不再需要一张表的时候用drop
想删除部分数据行的时候用delete,并且带上where子句
保留表而删除所有数据的时候用truncate
删除速度:drop>truncate> delete
安全性 delete 最好
拓展二:
将mysql数据库中的表导出成excel表格
报错了
报错原因
mysql文件的导出和导入路径有默认设置,即secure-file-priv,当导出的文件路径和默认路径冲突时就会报错
解决办法
查看secure-file-priv设置
show variables like ‘%secure%’;
secure-file-priv的值有三种情况:
secure_file_prive=null ––限制mysqld 不允许导入导出
secure_file_priv=/path/ – --限制mysqld的导入导出只能发生在默认的/path/目录下
secure_file_priv=‘’ – --不对mysqld 的导入 导出做限制
退出数据库修改/etc/my.cnf配置
添加secure_file_priv=‘’
systemctl restart mysqld
设置一个导出目录
八、创建临时表
查看当前库中所有表
添加临时表
create temporary table linshi (
id int(4) zerofill primary key auto_increment,
name varchar(10) not null,
cardid int(18) not null unique key,
hobby varchar(50));
查看当前库中所有表
show tables; (查不到)
在临时表中添加数据
insert into linshi values(1,‘zhangsan’,123456,‘play’);
查看当前表中所有数据
select * from linshi;
退出数据库
quit
##重新登录后进行查看
mysql -uroot -p123456
##查看之前创建的临时表中所有数据,发现已经被自动销毁
select * from linshi;