前言
通过在华清远见学习MySQL的几天,知识点虽然简单,但是比较多,写一篇博客将MySQL的基础写出来,方便自己以后查找,还有就是分享给大家。
目录
一、数据库简介
MySQL是一种关系型数据库管理系统,它将数据保存在不同的表中。因此它的灵活性强,速度快强。它具有两种模式:商业版跟社区版,一般新手都会选择社区版来创建自己的数据库系统。由于它的体积小、速度快、成本低、最重要的是开放源码,所以中小型的公司都喜欢使用它作为网站数据库
二、数据库命令
1.数据库命令
show databases;//查看当前mysql的所有数据库
create database 数据库名;//创建数据库
use 数据库名;//使用该数据库
drop database 数据库名;//删除数据库
2.表命令
创建数据库 create database 数据库名
选择数据库 use 数据库名
例:
create database myjava1;
use myjava1;
1.创建表
注意:所有符号均是英文状态下标点符号
create table 表名(
字段名 类型 <约束>,
字段名 类型 <约束>,
......
字段名 类型 <约束>
);
添加约束的时机:
1.创建表时
2.修改表时
约束的添加分类:
列级约束:语法上都支持,但外键约束没有效果,不支持列级约束。
表级约束:除了非空、默认、其它的都支持
语法:在创建表字段的最下面 constraint 约束名 约束类型(字段名)
建表时,外键约束写成表级约束,其余字段写成字段约束。
例:
create table country(
id int primary key auto_increment,
name varchar(10) unique,
language varchar(19) not null
);
create table president(
id int primary key auto_increment,
name varchar(10) unique,
sex char(1) not null,
f_country_id int,
constraint fk_country_id foreign key(f_country_id) references country(id)
);
2.删除表
删除表命令:drop table 表名;
#Cannot delete or update a parent row: a foreign key constraint fails
#country被外键关联,不能删除,先删除关联country的表
drop table country;
3.查看表
show tables;//查看当前数据库下所有的表
4.查看表结构
desc 表名;//查看该表的表结构
5.更改表结构
1.1 向表名中增加列名
alter table 表名 add column 列名 字段类型;//
alter table student add column sex char(1);
更改表student,添加列列名是sex,类型是char(1);
1.2 删除表中某一列
alter table 表名 drop column 列名;
alter table student drop column age;
更改表student,删除列,列名是age;
1.3 修改表中某个列的字段类型
alter table 表名 modify column 列名 字段类型;//
alter table student modify column sex char(2);
更改表student,修改列,列名是sex,更改类型为char(2)
1.4 更改表的名字
alter table 表名rename to 新表名;// to可以省略
alter table student rename to stu;
更改表student,将student表名更改为stu;
1.5 更改列名
alter table 表名 change 原有列名 新的列名 新列名字段类型;
alter table stu change name xingming varchar(10);
更改表stu,将列名name改为xingming,字段类型varchar(10)
6.复制表
复制一个表结构的实现方法有两种。
方法一:在create table语句的末尾添加like子句,可以将源表的表结构复制到新表中,语法格式如下。主键约束自动增长有,外键约束没有。
create table 新表名 like 源表
create table pre11 like president;//根据president表创建pre11表
方法二、在create table语句的末尾添加一个select语句,可以实现表结构的复制,甚至可以将源表的表记录拷贝到新表中。下面的语法格式将源表的表结构以及源表的所有记录拷贝到新表中。主键约束,自动增长和外键约束就没有了
create table 新表名 select * from 源表
create table pre12 select * from president;//根据president表创建pre12,并且将数据复制
7.修改表约束条件
表已经创建,使用alter table命令修改表结构,给表添加约束条件
- 添加约束条件
- 向表的某个字段添加约束条件的语法格式如下(其中约束类型可以是唯一性约束、主键约束及外键约束)。
alter table 表名add constraint 约束名 约束类型(字段名)
练习:
增加主键约束
alter table 表名 add constraint 约束名 primary key(列名);
alter table pre12 add constraint primary key(id);
增加唯一性约束:
alter table person add constraint name_unique unique (name);
增加外键约束 foreign key
alter table pre12 add constraint
foreign key(f_country_id) references country(id);
//给pre12表中f_country_id这个字段添加外键约束
删除约束条件
alter table 表名drop 约束类型 约束名
删除主键约束,语法格式如下。
alter table 表名drop primary key
删除表的外键约束
需指定外键约束名称,语法格式如下(注意需指定外键约束名)。
alter table 表名drop foreign key 约束名
alter table pre12 drop foreign key pre12_ibfk_1;
删除表字段的唯一性约束,
实际上只需删除该字段的唯一性索引即可,语法格式如下(注意需指定唯一性索引的索引名)。
alter table 表名drop index 索引名;
例如:
alter table person drop index name_unique;
三.数据命令
dept,emp表
复制dept1,emp1表
create table dept1 like dept;
create table emp1 like emp;
复制表结构命令主键约束、自动递增都会复制。外键约束不会复制
给emp1表添加外键约束,关联的是dept1表主键
alter table emp1 add constraint fk_dept_deptno foreign key(deptno) references dept1(deptno);
1.增加数据
语法:
- 插入部分列
insert into 表名(列名1,列名2,列名3.。。。)values (值1,值2,值3.。。。)
-- 在部门表中插入一条数据
insert into dept1( dname, loc) values('财务', '沈阳');
- 语法2:插入所有列
insert into 表名values(值1,值2,值3.。。)
注意:值得顺序要和表定义中列的顺序一致。
-- 在部门表中插入一条数据
insert into dept1 values(2, '财务', '沈阳'); #指定主键deptno
insert into dept1 values(null, '财务', '沈阳');#没有给主键deptno传值,用数据库自增长
- 每次插入多条记录-----批量插入
insert into 表名[(列名……)] values (第一组值), (第二组值), (第三。。。。);
insert into dept1 values (1,'教学部','沈河区'),(2,'人资部','沈河区');
说明:
值:数字,直接写值就可以,
字符串:‘值’
空: null
sysdate() #得到系统当前时间
日期date: ‘yyyy-MM-dd’
datetime ‘yyyy-MM-dd HH:mm:ss’
timestamp ‘yyyy-MM-dd HH:mm:ss’
time ‘HH:mm:ss’
如果timestamp 和datetime中插入null, timestamp中插入的还是系统的当前时间。Datetime中插入的是空。
2.删除数据
- 删除语法:delete from 表名 [where 条件]
- 清除数据(truncate 表名)
- 清除和删除的区别:删除(delete):可以添加where条件删除指定数据,数据可以恢复,通过回滚rollback;,为保证数据恢复,能够记日志,速度慢。清除(truncate):不能添加where条件,只能全表删除,数据不可以恢复。没有记日志功能,速度快。
- 删除基础表(主表)中的记录时,如果这条记录已经被别的表引用了,那么这条记录不能删除。如果没有被引用,那么是可以删除的。
-
set autocommit = 0; 不自动提交事务
commit; 提交事务,让增删改语句生效
rollback:执行回滚,事务里执行的增删改语句不生效。
什么时候使用事务: Insert, delete, update 使用事务。
- 删除主表的数据,看级联关系:on delete no action---默认:如果主表数据被外键引用,不允许删除。如果没被引用可以删除。on delete set null---外键置空:如果主表数据被外键引用,允许删除,外键值为null;on delete cascade---级联删除:如果主表数据被外键引用,允许删除,关联数据也被删除。
- 修改数据命令
语法:
update 表名
Set 列名1=值1[, 列名2=值2,。。。。]
[Where 条件语句]
-
查询命令:select 字段1,字段2,... from 表名;
四.数据库相关概念
1.三大范式
第一范式:字段不能再分; (必须符合)
比如对于物流系统中的收货人信息,对于地址字段,数据库的设计可以是:
address: 辽宁省沈阳市沈河区区XXX路XXX号。
系统经常会访问“地址”属性中的不同部分,那么就将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样就满足了数据库的第一范式。
第二范式:每个表必须有主键,必须让表中每列都和主键相关;
每一列都必须完全依赖于主键,而不能部分依赖于主键(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
第三范式:确保每列都和主键列直接相关,而不是间接相关
一个表只能有自己的列(直接依赖于主键),以及外键。不能有其他表的非主键字段。
2.表与表间的关联关系
一对一
一对多(多对一)
多对多
3.字段约束
主键字约束(primary key) 值不能为空,并且值唯一
外键字约束(foreign key) 值必须为指向的表的主键值
惟一性约束(unique)值唯一
非空约束 (not null) 值不能为空
检查约束(check)值为符合指定条件的值,Mysql不支持
缺省约束(default)相当于值没有约束
4.字段类型
float(M,D), double(M, D)
M 表示总位数(不包括小数点和正负号), D表示小数位。表示近似值。
decimal(M, D):
M 表示总位数(不包括小数点和正负号), D表示小数位。
不同于浮点数的四舍五入,是一个精确值
日期: date (yyyy-mm-dd)时间:time(hh:mm:ss)
-- datetime (yyyy-mm-dd hh:mm:ss)。插入 null, 系统也插入null.
-- 时间戳(timestamp)(yyyy-mm-dd hh:mm:ss): 一般是某个操作对应的具体时间点。插入null, 系统会插入一个当前时间。每当行被更改时,时间戳字段将获取当前时间戳。
char 定长字符串,速度快,但浪费空间
varchar: 变长字符串,速度慢,但节省空间。
M表示能存储的最大长度,此长度是字符数,非字节数。不同的编码所占用的空间不同。
char: 最多255个字符,与编码无关。
varchar:最多65535个字符,与编码有关。
utf8 一个字符占3个字节, gbk是占双字节。
1. varchar是变长的,需要利用存储空间保存varchar的长度,如果数据小于255个字节,则采用1个字节来保存长度,超过255个字节,需要两个字节来保存。两个字节最多能保存2的16次方也就是65535个字节,如果用utf8的编码格式,那么最大的字符数 65535/3。
2. 一条有效记录最大不能超过65535个字符。所以varchar的字符长度还会小于1中的65535/3.
char(M)和varchar(M)的区别:char无论存储多少个字符,都分配M个空间。varchar根据输入的空间分配,如果输入的小于M,就分配实际的空间。设计数据库时,如果输入时定长用char,比如性别。如果输入是变长,用varchar,比如自我介绍。
存储钱使用什么类型,decimal
总结
重要(从关键字分析):
查询语句的书写顺序和执行顺序
select ===> from ===> where ===> group by ===> having ===> order by ===> limit
查询语句的执行顺序
from ===> where ===> group by ===> having ===> select ===> order by ===> limit