MySQL 入门
1.mysql是什么?
mysql本质就是一个c/s架构的套接字软件
2.数据库基本概念
数据库服务器:运行有数据库管理软件的计算机
数据库管理软件:mysql
库:文件夹
表:文件
记录:文件中的一行的内容
3.针对库、表、记录的操作
3.1 库\文件夹:
增:
create database 库名 charset 编码;
改:
aliter database 库名 charset 编码;
查:
show databases;
show create database 库名;
删:
drop database 库名;
3.2 表\文件:
操作表前要先切换到库下:use 库名;
建表的完整语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
增:
create table 表名(字段名 类型,...);
改:
改字段类型\约束条件:
alter table 表名 modify 字段名 类型(长度\宽度);
改字段名\类型\约束条件:
alter table 表名 change 旧字段名 新字段名 类型(长度\宽度);
查:
查看所有表:
show tables;
查看指定表:
show create table t1;
查看表结构:
desc 表名;
删:
drop table 表名;
清空表:
truncate 表名;
#清空表应该使用truancate,不仅删除所有记录,而且将自增字段的值归0
3.3 记录\文件中一行行内容:
增:
方式一(指定字段名插入):
insert into 表名 (字段名,字段名,...) values (值1,值2,...),...;
方式二(默认位置插入):
insert into 表名 values (值1,值2,...),...;
改:
update 表名 set 字段名=内容 where 条件;
查:
select 字段名 from 表名;
删:
delete from 表名 where 条件;
#delete 只能用于删除符合条件的某几条记录,不能用于清空表
4.存储引擎
存储引擎就是表的类型
不同的类型会对应不同的处理机制
测试:
create table t3(id int)engine='innodb';
create table t4(id int)engine='myisam';
create table t5(id int)engine='blackhole';
create table t6(id int)engine='memory';
insert into t3 values(1);
insert into t4 values(1);
insert into t5 values(1);
insert into t6 values(1);
5.数据类型
primary #主键(不能为空的意思)
auto_increment #自动增长
default #默认值
5.1 数字类型:整型(默认有符号),浮点型
类型设置成无符号:unsigned
#整型类型:数据类型宽度限制的是显示宽度而非存储宽度
整型:
tinyint #占1字节
smallint #占2字节
mediumint #占3字节
int #占4字节
bigint #占8字节
浮点型:
float #占4字节
double #占8字节
decimal #手动指定字节
5.2 字符类型:
char_length(字段名) #用于查看某字段包含的字符个数
char #定长
varchar #变长
例:
char(5)
相同点:最大能存放5个字符
不同点:假设传入3个字符,会补全2个字符
#注意:
针对char类型,在存放时会将字符补全为5个,在查询时又会将末尾补全的空格去掉
不让mysql去掉末尾空格的方法:
通过修改sql_mode,添加 sql_pad_char_to_full_length
varchar(5)
相同点:最大能存放5个字符
不同点:假设传入3个字符,就存3个字符
like:
where 字段名 like
like是模糊匹配
%:任意个数的任意字符
_:1个任意字符
大文本类型:
text系列(文本是带有编码)
tinytext
text
mediumtext
longtext
blob系列(也是字符数据,但是不带编码)
tinyblob
blob
mediumblob
longblob
二进制类型:
binary系列(存储二进制数据)
binary
varbinary
5.3 日期类型:time,date,datetime,timestamp,year,
now() #此函数用于获取当前时间
5.4 枚举类型:
enum #多选一
5.5 集合类型:
set #多选多
6.表操作之约束条件
约束条件:约束条件是在类型之外为字段附加的限制
强调:如果表的类型为innodb储存引擎,在创建表时,必须定义一个主键
如果不指定,innodb存储引擎会自上而下寻找一个不为空且唯一的字段当做主键
如果不指定并且也没有not null+unique的字段,那么innodb存储引擎会生成一个隐藏的字段当做主键
primary key #标识该字段为该表的主键,可以唯一的标识记录
单从约束角度去看,主键的约束效果是not null+unique
foreign key #标识该字段为该表的外键
限制关联表某一个字段的值必须是来自于被关联表的一个字段
注意:
1.被关联的字段必须是一个key,通常是id字段
2.创建表时:必须先建立被关联的表,才能建立关联表
3.插入记录时:必须先往被关联的表插入记录,才能往关联表中插入记录
#关联表
create table emp(
id int primary key auto_increment,
name varchar(15),
age int,
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
);
insert into emp(name,age,dep_id) values
('hades',18,1),
('iggy',28,2),
('egon',38,2),
('alex',30,1),
('xingchen',18,3);
#被关联表
create table dep(
id int primary key auto_increment,
dname varchar(20),
info varchar(50)
);
insert into dep(dname,info) values
('it','技术部门'),
('sale','销售部'),
('hr','人事部');
#ps:删除时,应该先删除关联表emp中的记录,再删除被关联表对应的记录
not null #标识该字段不能为空
unique key #标识该字段的值是唯一的
auto_increment #标识该字段的值自动增长(整数类型,而且为主键)
default #为该字段设置默认值
unsigned #无符号
zerofill #使用0填充
#找两张表关系的窍门
emp dep
#1.先站在左边的角度去找左表emp的多条记录能否对应右表dep的一条记录
翻译:多个员工能否属于一个部门
#2.然后站在右表的角度:去找右表dep的多条记录能否对应左表emp的一条记录
翻译:多个部门能否拥有同一名员工
#多对一结果的判断
1.如果只有单向多对一成立,最终关系就是多对一
2.在emp表新增一个字段dep_id,该字段外键关联dep(id)
#多对多结果的判断
1.双向的多对一就是多对多
2.需要建立第三张表,有一个字段的值fk左表,一个字段的值fk右表
create table author(
id int primary key auto_increment,
name varchar(16),
age int
);
create table book(
id int primary key auto_increment,
bname varchar(20),
price int
);
create table author2book(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);
#一对一:无需参考窍门,左表的一条数据唯一对应右表的一条记录
7.表操作
1.修改表名
alter table 表名 rename 新表名;
2.增加字段
alter table 表名 add 字段名 数据类型[完整性约束条件...],add 字段名 数据类型[完整性约束条件...];
alter table 表名 add 字段名 数据类型[完整性约束条件...] first;
alter table 表名 add 字段名 数据类型[完整性约束条件...] after 字段名;
3.删除字段
alter table 表名 drop 字段名;
4.修改字段
alter table 表名 modify 字段名 数据类型 [完整性约束条件...];
alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束条件...];
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件...];
5.复制表
#在查询语句前加上create table 表名
create table user select host,user,password,select_priv from mysql.user;
#复制表结构
create table user1 select host,user,password,select_priv from mysql.user where 3<1;
8.记录的增、删、改
1.插入完整数据(顺序插入)
语法一:
insert into 表名(字段1,字段2,字段3...字段n) values(值1,值2,值3...值n);
语法二:
insert into 表名 values (值1,值2,值3...值n);
2.指定字段插入数据
语法:
insert into 表名(字段1,字段2,字段3...) values (值1,值2,值3...);
3.插入多条记录
语法:
insert into 表名 values
(值1,值2,值3...值n),
(值1,值2,值3...值n),
(值1,值2,值3...值n);
4.插入查询结果
语法:
insert into 表名(字段1,字段2,字段3...字段n)
select (字段1,字段2,字段3...字段n) from 表2
where ...;
9.更新数据update
语法:
update 表名 set
字段1=值1,
字段2=值2,
where condition;
示例:
update mysql.user set password=password('123')
where user='root' and host='localhost';
10.删除数据delete
语法:
delete from 表名
where condition;
示例:
delete from mysql.user
where password='';
上一篇: MySQL5.7.17解压版安装
下一篇: PHP数组游标实现对数组的各种操作详解