【Mysql 基础部分:增删改查】简单理解

一、常见的数据库管理系统

oracle数据库,Mysql数据库(免费的),DB2,sybase,Access数据库等

  • oracle数据库是美国甲骨文公司所开发的,但一般用于银行,金融等部门,软件自身是免费的,但数据库用于商业用途,就需要购买相应产品的License,这是一笔不小的数目,就连腾讯,阿里巴巴这样的大公司都开发自己的数据库!
  • 2009年 oracle公司,以74亿美元的价格收购了sun公司,可见oracle甲骨文公司的雄厚资本;之前IBM公司也想吞并sun公司,但失败了,我们学java所用的eclipse可视化工具就是IBM公司开发的,eclipse单词的意思就是:日食,但吞并sun公司失败!
  • mysql数据库是我们最常用的,但它也难逃被oracle收购的命运

二、sql、DB、DBMS分别是什么

  • sql是结构化查询语言,标注的sql语言适用于所有数据库产品,也就是说sql适用于mysql和oracle,但可以在mysql上运行的代码不一定可以在oracle上运行,反之也是一样的
  • DB:Database的简称,数据库在硬盘上以文件方式存在,可以看作一个仓库,不过是存储数据的仓库
  • DBMS:数据库管理系统,DBMS通过sql语句来操作DB中的数据,从而完成需求

三、SQL语句包括增删查

  • DQL(查询语句):凡是select语句都是DQL
  • DML:包括inster,delete,updata等对表中数据进行增删改
  • DDL;create,drop,alter等对表结构进行增删改
  • TCL:commit提交事务,rollback回滚事务等

四、操作数据库

  • 进入mysql的两种方式

1、格式:mysql -u帐号 -p密码
2、mysql -u帐号 -p;按enter会提示你输入密码(Enter pssword:),此时你写的密码就会显示为***这样。

  • 创建数据库

create database 数据库名;

  • 查看存在的数据库

show databases;

  • 使用数据库

use 数据库名

  • 删除数据库

drop database 数据库名;

五、创建、修改、删除表

  • 创建表

create table 表名( 属性名 数据类型 [完整性约束条件]);

  • 查看表结构
  • describle 表名;(可简写:desc 表名);
  • show create tables 表名;
  • 修改表
  • 改表名:alter table 表名 rename 新表名;
  • 修改表字段数据类型:alter table 表名 modify 属性名 数据类型;
  • 修改字段名:alter table 表名 change 旧属性名 新属性名 新数据类型
  • 增加总段:alter table 表名 add 属性名1 数据类型 [约束条件] [first| after 属性名2];
  • 删除字段:alter table 表名 drop 属性名;
  • 删除表的外键:alter table 表名 drop foreign key 外键别名;

五、数据类型

(一)、整数类型

在这里插入图片描述

我们知道:1个字节= 8位二进制数。 每个类型的取值范围也就能够知道,比如 TINYINT占用1个字节,也就是8位,2的8次方减1等于255,也就是说如果代表没符号的整数,该取值范围为0到255,如果是有符号的,最高位为符号号位,也就是2的7次方减1,也就是127,取值范围为-128~127, 为什么需要减1,这个问题就需要考虑临界值的问题了

(二)、浮点数类型和定点数类型

在这里插入图片描述

1、什么时候使用FLOAT、DOUBLE、DECIMAL
答:对精度要求比较高的时候,比如货币、科学数据等,使用DECIMAL的类型比较好。其他的时候,看你要存放的数据的大小而定了,一般使用DOUBLE。并且在使用浮点数时需要注意,尽量避免做浮点数的比较,比如加、减,谁大谁小,这样的操作,会引起精度缺失。相信在一些程序语言中,遇到过float精度丢失的问题。
2、 解释M,D的意思:
M:数值的总位数。就是看数字总个数,比如,3.1415,M就是5
D:小数点后面保留的位数。 比如上面的3.1415 ,D就是4。

(三)、日期与时间类型

在这里插入图片描述

(四)、字符串类型

在这里插入图片描述

1、 CHAR和VARCHAR 的区别
CHAR(M): 为固定长度字符串,固定长度的意思就是M的值为多少,那么该M的值就是其实际存储空间的值,就算插入的数据少于M位,其存储空间还是那么大,多余的用空格补齐。在输出时,空格将被删除不输出。M最大为255,比如char(4),如果插入abc,则存储的值为’abc ‘后面多了一个空格,输出还是‘abc’, 存储空间还是占4个字节。M最大为255
VARCHAR(M): 长度可变的字符串,跟CHAR相反,会根据实际的大小值来确定存储空间的大小,比如 VARCHAR(4),插入’ab’,则存储空间为3字节,看上面图就知道VARCHAR会多一个字节用来存储长度,M最大为65535.
注意:字符串跟数值类型不一样,M为多大,就最多能插入多少字符,超过了M,就会报错
2、 ENUM
枚举,格式:字段名 ENUM(‘值1’,‘值2’,‘值3’…,‘值n’);只能取列中的一个元素
3、 SET
格式:字段名 SET(‘值1’,‘值2’,‘值3’,‘值4’…,‘值n’);可以取列中1到多个值

(五)、二进制类型

在这里插入图片描述

六、查找数据

(一)、单表查询(常用的)
  • 我就不列举底下语句的用法,都相对简单,多练就熟悉了

1、[not] in (元素1,元素2,…元素n);
2、 between 取值1 and 取值2(说明取值1和取值2范围都是闭区间)
3、 [not] like ‘字符串’;(其中%代表任意长度;_代表单个字符)
4、 查询空值:is [not] null
5、 带and和or的多字段查询
6、 查询结果不重复:select distanct 属性名 from 表名
7、 对查询结果排序:order by 属性名 【desc| asc】

(1)、 分组查询

语法:group by 属性名 【having 表达式】
1、 group by单独使用只能查询出每个分组的一条记录,这个特性可以用来查询不重复数据
2、 group by 一般和集合函数一起使用

(2)、集合函数(分组函数)

count()、sum()、avg()、max()、min()等
注意:
1、所有的分组都是针对某一组数据进行操作的,分组函数自动忽略空值:null
2、分组函数不能直接使用在where语句当中,因为group by 在where语句执行结束后才会执行,也就是说只有先分组,才可以进行分组查询,

(3)、having和where的区别

where作用于表/视图,是表/视图的查询条件,having作用于分组后的记录,用于选择满足条件的分组,

(4)、limit 限制查询结果

用法:limit 初始位置,记录数

(二)、多表查询(连接查询)
  • 为了对比演示内外查询结果:创建员工表和部门表
    部门表:
    select * from department;
    ±-----±-------±---------+
    | did | dname | func |
    ±-----±-------±---------+
    | 1001 | 科研部 | 研发产品 |
    | 1002 | 生产部 | 生产产品 |
    | 1003 | 销售部 | 策划销售 |
    ±-----±-------±---------+
    员工表:
    select * from employee;
    ±----±-----±-----±-----+
    | num | did | name | sex |
    ±----±-----±-----±-----+
    | 1 | 1001 | 张三 | m |
    | 2 | 1001 | 李四 | w |
    | 3 | 1002 | 王五 | w |
    | 4 | 1004 | Aric | w |
    ±----±-----±-----±-----+
(一)、内连接查询
  • 查询前提:两张表必须存在意义相同的字段,也可以是父表的主健和子表的外键
  • 底下我们用:EX 表示意义相同的字段

用法:select 表一.属性名,表二.属性名 … from 表一,表二 where 表一.EX = 表二.EX

用上面的员工表和部门表运行测试:(意义相同字段did)

mysql> select a.name,b.dname from employee a,department b where a.did = b.did;
±-----±-------+
| name | dname |
±-----±-------+
| 张三 | 科研部 |
| 李四 | 科研部 |
| 王五 | 生产部 |
±-----±-------+
查询结果:我们查询出的是 特定字段值相同的元素,即就是did两个表都有的信息

(二)、外连接查询

语法:select 属性列表 from 表一 left|right join表二 on 表一.EX = 表二.EX

(1)、左连接查询

用上面的员工表和部门表运行测试:(意义相同字段did)
mysql> select a.name,b.dname from employee a left join department b on a.did = b.did;
±-----±-------+
| name | dname |
±-----±-------+
| 张三 | 科研部 |
| 李四 | 科研部 |
| 王五 | 生产部 |
| Aric | NULL |
±-----±-------+
结果:我们看到左连接查询,会把左边这张表信息全部查出来,但did = 1004这个员工,右边表部门未登记,所以显示为空

(2)、右连接查询

用上面的员工表和部门表运行测试:(意义相同字段did)
select a.name,b.dname from employee a right join department b on a.did = b.did;
±-----±-------+
| name | dname |
±-----±-------+
| 张三 | 科研部 |
| 李四 | 科研部 |
| 王五 | 生产部 |
| NULL | 销售部 |
±-----±-------+
结果:和左连接查询相反,我们看到右连接查询,会把右边这张表信息全部查出来,但员工编号did = 1003,右边员工表查不到此人,所以显示为空

(三)、子查询

带in关键字的子查询
语法示例:select * from 表一 where did in (select did from 表二);

带exists关键字的子查询:内层循环返回一个真假值(true/false)
语法示例:select * from 表一 where exists (select did from 表二);

带any的子查询:满足其中一个条件就好
语法同上

带all的子查询:满足所有条件
语法同上

七、插入和删除数据

  • 为表的所有字段插入数据

insert into 表名 values(值1,值2,。。。值n);

  • 插入数据时,若数据存在,也不要替换

insert [or] ingore into 表名 values(值1,值2,。。。值n);

  • 为表的指定字段插入数据

insert into 表名(属性1,属性2.。。。属性m) values(值1,值2,。。。值m);
注意:如果某个字段没有设置默认值,而是非空约束,系统会出错

  • 更新数据

update 表名 set 属性名1 = 取值1,属性名2 = 取值2,。。。where 条件表达式

*删除数据

delete from 表名【where 条件表达式】

八、存储引擎和字符编码

(一)、存储引擎的种类

1、MyISAM

使用这个存储引擎,每个MyISAM在磁盘上存储成三个文件。

(1)frm文件:存储表的定义数据

(2)MYD文件:存放表具体记录的数据

(3)MYI文件:存储索引

frm和MYI可以存放在不同的目录下。MYI文件用来存储索引,但仅保存记录所在页的指针,索引的结构是B+树结构。

InnoDB
InnoDB是默认的数据库存储引擎,他的主要特点有:

(1)可以通过自动增长列,方法是auto_increment。

(2)支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。

(3)使用的锁粒度为行级锁,可以支持更高的并发;

(4)支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。

(5)配合一些热备工具可以支持在线热备份;

(6)在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;

(7)对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;
当然InnoDB的存储表和索引也有下面两种形式:

(1)使用共享表空间存储:所有的表和索引存放在同一个表空间中。

(2)使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的话,每个分区对应单独的IBD文件,分区表的定义可以查看我的其他文章。使用分区表的好处在于提升查询效率。

对于InnoDB来说,最大的特点在于支持事务。但是这是以损失效率来换取的。

Memory
将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是frm。

(1)支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;

(2)支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;

(3)由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;

(4)查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;

(5)默认使用hash索引。

(6)如果一个内部表很大,会转化为磁盘表。
(二)、mysql编码问题

show variables like ‘character_set_database’; //查询mysql数据库默认编码
±-----------------------±-------+
| Variable_name | Value |
±-----------------------±-------+
| character_set_database | latin1 |
±-----------------------±-------+

(1) 给varchar/char 前面+n 只改变一个属性的编码形式。 create table test_char ( name
nvarchar(10) );

(2) 只改变一个属性的编码形式。
create table test_char ( name varchar(10) CHARACTER SET utf8 );
(3) alter table sex_tb1 modify Ssex enum(‘男’,‘女’) character set utf8;

(4) 改变整张表的编码形式: create table test_char3 ( name varchar(10)
)CHARSET=utf8;

改变整个数据库编码形式
改变mysql的配置文件  my.ini
这个配置文件是只在mysql 服务启动的时候会读取的,如果改变了mysql的配置文件一定要重启
服务之后改变好的配置才会起到作用。

有错误或者不足的地方望大家指出来,一起进步,谢谢!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值