day02 mysql
一.sql的基本语句
系统数据库
information_schema: 虚拟库, 不占磁盘空间(在内存汇中): 存的是数据库启动后的一些参数, 如用户表信息, 列信息, 权限信息, 字符信息等
performance_schema: 性能信息库: 5.5版本后新增的: 主要用于收集数据库服务性能参数, 如记录处理查询请求时发生的各种事件, 锁等现象
mysql: 授权库: 主要存储系统用户的权限信息
test: 测试库: mysql数据库系统自动创建的
数据库的命名规则:
可以由 字母 数字 下滑线, @ # $ 组成
区分大小写
唯一性
不能使用sql的关键字
不能单独使用数字
最长128位
sql语言的分类: sql语言主要用于存取数据, 查询数据, 更新数据和关系关系数据库系统, 分为以下3种类型
1.DDL语句 数据库定义语言: 数据库, 表, 视图, 索引, 存储过程: 如 create drop alter
2.DML语句 数据库操纵语言: 对数据的操作: 如增insert 删delete 改update 查select
3.DCL语句 数据库控制语言: 控制相关: 如访问权限的grant revoke
对数据库sql语句操作
> create database db1 charset utf8; //增 charset utf8 加后面指定字符集
> drop database db1; //删
> alter database db1 charset gbk; //改 修改数据库 (alter 改变)
> select database(); //查 查看当前所在数据库
> show create database db1; //查
> show databases; //查
> use db1; //用
对表的sql语句操作
> create table t2 select * from t1; //复制表 前面创建表 + 后面是创建的方式:把表的内容查出来 既复制了表结构,又复制了表记录
> create table t3 select * from t1 where 0>1; //复制表结构 小技巧: 后面查询的时候,查不到记录,那就只剩下表结构了
> create table t4 like t1; //复制表结构 这个是正宗的
> create table db1.t2(id int,name char(10)); //增
> drop table db1.t1; //删
> alter table t1 modify name char(6); //改 修改表的字段的属性
> alter table t1 change name username char(7); //改 改变表的字段的名字和字段的属性
> show tables; //查
> show create table t1; //查
> desc db1.t1; //查 查看表结构 (field 字段)
对数据(表记录)的sql语句操作
> insert into db1.t2(id,name) values(1,'bajie'),(2,'悟空'); //增 db1.t2(id,name)括号里的省略的时候,就是所有字段的值都写
> delete from t1; //删 删掉所有记录
> truncate t1; //删 只能删所有: 删的时候释放自增键; 数据量大时用这个, 快
> truncate table t1; //删 也可以不加table
> delete from t1 where id=1; //删
> update db1.t1 set name='datang' //改
> update db1.t1 set name='xiyou' where id=2; //改
> select * from db1.t2; //查 *最好不用, 对性能消耗大
> select * from db1.t2 where id = 2; //查 带条件查询
二.存储引擎(表的类型: 对应mysql不同的存取机制)
存储引擎就是如何存储数据,如何为存储的数据建立索引和如何更新,查询数据等技术的实现方式,
因为关系型数据库中数据的存储是以表的形式存储的, 所以存储引擎也可以成为表的类型(即存储和操作此表的类型)
oracle 和 sql_server等数据库只有一种存储引擎, 而mysql提供了多种
--------------------------------------------------
支持的接口
标准c的api, jdbc, net, php, python, perl, ruby, vb
----------------------------------------------------------------------------------------------mysql server
企业管理服务和工具 连接池 ---> client连接我时做的操作
备份与恢复 验证与授权--线程--连接限制--内存与缓存管理
安全 ----------------------------------------------------------------------
复制 sql接口: 数据管理语言,数据定义语言,存储过程,视图,触发器,等等
集群 解析器: 查询,事务对象优先级
分区管理 优化: 访问路径统计
事例管理 缓存和缓冲池: 全局和具体引擎的缓存和缓冲池
数据模板管理 -----------------------------------------------------------------------
工作台 可插式存储引擎: 内存,索引和存储管理
查询浏览 MyISAM InnoDB:支持事务 Memory:缓存里的 等等很多类型
合并工具包 -----------------------------------------------------------------------
文件系统: 文件和日志:
新技术文件系统: 网络文件系统 rodo undo data index binary
存储区域网络和网络附加存储 error query slow
-----------------------------------------------------------------------------------------------
mysql几种搜索引擎的介绍
InnoDB的表有两个文件(默认新创建表使用的搜索引擎)
t1.frm: 存的表结构
t1.idb: 存的数据 //查询时先去找表结构,然后找数据, 所以查询的会很快
MyISAM的表有三个文件(mysql.user这个表是延续的之前的搜索引擎)
user.frm:存的表结构
user.MYD:存的数据
user.MYI:存的索引
Memory的表
t1.frm:存的表结构 //数据都存放在内存中,数据库重启或崩溃,表中的数据都消失,一般应用于临时数据的临时表,默认使用哈希索引,而不是B+树索引
blackhole的表 //(blackhole 黑洞)
t1.frm:存的表结构 //正如其名, 插入数据相当如扔入黑洞, 可以应用于主备复制中的分发主库
mysql支持的所有的存储引擎
查看正在使用的存储引擎
> show variables like '%engine%';
创建表的时候指定存储引擎
> create table t1(id int)engine=innodb;
> create table t2(id int)engine=myisam;
> create table t3(id int)engine=memory;
> create table t4(id int)engine=blackhole; //(affect 影响)
数据库分类
关系型数据库:
mysql db2 oricle sqlite :数据一般都在表中储存
非关系型数据库:
monogodb redis :一般用字典的格式key:value存储, 一般用作缓存
三.数据类型
作用: 为每个字段做约束: 约束的作用: 保证数据的一致性和完整性
数字
整型: 默认是有符号:
tinyint 小整型 1字节 [-128 127] [0 255] //tinyint[(m)] [unsigned] [zerofill] //(fill 填满)
int 大整型 4字节 0 40亿+ (integer 也可以)
bigint 极大整型 8字节
小数: float 单精度 在位数比较短的情况下使用,不精准 //float[M,D] [unsigned] [zerofill] //M全长: 最大为255 D小数点后个数: 最大30
double 双精度 在位数比较长的情况下使用,不精准
decimal 小数 精准, 小数时建议用这个, 准确的原因在于: 其内部是按照字符串存储的 (dec 也可以)
布尔型:
mysql中没有这个类型, 使用的是 tinyint(1)来构造的
> create table t5(id int, a boolean); //(desc t5: tinyint(1)) //1: true 0: false
宽度:
int类型后面的是显示宽度,不是存储宽度, 就这个是例外,其他数据类型都是存储宽度, 所以建表时, int的宽度不用写
默认的显示宽度: 是存储宽度 + 1 位
为何看到的显示宽度好像没起作用? 需要分情况讨论
1.当插入的数据宽度不够时
默认不填充: 所以看不到效果
用0来填充: zerofill 时,可以看到不足的位数在前面有一串0
2.当插入的数据宽度大于显示宽度
显示宽度不生效, 数据完全显示(可以认为是最少显示宽度)
字符串
length(); 查看字节数
char_length(); 查看字符数
> create table db5.t1(x char(5),y varchar(4));
> insert into t1 values('八戒 ','八戒 '); //注意我这里'八戒 '后面有个空格
> select x,char_length(x),y,char_length(y) from db5.t1;
+--------+----------------+---------+----------------+
| x | char_length(x) | y | char_length(y) |
+--------+----------------+---------+----------------+
| 八戒 | 2 | 八戒 | 3 | //问题点: char()不仅占用了5个字符的空间, 而且显示的时候空格也不算在长度里. varchar()这个没有问题
+--------+----------------+---------+----------------+
> set sql_mode='pad_char_to_full_length'; //命令行临时改参数,为了验证char()是完全占用了预先设置的空间
> select @@sql_mode;
> select x,char_length(x),y,char_length(y) from db5.t1;
+-----------+----------------+---------+----------------+
| x | char_length(x) | y | char_length(y) |
+-----------+----------------+---------+----------------+
| 八戒 | 5 | 八戒 | 3 | //char()实际占了5个字符空间
+-----------+----------------+---------+----------------+
char(m): 定长,简单粗暴,浪费空间,但存取速度快 //[0 255] //能存多少个字符
varchar(m):变长,节省内存,存取速度慢 //[0 65535]
text: 长文本用这个
sql优化: 创建表时, 定长放前面, 变长放后面
时间类型
now()函数, 获取当前的时间: 2019-12-05 10:41:55
year: YYYY ['1901' '2155']
date: YYYY-MM-DD ['1000-01-01' '9999-12-31']
time: HH:MM:SS ['-838:59:59' '838:59:59']
datetime: YYYY-MM-DD HH:MM:SS ['1000-01-01 00:00:00' '9999-12-31 23:59:59']
timestamp: YYYYMMDD HHMMSS ['1970-01-01 00:00:00' '2038']
> create table t6(y year, d date, t time, dt datetime, ts timestamp);
> insert into t6 values(now(),now(),now(),now(),now()); //注意如果手动加时间时, 要用字符串形式,即加上''引号,因为你中间的一些符号 : - 等缘故
> mysql> select * from t6; //插入时:'2019@12#05' '20191205' 貌似也可以, 会自动转成'2019-12-05'
+------+------------+----------+---------------------+---------------------+
| y | d | t | dt | ts |
+------+------------+----------+---------------------+---------------------+
| 2019 | 2019-12-05 | 10:43:56 | 2019-12-05 10:43:56 | 2019-12-05 10:43:56 |
+------+------------+----------+---------------------+---------------------+
枚举类型 集合类型
enum: 表示从多个里面选一个
set: 表示多个里面选一个, 或者选择多个
> create table customer(
id int unsigned,
name varchar(20),
sex enum('male','female','other'),
level enum('vip','vvip','vvvip'),
yl set('smoke','drink','piao')
);
> insert into customer values(1,'bajie','other','vip','smoke,drink');
四.完整性约束
表的设计:
对字段的属性做约束
约束的作用:
用于保证数据的完整性和一致性
> desc big_data;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(16) | YES | MUL | NULL | |
| age | int(11) | YES | | NULL | |
| email | varchar(64) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
not null 与 default
NULL字段:
null - 允许为空
not null - 不允许为空,必须赋值
Default字段:
default - 设置默认值;如果不设置默认是null
> create tables t6(id int not null default 2, name char(29) not null);
unique //(unique 唯一的 [juˈniːk])
Key字段:
> create table t7(id int not null, name varcher(20) unique); //单列唯一, UNI
> create table t7(id int unique, name varcher(20) unique); //多列唯一:方式一, UNI UNI字段的值可以是空, 也可以给多个字段赋"唯一"这个属性
> create table t10(id int, name varchar(10), unique(id),unique(name)); //多列唯一:方式二, UNI UNI另一种写法, '唯一'属性在创建表的最后用unique()函数指出
> create table t10(id int, name varchar(10), unique(id,name)); //组合唯一, MUL,只要组合字段的值不完全一样,就可插入 (联合唯一)
primary key //not null + unique //主要用于索引优化查询
Key字段:
sql版本中, 一张表中只允许一个字段有'主键',通常是 id, cid, pid
> create table student(id int primary key auto_increment, name varchar(10) unique); //单列主键: PRI 而且NULL自动为NO
> create table t2(id int not null unique auto_increment, name varchar(10) unique); //单列主键: not null+unique: 这样的效果和主键相同,为啥不用,因为不能做优化查询
> create table t3(id int auto_increment, name varchar(10),primary key(id,name)); //复合主键: 这样可以有
auto_increment //整数类型,而且为主键
一般和主键一起使用, 默认从 1 开始赋值, 所以主键的字段不用手动添加.
注意: 当你delete删除一条记录, 自增长的值不会释放, 而且当你尝试插入一条数据失败时, 也会消耗一个自增长的值
> create table t4(id int primary key auto_increment, name varchar(20) not null);
> insert into t4(name) values('bajie');
> insert into t4 values(6,'wukong'); //若中间有指定主键, 则下次插入时, 按顺序自增长
> show variables like 'auto_inc%'; //(variables 变量)
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 | //步长,一次自增数是多少
| auto_increment_offset | 1 | //偏移量: 从几开始
+--------------------------+-------+
> set session auto_increment_increment = 5; //session: 设置当前会话有效,重启会话时失效 //global: 相当于往my.ini去写, 重启会话生效
> set session auto_increment_offset = 100;
foreign key //两个表之间如何发生关系? 用这个
内容总结:
1.mysql的基本语法
对库的操作
show databases;
create database db1;
drop database db1;
use db1;
对表的操作
对表的设计
create table t1(
id int not null unique unsigned,
name char(10) not null,
sex enum('male','female','other'),
fav set('make','drink','jump'),
bordt datetime
);
对数据的操作
增insert into t1() values();//要一一对应 insert into t1 values();//所有时,前面括号可省
删delete from t1;//删所有记录 delete from t1 where 0>1;//按条件删
改update..set..
查select * from t1;//查所有
2.数据类型
tinyint int bigint float double decimal
char() varchar() text
datetime date time year timestamp
enum() set()
boolean //内部转成了 tinyint(1)
3.完整性约束
作用: 保证数据的完整性和一致性
not null 和 default
unique 单列唯一unique(id) 多列唯一unique(id), unique(name) 联合唯一unique(id,name)
primary key
auto_increment
foreign key
unsigned
zerofill
- MySQL事务以及存储引擎
MySQL事务以及存储引擎 目录 MySQL事务以及存储引擎 一.事务 1. 事务的概念 2. 事务的ACID特点 (1)原子性 (2)一致性 (3)隔离性 ①事务之间的相互影响 ②MySQL事务支持 ...
- 转!!MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)
MySQL中的存储引擎: 1.存储引擎的概念 2.查看MySQL所支持的存储引擎 3.MySQL中几种常用存储引擎的特点 4.存储引擎之间的相互转化 一.存储引擎: 1.存储引擎其实就是如何实现存储数 ...
- MySQL mysql server与存储引擎
mysql server系统架构 逻辑模块组成: mysql逻辑模块可以分为两层架构,第一层是sql layer主要包括权限判断.sql解析.执行计划优化.query cache的处理等:第二层是存储 ...
- MySQL各大存储引擎
MySQL各大存储引擎: 最好先看下你下的MySQL支持什么数据库引擎 存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Blackhole, 5. CSV, ...
- MySQL的多存储引擎架构
支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优势之一.如果能够理解MySQL Server与存储引擎之间是怎样通过API交互的,将大大有利于理解MySQL的核心基础架构.本文将 ...
- Mysql更换MyISAM存储引擎为Innodb的操作记录
一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件.通过下面的命令结果可知,已经安装了innodb插件. mysql> show p ...
- mysql缓存、存储引擎
一. mysql查询缓存 查询缓存不是mysql的子系统,却是查询优化和执行子系统不可缺少的组成部分.它不仅可以缓存查询结果,还可以缓存查询结果本身.如果某个查询的结果就在缓存里, 系 ...
- MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析
文/何登成 导读: 来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解I ...
- MySQL数据库InnoDB存储引擎中的锁机制
MySQL数据库InnoDB存储引擎中的锁机制 http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...
随机推荐
- maven工程的下载及其环境配置
Maven是一个项目管理工具,它给我们提供了好多有用的组件和工具. Maven下载: Maven下载载地址:http://maven.apache.org/download.cgi (1)进入下载界面 ...
- C语言中各种进制的表示
#include<stdio.h> int main() { //默认情况下是十进制 ; // 二进制(0b或者0B开头) int number2 = 0b1100; //八进制(0开头) ...
- Oracle 一个表的数据update到另一个表
A表数据 B表数据 现在要把B表 B_COSTS 的值update到A表 A_COSTS 字段 SQL语法: update a set (a.a_costs) = (select b. ...
- Java的HashMap和Hashtable有什么区别HashSet和HashMap有什么区别?使用这些结构保存的数需要重载的方法是哪些?
HashMap与Hashtable实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用 两者的主要区别如下 1.Hashtable是早期JDK提供的接口,HashMap是新版J ...
- 用JavaScript写一个JD放大镜
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 基于.Net4.0实现 ToastNotification
基于.Net4.0实现 ToastNotification Windows更新之路的特色之一就是消息提示由气泡变成了通知窗口,效果简直不要太好.最近公司有这方面的需求,需要在xp,win7系统上给出提 ...
- 【leetcode】388. Longest Absolute File Path
题目如下: Suppose we abstract our file system by a string in the following manner: The string "dir\ ...
- 帝国CMS数据库数据表详细说明
表名 解释 phome_ecms_infoclass_news 新闻采集规则记录表 phome_ecms_inf ...
- linux环境下安装PHP的OpenSSL扩展
先安装依赖包:yum install openssl openssl-devel 进入PHP安装包里的OpenSSL文件夹,根据个人的安装包位置不同,此处是 cd /home/local/php.5. ...
- python 中的内置高级函数
1.map(function,iterable) map是把迭代对象依次进行函数运算,并返回. 例子: map返回的十分map对象,需要list()函数转化. 2.exec()函数 执行储存在字符串或 ...