赞
踩
数据库客户端用于和用户进行交互,用户输入sql语句操作数据库,而数据库本体数据存储在数据库服务器中。数据库服务器中的数据存储在硬盘
中,所以可大量存储,并且可以长久化存储
, 每个数据库服务器中可以存储多个数据库。每个数据库中可以包括多个表,对于关系型数据库,表中的每一行称为记录
,每一列称为字段
。
创建数据库: create database 数据库名
create database if not exists 数据库名 character set utf8mb4
用两个字节表示一个汉字最典型的编码方式是GBK
方式,window简体中文版默认的编码方式就是gbk
方式。java中内置的编码方式是unicode
, 也是用两个字节表示汉字。而当今最主流的编码方式是utf-8
, 因为utf-8
可以支持各种语言文字,utf-8
是一种变长编码,长度不固定,对于汉字来说utf-8
一般用三个字节表示。
mysql中的utf-8mb4比utf-8更完整,支持了一些特殊符号。
查看数据库: show databases
使用数据库: use 数据库名
删除数据库: drop database 数据库名
4. int 占四个字节,对应c语言和java中的int
6. float (m, d)单精度浮点数,占四个字节,m为有效位数,d为小数点后位数
8. decimal (m, d) 占字节数为m/d的最大值+2, 可以精确表示浮点数,牺牲了存储空间和计算速度来确保数据的精确
以上常用的数据类型有 ing double decimal
1. varchar(m) 可变型字符串,`最常用`的字符串类型,m指定最大长度
varchar(256) 表示这个列最多有256个字符,字符不是字节
- r 以只读方式打开字符值类型文件
- rb 以只读方式打开二进制类型文件
- w 以只写方式打开字符值类型文件
- wb 以只写方式打开二进制类型文件
- a 以追加方式打开字符值类型文件
- ab 以追加方式打开二进制类型文件
word 富文本编辑器以及excle 都是以二进制类型存在
1. datatime 八个字节,时间可表示从1000到9999年,不能自动检索时区
timestamp是以时间戳的方式来计算时间的,所谓时间戳就是从1970年1月1日起到现在经过了多少秒,计算机中存储的就是四字节的时间戳,然后格式化成时间格式呈现出来,因为四字节最大只能是42亿九千万秒,所以到2038年时间戳就会用尽。
创建表: create table 表名 (列名 类型, 列名 类型);
创建表之前,必须先选中数据库, 同一个数据库中的表名不能相同,列名和表名不能是关键字,如果表名需和关键字冲突,需给表名加反引号`, 数据库中注释可用comment,或者-- (杠杠空格), comment只能在创建表时使用;
查看当前数据库中的所有表: show tables;
查看指定表结构: desc 表名;
删除表: drop table 表名;
增加create:insert into 表名 value(列类型值, 列类型值, 列类型值)
查看当前数据库的字符集:show variables like ‘%character%’;
指定列插入数据: insert into 表名 (列名) value/values (值);
此时未被指定值的列的值为默认值
查看表中所有数据: select * from student;
插入多行数据:insert into 表名 values (列值, 列值),(列值, 列值)…
查询到的所有数据都是临时表中的数据,查询不会对服务器硬盘中的数据进行修改
全列查询: select * from 表名 全列查询容易将硬盘io或者服务器网络带宽吃满
按列查询: select 列名 from 表名
表达式查询(不能进行行与行之间的表达时操作)
select 列名+10 from 表名;
select 列+列 from 表名;
select 列 + 列 别名 from student;
select 列 + 列 as 别名 from student;.
如果sql中没有显式的order by ,其查询结果顺序实际上并没有依据,结果顺序不可信,不可依赖
sql中的语句基本上都可以嵌套使用,如下:
注意: 当查询时起了别名并同时使用了where + 条件时,条件表达式中不能使用别名,因为sql在执行语句时,首先会取出记录带入条件表达式中计算,结果为ture的字段才会生成别名
即使引入了where来限制查询,但当数据库很大时仍有可能造成硬盘io和网络宽带吃满,所以引入了limit进行限制 在查询语句之后之间添加
limit N;
, 就限制了查询的最大结果有N条
limit 搭配 offset 使用可以实现分页查询的效果,offert代表着查询从第几行开始(为0时从开头查询)
limit 3 offset 2;
等价于limit 2, 3;
selete 进行的删除操作是对数据库硬盘中的数据进行修改
delete from 表名 where
delete from 表名 order by limit嵌套使用
此修改并不是修改临时表内容,而是修改数据库硬盘中的数据,可以长久储存
update 表名 set 列名 where
如果要同时改多行,可以将列名用逗号隔开
通过表达式修改
update 表名 set 列名表达式;
update 嵌套
update 表名 set 表达式 order by limit;
为了帮助程序员更好的判读数据的准确性,数据库对存储的数据进行了一些约束称为数据库约束
数据库约束在数据库创建时申明变量时确认
- not null + unique = primary key
- 主键值唯一,每条记录的主键值都不同
- 一个数据库的表中只能有一个主键,但是可以将多列合并成一列,称为联合主键
- 主键值可以有masql自动生成,需在创建数据库时
primary key auto_increment
,这样在插入时主键值可以为null,mysql自动根据上一个主键值来自动生成一个新的主键值(+1),称为自增主键 .如果数据过多超过指定最大值时,需要分库分表
- 在分布式系统中实现
分库分表
, 每个表中的主键值也不能相同,但表与表之间并没有可以获取对方主键值的方法, 所以为了给分布式系统中生成唯一的主键值,需要用到生成算法
生成算法
的基本思路是:算法 = 时间戳 + 主机编号 + 随机因子
- foreign key与其他约束在添加时方式不同,其他约束添加时直接在创建表时加在列名之后就好,中间不需要添加任何的符号
- 而 foreign key 添加时,若把当前外键列称为a, 与其相关联的表称为b,b表中与当前表相关联的列称为c,则
create table 表名 (列, 列, 列, foreign key (a) references b(c));
- 如此操作则要求
当前表中的a列中的值
必须要在b表中的c列
中存在, 若在当前表中插入行, a列的值在b表中的c列不存在,则插入失败- b表对当前表有约束力,称b表为父表, 被子表引用的父表的记录不能被删除,同理父表也不能被删除
- 子表与父表中有外键关系的那一列,在父表中应用primary key 或者unique约束,因为当给子表中插入记录时,会先查询父表中是否存在对应的外键值,查询就会涉及到遍历, 如果表数据过多时,遍历可能会将硬盘io或者网络带宽吃满, 所以为了提高查询效率应该添加索引, primary key 和unique 带有索引.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。