MySQL数据库的基础操作及理解
使用数据库的步骤:
-
链接MySQL服务器
-
选择数据库
-
对数据表进行增删改查
-
关闭数据库
退出
quit
exit
\q
常见操作
\c 取消未完成的操作。
\g 代替结束符
数据库操作:
show databases 查看数据库
注意:查看所有数据库,mysql数据库千万不要动。
创建数据库
create database 数据库名
注意:库名不要用中文,不要用数字开头。
注意:
1、每创建一个数据库,会在data目录下创建一个以数据库名称命名的文件夹。
2、数据库是唯一的。
删除数据库
drop database 数据库名;
进入数据库,选择数据库
use 数据库名
注意:windows下面数据库名是不区分大小写的,但是在Linux下面严格区分。
查看已经选择的数据库
select database();
数据表的操作:
查看数据库中的表: show tables;
创建数据表
create table 表名(
字段名 字段类型,
字段名1 字段类型,
字段名2 字段类型
)
最后一个字段名不需要加逗号
查看表结构:desc 表名
查看建表语句:show create table 表名
\G 让数据站起来(更直观的能够看到结果)
select * from user \G;
删除数据表:drop table 表名
数据的操作:
插入数据
插入指定字段:
insert into 表名(字段名1,字段名2,字段名3....) values (值1,值2,值3....);
如果包含空字段、非空但是有默认值的字段、自增字段可以不在insert字段列表中出现。
插入所有字段:
insert into 表名 values (值1,值2,值3.....)
不指定列名的情况下values后面的顺序应该和字段的排列顺序一致。
插入多条语句:
insert into 表名 (字段名1,字段名2,字段名3....) values (值1,值2,值3....),(值1,值2,值3),......
如果插入多条数据,使用这种方法比使用第二种或第一种方法要快的多。
插入单条数据:
insert into 表名 set 字段名1=值1,字段名2=值2....
插入某些查询的结果
查看数据 select 字段名1,字段名2 from 表名
问题:
1、如果字段太多,会导致流量浪费。
2、没有条件会将所有表里面的数据查询出来。 怎么样加条件。
where从句-----条件查询
where 要放在表名后面
where 条件中可以使用算数运算符、比较运算符、逻辑运算符
算数运算符【+、-、*、/、%】
比较运算符【>、<、>=、<=、!=、=】
逻辑运算符
MySQL里面可以给出多个条件。
and 逻辑与
or 逻辑或
注意:
1、他们可以将小条件组合成大条件,而且可以多次使用。
2、条件的合理性
3、SQL标准在处理or操作之前会优先处理and操作
其他操作符
in 操作符:指定条件范围,范围中的每个条件都可以进行匹配,in里面的每个值使用逗号隔开。
格式:in(值1,值2,值3);
between操作符,在指定的两个值之间
格式:between 起始值 and 结束值
not操作符,否定后面的操作,in和between一起使用。
like操作符
格式:like '字符串'
通配符:用来匹配值的一部分的特殊字符。
%:表示任何字符出现任一次数,可以放在任意位置。
%值:以值结尾
值%:值开头
%值%:包含了值
在SQL标准中没有经过排序的数据他的顺序是不可信的。
order by从句--对字段进行排序
格式:order by 字段名[asc | desc]
注意:
1、asc是默认值,是升序排列
2、desc是降序排列
3、通常很多人认为order by从句中使用的列必须是显示出来的列,实际上使用不显示出来的列进行排序也是合法的。
格式:order by 字段名1[asc|desc],字段名2[asc|desc]
注意:
1、值的是字段名1的值完全相同的情况下对相同的这些内容按照字段名2进行排序。
limit 从句----限制结果集
格式1:limit m
注意:m代表返回多少行。
格式2:limit n,m
注意:
1、n表示从多少开始取值(第一条数据用0表示),m表示返回多少行
2、如果没有足够的行,那么有多少就给多少。
统计查询
count()用来进行计数,count(*)用来统计有多少条数据,count(字段名)表示非null的值的个数。
min(字段名) 算出最小值
max(字段名) 算出最大值
sum(字段名) 和
avg(字段名) 平均数
group by 从句----分组
格式:group by 字段名
格式:group by 字段名 having 条件
where和having不一样。where是查询出符合条件的数据,having是对符合条件的数据进行查询。
从句的顺序:
select => from => where => group by ....having =>order by => limit
完全限定:
库名.表名
表名.字段名
别名:
字段名 as 你的别名
拼接字段:
concat();//字符或字段链接
联合查询:
步骤:
1、搞清楚表和表之间的关系
2、select * from 表1,表2
3、加上where条件
条件必须要给对了。如果不对你的结果就不对,如果不给条件就会出事。 笛卡尔乘积
4、将select * 替换为你想要的字段名
子查询
前置子查询
mysql> select *,(select count(*) from types as t2 where t2.pid=t1.id) as sCount from types as t1;
后置子查询 作为条件
mysql> select *from types where pid=(select id from types as t1 where t1.name='a ');
更改数据:
update 表名 字段名=值,字段名2=值2... where 条件
如果不加条件所有的数据表中的指定字段的值都会更改。
删除数据:
delete from 表名 where 条件
注意:
1、如果不加where条件会把表的所有记录都删除。
2、如果在使用delete的时候最好先使用select将结果查询出来。
3、要删除数据的时候不要使用delete语句建议使用truncate table 表名 因为这个快,而且还干净。
导出mysql数据库(在退出MySQL的时候)
mysqldump -u 用户名 -p 数据库名 > 导出文件名 整个数据库导出
mysqldump -u 用户名 -p 数据库名 表名 > 导出文件名 整个数据表导出
导入mysql数据库,如果你要导入必须确定这个库已经存在。(在退出MySQL的时候)
mysql -u 用户名 -p 数据库名 < 数据库文件
修改用户密码:
方法1、 mysqladmin -u 用户名 -p password 新密码 退出情况下
方法2、set password for '用户名'@'登录主机'=password('新密码'); 进入MySQL情况下
mysql忘记密码
windows方法:
1、关闭正在运行的mysql
2、打开dos跳转到mysql的bin目录下
cd C:\xampp\mysql\bin
3、输入
mysqld --skip-grant-tables回车
4、再打开一个窗口进入到mysql的bin目录下面
打开dos跳转到mysql的bin目录下
cd C:\xampp\mysql\bin
5、进入mysql回车
6、进入到mysql库
7、修改记录 update user set password=password('新密码') where user='root'
8、刷新权限
flush privileges
注意:你们现在的MySQL直接使用mysql命令就能进。MySQL在安装的时候会默认创建一个匿名用户这个匿名用户主要用来做测试,这个账号有test库的所有权限。
show databases;
为什么要删除匿名用户。(在mysql里操作)
drop user ''@'localhost';
linux方法:
MySQL root密码的恢复方法之一
如果忘记了MySQL root密码,可以用以下方法重新设置:
1.KILL掉系统里的MySQL进程;
killall -TERM MySQLd
2.用以下命令启动MySQL,以不检查权限的方式启动;
safe_MySQLd --skip-grant-tables &
3.然后用空密码方式使用root用户登录 MySQL;
MySQL -u root
4.修改root用户的密码;
MySQL> update MySQL.user set password=PASSWORD('新密码') where User='root';
MySQL> flush privileges;
MySQL> quit
重新启动MySQL,就可以使用新密码登录了。
MySQLroot密码的恢复方法二
有可能你的系统没有 safe_MySQLd 程序(比如我现在用的 ubuntu操作系统, apt-get安装的MySQL) , 下面方法可以恢复
1.停止MySQLd;
sudo /etc/init.d/MySQL stop
(您可能有其它的方法,总之停止MySQLd的运行就可以了)
2.用以下命令启动MySQL,以不检查权限的方式启动;
MySQLd --skip-grant-tables &
3.然后用空密码方式使用root用户登录 MySQL;
MySQL -u root
4.修改root用户的密码;
MySQL> update MySQL.user set password=PASSWORD('newpassword') where User='root';
MySQL> flush privileges;
MySQL> quit
重新启动MySQL
/etc/init.d/MySQL restart
就可以使用新密码 newpassword 登录了。
字段类型
在定义数据表时,会指定字段的类型。
1、整型数据
注意:
1、整形设置的长度不是能够存储多少位。而是显示的宽度。什么是显示的宽度,先留着一会告诉你。
2、整形能够存储多少数值完全是取决于最大值。
3、默认的时候整型创建的是有符号的。{大于最大值时,只显示到最大值}
问题:显示宽度、无符号是怎么回事。
2、浮点、定点
浮点数和定点数:
1、声明他们的时候,有一个M和D,M说明总共有多少位,D表示小数点后面几位。
2、浮点数如果不写精度(m)和标度(d),会按照实际精度值显示。如果有精度和标度则会自动四舍五入。
3、定点数如果不写精度和标度,会按照decimal(10,0)来进行操作。如果写的话如果超过了M和D也将会自动四舍五入
4、进行运算时浮点数将会得到一个近似值,定点数将会得到一个精确值。
MySQL float用法:
MySQL浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和 标度,如float(7,4)的可显示为-999.9999,MySQL保存值时 进行四舍五入,如果插入999.00009,则结果为999.0001。FLOAT和 DOUBLE在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。
总结:浮点数如果不写精度和标度,则会按照实际显示,如果有精度和标度,则会将数据四舍五入后插入,系统不报错,定点数如 果不设置精度和标度,刚按照默认的(10,0)进行操作,如果 数据超过了精度和标度值,则会报错。
注::如果float的(M,D)小于要插入的值,则结果为 规定(M,D)能显示的最大的值。
3、字符类型
注意:
1、text与blob两者的区别是blob用来保存二进制数据,text只能保存字符数据。
2、char和varchar可以用来存储MySQL中较短的字符串:
区别:
1、char长度为固定长度。值为0~255,varchar可变长度长度为0~65535。
2、定长(声明完成后使用固定的字节),变长(声明完成后根据你存的东西来调整存储的字节数)
a char(255) 255
a varchar(255) 1
3、char和varchar在超出长度时都会截取字符串到指定的长度。
4、定长和变长是建立在已经设定的长度范围内。
4、枚举类型
sex enum('NAN','NV')
注意:
1、枚举方式的取值范围需要在创建表的时候显式的指定。
2、如果超处了枚举里面指定的值,将会插入一个“空”。
3、枚举类型只能从值的集合中选取一个值,不能一次选取多个值。
4、enum的值不区分大小写。
5、对于1~255个成员的枚举需要1个字节来存储,如果256~65535个成员需要2个字节来存储,但是最多只能有65535个成员。
6、插入值的时候,包括在声明这个字段的时候必须要使用引号将插入的值包起来。如果直接写1或2那么表示插入enum这个类型中的第一个或第二个
5、集合类型
aihao set('a','b','c','d')
注意:
1、set类型可以存多个值。
1~8个成员 1个字节
9~16个成员 2个字节
17~24个成员 3个字节
25~32个成员 4个字节
33~64个成员 8个字节
2、set和enum除了存储以外,主要区别在于set类型一次可以选取多个值,enum只能选取一个。
3、如果有重复的成员会保留一个。
4、超出列表的范围的值会被忽略。
约束条件:对字段进行一些约束
公用的约束条件:
1、null、not null:
null:默认为null,插入值时没有往该字段中插入值,默认的时候该字段的值会为null。
not null:指定了not null的时候必须在插入值的时候在该字段给定对应的值。否则没有值。
注意:约束条件写在字段类型的后面。
2、default :在不插入该字段的时候默认插入的值。
整型约束条件:
1、zerofill,0填充。一般和整型后面的设定的宽度一起使用,如果数值长度小于指定的长度那么前面将使用0进行填充。
2、unsigned(无符号),如果要在字段里面保存非负数或需要较大的上限的时,可以使用该选项,取值范围是从0开始。
注意:unsigned必须紧跟着字段类型
3、auto_increment,自增,产生唯一标识或顺序的值的时候,可以使用该属性。这个属性只能用于整型,值一般从1开始,每行+1。插入一个null到一个auto_increment列的时候,也会进行自增。
注意:
1、使用auto_increment的时候必须后面紧跟着一个primary key 或unique才能使用。
2、出现过的最大的数+1
索引:索引是数据库中用来提高搜索性能的,我们在做数据库优化的时候通常先干的第一件事就是做索引优化。
注意:他是自动使用的,不需要我们刻意的使用。
索引的分类:
1、常规索引(index),最基本的索引,没有任何的限制。
index 索引名(字段名)
index xxoo(name)
删除索引:
drop index 索引名 on 表名;
创建完表的情况下添加索引:
create index 索引名 on 表名(字段名)
2、唯一索引(unique),和常规索引相似,但是索引列的值必须唯一。你可以给多个列加上unique
unique xoxo(name)
删除索引:
drop index 索引名 on 表名;
创建完表的情况下添加索引:
create unique index 索引名 on 表名(字段名);
3、主键索引(primary key),和唯一索引相似,一个表中只能有一个主键索引。
id int unsigned primary key,
删除索引:
alter table 表名 drop primary key;
注意:
如果说没有auto_increment可以直接删,如果有auto_increment需要先删除auto_increment然后在删除掉primary key
1、删除主键索引的时候如果该字段有auto_increment那么需要先将auto_increment删除掉,然后再删除primary key
创建索引的规则:
1、最适合创建索引的列通常是出现在where子句中的列。
2、索引不同列的值不同的越多索引效果越好。
3、数据越多索引效果越好。
4、不要过度使用索引,每个额外的索引都需要占用额外的磁盘空间。降低写的性能。
存储引擎:
引擎:用户可以根据不同的需要选择如何存储数据。可以根据引擎来提供一些功能,并且提高应用效率。
查看所有引擎 show engines
注意:
1、MyISAM表引擎,不支持事务,优势就是访问速度块。但是他是表锁,发生冲突的概率比较高。如果对事务完整性没有要求,或你的应用程序以select、insert为主的时候可以用MyISAM表引擎。
每个MyISAM在磁盘上存储成3个文件,和表名都一样。
.frm(存储表的定义)
.MYD(存储数据)
.MYI(存储索引)
2、InnoDB表:InnoDB表写的处理效果会差一些,并且占用更多的磁盘空间。但是行锁,发生冲突的概率比较低。
如果在你的应用程序中对事务的完整性有比较高的要求,数据操作除了插入、查询外还有很多的更新、删除。那么可以使用InnoDB
字符集
MYSQL字符集涉及两个概念:
字符集:用来定义MySQL存储字符串的方式。
校对规则:定义了比较字符串的方式。
一个字符集有多个校对规则。
校对规则通常以_ci结尾的表示大小写不敏感,_cs结尾的表示大小写敏感。
查看系统中的字符集 show character set;
一定要注意utf8不是utf-8
字符集分为4个级别:服务器级、数据库级、数据表级、数据字段
如果没有设置本级的字符集那么默认使用上一级的字符集
设置数据库的字符集
mysql> create database lamp129 default character set utf8;
如果设置了数据库的字符集那么,数据表的字符集就会默认使用数据库的字符集
设置数据表的字符集 charset=utf8;
乱码问题:
1、保证你的页面存储格式是UTF-8格式。无bom
2、保证你的浏览器解析的时候是UTF-8
3、保证你的数据库中是utf8格式。
4、链接的字符集也要是utf8
mysql_set_charset('utf8');
在创建表的时候你没有设定字符集
1、更改表的字符集
2、更改字段的字符集
//获得auto_increment列最后自增的值。
mysql_insert_id();//这里面不用写参数,如果要写也是写链接的资源。
改表的字符集
alter table 表名 default charset=要修改字符集
alter table 表名 modify 字段名 字段类型 约束条件 character set 你要修改的字符集
修改表
语法:alter table 表名 动作
修改表的字段名并且修改字段类型:alter table 表名 change 旧字段名 新字段名 字段类型 约束条件
修改表的字段类型:alter table 表名 modify 字段名 字段类型
注意:change可以改变字段名、modify不可以。但是都能改变字段类型。
添加字段:alter table 表名 add 字段名 字段类型 [first|after 字段名]
mysql> alter table user add height double(3,2);
删除字段:alter table 表名 drop 字段名
修改表名:alter table 旧表明 rename as 新表明
修改字符集:alter table 表名 default character set 新字符集
注意:
1、如果真的更改了表的字符集那么,字段中的字符集是不会自动更改的