启动数据库 net start mysql
关闭数据库 net stop mysql
进入数据库 mysql -uroot -p
退处数据库 q
mysql会自动寻找分号作为语句结束符。
注释(单行注释):双中划线+空格(– );也可以使用#
查看警告 show warnings;
创建数据库 create database数据库名字 charset utf8;
删除数据库 Drop database 数据库名;
查看创建数据库信息 Show create database 数据库名字;
当删除数据库语句执行之后,发生了什么?
1.数据库被删除,查看不到该数据库
2.在对应的数据库存储的文件夹内:数据库名字对应的文件夹也被删除(级联删除:里面的数据全被删除)
3.删除不可逆,应先备份再删除
表操作:表与字段密不可分.
新增数据表
create table [if not exists] 表名(字段名字 数据类型;字段名字 数据类型)[表选项]
if not exists:如果表名不存在,那么就创建,否则不执行创建代码:检查功能
表选项:控制表的表现
字符集:charset/character set 具体字符集; 保证表中数据存储的字符集
校对集:collate 具体校对集;
存储引擎:engine 具体的存储引擎(innodb和myisam)
新增表前必须进入某个数据库,然后在操作
进入数据库 use 数据库名字;
然后创建表如:
create table class(
name varchar(10),
room varchar(10)
)charset utf8;
查看数据表 show tables;
查看部分表 模糊查询pattern
show tables like ’%s’;
查看表的创建语句 show create table 表名G
查看表结构:查看表中的字段信息(以下四种方式都可以)
Desc/describe/show columns from 表名;
desc class;
describe class;
show columns from class;
修改数据表
重命名表 rename table 旧表名 to 新表名;
修改表选项 alter table 表名 值;
新增字段 alter table 表名 add[column] 字段名 数据类型 [ 列属性][位置]
修改字段 alter table 表名 modify 字段名 数据类型 [属性][位置]
重命名字段 alter 表名 change 旧字段 新字段名 数据类型 [属性][位置];
删除字段 alter 表名 drop 字段名;
删除数据表 drop table 表名1,表名2,表名3…;
数据操作
新增数据
方案1.给全表字段插入数据,不需要指定字段列表:要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致:凡是非数值数据,都要使用引号(建议是单引号)
insert into 表名 valuse(值列表)[,(值列表)];
方案2.给部分字段插入数据,需要选定字段列表出现的顺序与字段的顺序无关;但是值列表的顺序必须与选定的字段的顺序一致.
insert into 表名(字段列表)values(值列表)[,(值列表)];
查看数据 select */字段列表 from 表名 [where条件];
更新数据 update 表名 set 字段=值[where条件];
删除数据 delete from 表名 [where条件];
查看服务器识别哪些字符集 show character set;
查看服务器默认对外处理字符集 show variables like ‘character_set%’;
改变服务器默认的客户端字符集 set character_set_client=gbk;
改变服务器给定数据的字符集为GBK set character_set_results=gbk;
校对集问题
校对集:数据比较方式
校对集有三种方式
_bin:binary二进制比较,取出二进制位u,一位一位的比较,区分大小写
_cs:case sensitive,大小写敏感,区分大小写
_ci:case insensitice,大小写不敏感,不区分大小写
查看数据库支持的校对集 show collation;
校对集应用:只有数据产生比较的时候,校对集才会生效。
比较:根据某个字段进行排序:order by 字段名[asc|desc];asc 升序,desc 降序,默认是升序
web乱码问题:
动态网站由三部分构成:浏览器,apache浏览器(PHP),数据库服务器,三个部分
都有自己的字符集,数据需要在这三个部分之间来回传递:很容易产生乱码。
解决:统一编码(三码合一),事实不可能
数据类型(列类型)
数值型数据:都是数值
数值型:整数型和小数型
整数型数据:在SQL中为考虑节省磁盘空间,系统将整型又细分5类
Tinyint:迷你整型,使用一个字节存储,表示的状态最多为256种(常用)
smallint:小整型,使用2个字节存储,表示的状态最多为65536种
mediumint:中整型,使用3个存储字节
int:标准整型,使用4个字节存储(常用)
bigint:大整型,使用8个字节存储
SQL中的数据类型都是默认有符号的:分正负
有时候需要使用无符号数据:需要给数据类型限定:int unsigned
查看表结构的时候,发现每个字段的数据类型之后都会自带一个括号,里面有指定的数字是指显示宽度:数据最终显示的位数
小数型(浮点型)
SQL中:将小数型细分为两种:浮点型和定点型
浮点型:小数点浮动,精度有限,会丢失精度
定点型:小数点固定,精度固定,不会丢失精度
浮点型
浮点型数据是一种精度数据,因为超出指定范围之后,会丢失精度(自动四舍五入)
浮点型:理论分为两种精度
float:单精度,占用4个字节存储数据,精度范围大概为7位左右
double:双精度,占用8个字节存储数据,精度范围大概为15位左右
浮点型数据的插入:整型部分不可以超出长度,但是小数部分可以超出(系统会自动四舍五入)
定点型
定点型:绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分有可能(理论小数部分也不会丢失精度)
插入数据:定点数的整数部分一定不能超出长度(进位不可以),小数部分的长度可以随意超出(系统自动四舍五入)
时间日期类型
datetime:时间日期
插入数据:时间time可以是负数如:
insert into my_date values('2017-4-26 17:29:08','2017-4-26','17:30:13','2017-4-26 17:30:39',2017);
insert into my_date values('2017-4-26 17:29:08','2017-4-26','-17:30:13','2017-4-26 17:30:39',2017);
insert into my_date values('2017-4-26 17:29:08','2017-4-26','-177:30:13','2017-4-26 17:30:39',2017);
insert into my_date values('2017-4-26 17:29:08','2017-4-26','-2 17:30:13','2017-4-26 17:30:39',2017)
insert into my_date values('2017-4-26 17:29:08','2017-4-26','17:30:13','2017-4-26 17:30:39',69);
insert into my_date values('2017-4-26 17:29:08','2017-4-26','17:30:13','2017-4-26 17:30:39',70);
timestamp:只要当前所在的记录被更新,该字段一定会自动更新成当前时间
– timestamp
update my_date set d1=’2017-4-26 17:41:40’ where d5=2069;
字符串类型
在SQL中,将字符串分成了6类:char,varchar,text,blob,enum和set
定长字符串:char,磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度。
char(L):L代表length。可以存储的长度,单位为字符,最大长度值可以为255.
变长字符串:varchar,在分配空间的时候,按照最大的空间分配:但是实际上最终用了多少,是根据具体的数据来确定
varchar(L):L表示字符长度,理论长度是65536个字符,但是会多出1到2个字节来确定存储的实际长度
定长与变长字符串的区别:定长的磁盘空间比较浪费,但是效率高:如果数据基本上确定长度都一样,就是使用定长
变长的磁盘空间比较节省,但是效率低:如果数据不能确定长度(不同数据有变化)
文本字符串
如果数据量非常大,通常说超过255个字符就会使用文本字符串
文本字符串根据存储的数据的格式进行分类:text和blob
Text:存储文字(二进制数据实际上都是存储路径)
Bolb:存储二进制数据(通常不用)
枚举字符串
枚举:enum,事先将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据中的一个
枚举原理:枚举进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中);然后进行数据
插入的时候,系统自动将字符转换成对应的数字存储,然后在进行数据提取的时候,系统自动将数值转换成对应的字符串显示.
集合字符串
集合跟枚举类似:实际存储的是数值,而不是字符串(集合是多选)
集合使用方式:
定义:set(元素列表)
使用:可以使用元素列表中的元素(多个),使用逗号分隔
列属性
列属性:真正约束字段的是数据类型,但是数据类型的约束很单一,需要有一些额外的约束来更加保证数据的合法性。
列属性:NULL/NOTNULL,default,primary key,unique key,auto_increment,comment
空属性:NULL(默认的)和NOT NULL(不为空)
列描述:comment,描述,没有实际含义:是专门用来描述字段,会根据表创建语句保存:用来给数据库管理员来进行了解的。
默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好:在需要真实数据的时候,用户可以选择性的使用默认值。
默认值关键字:default
主键:primary key,一张表只能有一个字段可以使用对应的键,用来唯一的约束该字段里面的数据,不能-重复:这种称之为主键。
一张表只能最多一个主键。
增加主键:
1.在创建表的时候,直接在字段之后,跟primary key关键字(主键本身不允许为空)
2.复合主键
3.当表已经创建好,再次额外追加主键:可以通过修改字段属性,也可以直接追加
主键约束
主键对应的字段中数据不允许重复:一旦重复,数据操作失败(增改)
删除主键:
alter table 表名 drop primary key;
主键分类:
在实际创建表中,很少使用真实业务数据作为主键字段(业务主键,如学号,课程号);
大部分的时候是使用逻辑的字段(字段没有业务含义),将这种字段称之为逻辑主键
自动增长
自增长:当对应的字段,不给值,或者给默认值,或者给NULL的时候,会自动的被系统触发,
系统会从当前字段中已有的最大值在进行+1操作,得到一个新的不同的字段
自增长通常是跟主键搭配.
自增长特点:auto_increment
1.任何一个字段要做自增长必须前提是本身是一个索引(key一栏有值)
2.自增长字段必须是数字(整型)
3.一张表最多只能有一个自增长
修改自增长
自增长如果涉及到字段改变:必须先删除自增长,后增加(一张表只能有一个自增长)
修改当前自增长已经存在的值:修改只能比当前以有的自增长的最大值大,不能小(小不生效)可以修改变量实现不同的效果:修改是对整个数据库修改,而不是单张表(修改是会话级)
唯一键
一张表往往有很多字段需要具有唯一性,数据不能重复:但是一张表中只能有一个主键:唯一键(unique key)就可以解决表中有多个字段需要唯一性约束问题
增加唯一键:
1.在创建表的时候,字段之后直接跟unique/unique key
2.复合唯一键
删除唯一键 alter table 表名 drop index 索引名子;
索引
mysql中索引:
1.主键索引:primary
2.唯一索引:unique key
3.全文索引:fulltext index
4.普通索引:index
连接查询
分成四类:
1.内连接
2.外连接
3.自然连接
4.交叉连接
交叉连接:cross join,从一张表中循环取出每一条记录,每条记录都去另外一张表进行匹配;
匹配一定保留(没有条件匹配),而连接本身字段就会增加(保留),最终形成的结果叫做:笛卡尔积.
基本语法:左表 cross join 右表;======from 左表,右表;
select * from my_student cross join my_class;
内连接:inner join,从左表中取出每一条记录,去右表中与所有的记录进行匹配:匹配必须是某个条件在左表中与右表中相同最终才会保留,否则不保留
基本语法:右表 join on 左表.字段=右表.字段;on表示连接条件;条件字段就是代表相同业务含义。
外连接:outer join,以某张表为主,取出里面所有的记录,然后每条与另外一张表进行连接;
不管能不能匹配上条件,最终都会保留。能匹配,正确保留;不能匹配,其他表的字段都置空NULL.
外连接:以主表为主:有主表
left join:左连接,以左表为主表
right join:右连接,以右表为主表
基本语法:左表 left/right join 右表 on 左表.字段=右表.字段;
自然连接:natural join,自然连接,就是自动匹配连接条件:系统以字段名字作为匹配模式(同名字字段就作为条件,多个同名字字段都作为条件)
自然连接分为:自然内连接,自然外连接
基本语法:
自然内连接:左表 natural join 右表;
自然外连接:左表 natural left/right 右表;