MySQL数据库

前言

通过在华清远见学习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.增加数据

语法:

  1. 插入部分列

insert into 表名(列名1,列名2,列名3.。。。)values (值1,值2,值3.。。。)

-- 在部门表中插入一条数据

insert into dept1( dname, loc) values('财务', '沈阳');

  1. 语法2:插入所有列

insert into 表名values(值1,值2,值3.。。)

注意:值得顺序要和表定义中列的顺序一致。

-- 在部门表中插入一条数据

insert into dept1 values(2, '财务', '沈阳'); #指定主键deptno

insert into dept1 values(null, '财务', '沈阳');#没有给主键deptno传值,用数据库自增长

  1. 每次插入多条记录-----批量插入

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.删除数据

  1. 删除语法:delete from 表名 [where 条件]
  2. 清除数据(truncate 表名)
  3. 清除和删除的区别:删除(delete):可以添加where条件删除指定数据数据可以恢复,通过回滚rollback;为保证数据恢复,能够记日志,速度慢。清除(truncate):不能添加where条件,只能全表删除数据不可以恢复。没有记日志功能,速度快
  4. 删除基础表(主表)中的记录时,如果这条记录已经被别的表引用了,那么这条记录不能删除。如果没有被引用,那么是可以删除的。
  5. set autocommit = 0;  不自动提交事务

    commit;   提交事务,让增删改语句生效

    rollback:执行回滚,事务里执行的增删改语句不生效。

    什么时候使用事务: Insert, delete, update 使用事务。

  6. 删除主表的数据,看级联关系:on delete no action---默认如果主表数据被外键引用,不允许删除。如果没被引用可以删除。on delete set null---外键置空如果主表数据被外键引用,允许删除,外键值为null;on delete cascade---级联删除:如果主表数据被外键引用,允许删除,关联数据也被删除。
  7. 修改数据命令

    语法:

     update 表名

        Set 列名1=值1[, 列名2=值2,。。。。]

         [Where 条件语句]

  8. 查询命令: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
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值