mysql 简单介绍
mysql 不允许修改数据库名,一些客户端可以变通的方式来修改数据库名称 mysql 1064错误,语法错误 更改表名:
rename table jian to song; 删除表
drop tablde tableName; DROP TABLE IF EXISTS table_name; set names gbk; 告诉服务器客户端是什么字符集 建表:
create table song(
id int,
name varchar()
) charset [=] gbk; 同时插入多行:
INSERT INTO USER(`name`, `passwd`)
VALUES
('a', 'aa'),
('b', 'bb'),
('c', 'cc'); 范围:补码 //添加字段
alter table table_name add field_name int unsigned zerofile 默认就是unsigned null比较,和计算起来都非常不方面, 都无法和他比较大小 只可以用 ISNULL, is not null 比较 select not ISNULL(NULL)
select null is not null; 推荐设置默认值
not null default xxx comment abc; 浮点型 float(M,D) M代表总位数(不包括小数点), D代表小数位数 注意这里的MD会影响小数的范围,这点这整形的不同 char(—)个字符 利用率<=%eee
varchar(-)个字节 转换成utf8后大概两万个汉字 记录存了多少个字符需要占用(-2个字节)所以利用率<%; char(M) M可容纳的字符宽度
varchar(M) M可容纳的字符宽度
这两个都是记录的字符个数,如果想求占用了多少字节,只能是根据存的东西而定 char型的如果不够指定长度mysql内部尾部用空格补齐,取出来的时候在踢除
会尾部空格丢失情况 char 比 varchar要快一些 用空间换时间 .范围
.利用率
.空格的处理
.速度 text不支持全文索引,不支持默认值 mysql能够自动识别错误的日期 time还可以表示时间差,所以可以为负值 enum 不符合数据库设计理念(不可分割) 也不节省字节 浮点:直接影响存储范围 float(,); 不包括小数点,正负号 银行四舍五入法:
五入不入 不入
入
变成无符号的时候范围并不会翻倍 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+依赖于M和D的值
浮点、定点数的区别:
定点数超过设置的范围会有warning(最后会四舍五入存储),浮点则会四舍五入
定点数在mysql中以字符串存储,精度比定点会高
字段一定长度下,浮点数可以表示更大的范围,但精度低
建议用定点数
所有DECIMAL列的基本计算(+,-,*,/)用65位精度完成
create table 表名(
列名 列类型 [列属性] [默认值]
`author_id` int() UNSIGNED ZEROFILL NOT NULL ,
) engin 引擎名 charset 字符集 create table aa(
id1 int() UNSIGNED ZEROFILL NOT NULL, //not null必须放在 unsigned 和zerofill后面,而这两个本身是没有顺序的
id2 int() unsigned ZEROFILL not null
); between 允许等于俩个边界值 select max(id),name,age from user; //name和age没有什么意义 记录下的是第一个遇到的 where 表达式
列明 当成变量来看 //查询每个栏目下面积压的货款
sum是针对每个分组的所有的记录
select cat_id, sum(shop_price*goods_nums) from goods group by cat_id; group by 只有与 sum,max ,min,count聚合函数配合起来才有意义 where 中加的字段必须是表中存在的(既文件中存在的),where发挥作用的时间在结果之前,所以不用用于结果的字段 对原始列起作用 所以:select a,b,a-b as alias where alias <; (错误的写法) 正确的写法:
、select a,b,a-b as alias where a-b <; 计算两次
、select a,b,a-b as alias having alias<; 查询两门及两门以上不及格的同学的平均分
tip:先求出所有人的平均分,在筛选条件 select name, sum(score<) as gk,avg(scor) as pj from stu group by name having gk>=; 注意这里的sum不可以替换成count,count的统计记录的行数里面的表达式无论是正负还是 都会被统计到 查询结果可以看做一个表 having 筛选 对结果起作用 (先where后having) 在没有排序的情况下按硬盘上的物理文件顺序来存取 顺序:where->group->having->order by->limit 好的理解模型:
.where 把表达式放到行中看是否为真
.列 看做变量,变量可以进行运算
.取出的结果可以看做一张临时表 **聚合函数和其他字段共同取出时,其他字段以第一次碰到的数据为准 子查询查询出来的结果可以当做一张表来看,必须加别名
create table card2 like card; where 型子查询:把内层的查询的结果作为外层的查询条件
select * from card where id = (select id from card limit 1);
from 型子查询: 把内层的查询结果当成临时表,供外层sql再次查询
select * from (select * from card) as mycard ;
exists 型子查询 把外层的查询结果拿到内层,看内层的查询结果是否正确 union 联合查询结果
要求:两次查询结果列数一致
如果列类型不一致会转换成 blob类型
推荐:查询的每一列的列类型也一致
列名不一致的时候以第一列为主
如果字句中有order by ,limit 必须加() 推荐放到字句之后,即对最终合并后的结果进行排序 (select * from classes where id in(,) order by id desc limit
ll (select * from classes where id in(,) order by id desc limit ); 如果字句中order by不配合limit,order by 将失效 被语法分析器优化时会被过滤掉(where = ); 集合:
表-----集合
行---集合的元素 集合相乘:笛卡尔积 其实就是两个集合的完全组合 --->select * from ta, tb; 理论上讲不存在两个相同的行,但是表中可以存在相同的行,因为表内部有一个rowid a left join b ==== b right join a; 推荐用左连接代替右连接 左连接:以左表为准,去右表匹配数据,找不到用null补齐 内连接是左右连接的交集 mysql能否查出左右连接的并集呢?
目前不能,mysql不支持外连接,可以用 union(左链接 union 右连接) 来实现 //建表
create table kang(
id int unsigned primary key auto_increment comment '主键',
name varchar() not null default '' comment '姓名'
) engine=myisam charset=utf8; //添加字段
alter table kang add height tinyint unsigned not null default '' comment '身高'; //删除字段
alter table kang drop height after id; #默认在最后增加一列 [after] [first] //修改字段
alter table kang change [height 要修改的列名] [height int unsigned default 列声明]; tee命令:
命令行中的结果保存到外部文件中
notee/ \t 停止记录 试图:由查询结果形成的一张虚拟表,可以简化查询 //创建视图
create [ALGORITHM= temptable] view view_name as [select 语句]; //删除视图
drop view view_name; //视图的修改
alter view view_name as [select 语句]; 视图可以修改并影响表,但并不是所有的视图都可以增删改
视图中的数据可以和表中的数据一一对应时可以修改
insert 还要注意必须包含所有没有默认值的列 视图的 ALGORITHM 算法
merge:只记录一条sql,当查询时把这个sql和以前的sql合并在在原始表中进行查询
temptable 形成一个临时表,再在这个临时表中进行查询
undefined: *******************mysql 字符集 **********************
mysql 列,表,数据库,服务器都可以指定字符集,如果哪级没有指定则按他的上级 set names N; 等价于下面三句: 客户端字符集:character_set_client
客户端高速中转器转成什么编码:character_set_connection
查询结果用什么编码:character_set_results set character_set_client=gbk;
set character_set_connection=utf8;
set character_set_results=gbk;
latin1 比较特殊 , 当数据库为latin1(iso-8859-1)时,必须 set names latin1
其他的情况 set names的编码应该和文件的编码和想要的编码保持一致 校对集:utf8_general_ci不区分大小写
校对集是指对字符集的排序规则
一个字符集可以有一个或多个排序规则 声明的校对集必须是字符集合法的校对集 触发器的监视范围:增,删,改
触发范围:增,删,改 触发器语法:
delimiter $
create trigger triggerName
after/before insert/update/delete on 表名
for each row(mysql默认,只可以是行触发器)
begin
# sql todo;
end
delimiter ; #删除触发器
drop trigger triggerName insert 触发器中用new.列名来引用 //示例
delimiter $$
create tgrigger tg1
for each row
begin
update g set num = num - new.much where id = new.gid;
end delete 触发器中用old.列名来引用 对update来说 修改前的数据用old.列明,修改后的数据用new.列明, before /after区别: 操作之前:相当于饭前检查你有没有足够的钱 before sql语句发过来了,对语句做一个审查,此时语句并没有对硬盘上的数据进行修改
after 是先完成数据的增删改在触发
触发语句晚于增删改,无法影响前面的增删改产生影响 before是先完成触发,在增删改
触发的语句先于监视的增删改,我们有审核,判断,修改即将要发生的操作 下订单前进行判断,强制把所下订单数量<=(最多只可以下五个订单) 查看触发器:show triggers; ***************************
Trigger: tg1
Event: INSERT
Table: a
Statement: BEGIN
update g set num = num - w
END
Timing: AFTER
Created: NULL
sql_mode:
Definer: root@localhost 事务:
原子性:不可分割
隔离性:中间的过程不可以被看到
一致性:总额一致
持久性:不可以撤销 #查看mysql的模式
show variables like "%mod%" ; #切换到严格模式
set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"; set autocommit = off;#禁止自动提交 查看 show variables like "%commit%"; start transaction;#开启事务 当一个事务 commit/rollback 时这个事务就结束了 注意:有一些语句会隐式的提交事务 参见mysql手册 事务的原理:
sql 先作用于事务日志 ,然后一起在作用于表 倒大量数据:先去掉索引,统一加索引的速度是非常快的
#执行一条语句然后退出
mysql -uroot -proot dealer -e"select * from dealer_area where id=54";
备份和回复:
增加备份和整体备份 自带工具:mysqldump
导出表:
mysqldump -u root -p 库名 表一 表二…… >地址
C:\Users\root>mysqldump -uroot -p ci >ci.sql(ci 库下的所有的表) 不写表名会导出库下的所有的表 导出库:
mysqldump -u root -p -B 库名 库一 库二…… >地址 [-A] 导出下面所有的库 #只导出表结构加参数 -d 即可
mysqldump -uroot -p -B -d ci >ci.sql #库以及库下的所有的表
mysqldump -uroot -p -d ci >ci.sql #库下的所有的表
mysqldump -uroot -p -d ci kang >ci.sql# ci 库下的 kang 表
#只导出数据 -t 参数
mysqldump -uroot -p -t db_house t_region -w "fid>1">/home/v_jksong/dump.sql
#导出指定的查询结果
mysqldump -uroot -p db_house t_region -w "true order by fid desc limit 1">/home/v_jksong/dump.sql #没有where条件时记得添加 true 拼凑
mysqldump -uroot -p db_house t_region -w "fid>1">/home/v_jksong/dump.sql
#一行行的导出 insert
--skip-extended-insert
恢复:
source d:\\a.sql; mysql -uroot -p < d:\\(/)song.sql;(库级)
mysql -uroot -p 库名 < d:\\(/)song.sql;(表级) 二叉树:log2N
哈希:一次: 索引:
哈希索引:(理论上是指差一次) 比较浪费空间
散列算法算出对应的地址
根据散列值在分配空间
弊端:.算出来的值不连续,申请空间的时候必须连续 ,中间有空缺 .算出来的值相同 索引:加快查询速度,降低增删改速度,同时占用空间 不要过度索引
索引条件 (where后面最频繁的条件比较适宜) 除主键外的数据一般叫做原数据--主键加在元数据上 主键必唯一,唯一不一定为主键,一张表上只有一个主键 查看一张表上的索引:
show index from 表名 索引名称可以省略,省略后默认是字段名称
增加普通索引:
alter table 表名 add index/unique/fulltext [索引名](列名)
增加主键索引:
alter table 表名 add primary key (列名) //不要加索引名称,因为主键只有一个 删除非主键索引:
alter table 表名 drop index 索引名 删除主键:
alter table 表名 drop primary key; 全文索引:(对文章的每个词建立索引)
select * from user where match(name) against ('匹配词'); select match('name') against ('匹配词') from user; //匹配度 不针对非常频繁的词进行索引 this , is ,you ,my等等 存储过程:
show procedure status; 删除存储过程
drop procedure 名称 查看某个具体的存储过程
show CREATE PROCEDURE song;
mysql -uroot -proot dealer -e"select * from dealer_area where id=54";
mysql 简单介绍的更多相关文章
- mysql简单介绍及安装
MySQL是一个关系型数据库管理系统关系数据库,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性,所使用的 SQL 语言是用于访问数据库的最常用标准化语言.My ...
- mysql简单介绍
SQL语言分为三个部分:数据定义语言( Data DefinitionLanguage,简称为DDL).数据操作语言( DataManipulation Language,简称为DML)和数据控制语言 ...
- python(pymysql)之mysql简单操作
一.mysql简单介绍 说到数据库,我们大多想到的是关系型数据库,比如mysql.oracle.sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库 ...
- PHP 17: MySQL的简单介绍
原文:PHP 17: MySQL的简单介绍 这一章将简单介绍MySQL的基本知识. 本文来自http://lib.hackbase.com/html/8/35125.htm. MySQL是最受欢迎的开 ...
- MySQL存储引擎简单介绍
MySQL使用的是插件式存储引擎. 主要包含存储引擎有:MyISAM,Innodb,NDB Cluster,Maria.Falcon,Memory,Archive.Merge.Federated. 当 ...
- mysql中set和enum使用(简单介绍)
简单介绍 SET类型 在创建表时,就指定SET类型的取值范围. 属性名 SET('值1','值2','值3'...,'值n') 其中,“属性名”参数指字段的名称:“值n”参数表示列表中的第n个值,这些 ...
- MySQL sys Schema 简单介绍-2
之前在<MySQL sys Schema 简单介绍-1>中简单的介绍了,sys Schema库中的表.那么这些表都可以查询些什么信息呢?接下来本文将做下介绍. 1. 表的情况 1.1 统计 ...
- day39——SQL语句简单介绍、库、表、记录、安装mysql简单命令
day39 SQL语句简单介绍 库(增删改查) 查看数据库 show databases; 查看其中一个库 show create database db1; 创建数据库 create databas ...
- Mysql数据库的简单介绍与入门
Mysql数据库的简单介绍与入门 前言 一.下载与安装 1.下载 官网下载MYSQL5.7.21版本,链接地址https://www.mysql.com/downloads/.下载流程图如下: 找到M ...
随机推荐
- Java编程思想学习(五)----第5章:初始化与清理
随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一. C++引入了构造嚣(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法.Java中也采用了构造器,并 ...
- hdu 3294 manacher 求回文串
感谢: http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/ O(n)求给定字符串的以每个位置为中心的回文串长度. 中心思想:每次计算位 ...
- 简单DP+暴力 POJ 1050
To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45915 Accepted: 24282 Desc ...
- Codechef APRIL14 ANUCBC Cards, bags and coins 背包DP变形
题目大意 有n个数字,选出一个子集,有q个询问,求子集和模m等于0的方案数%1000000009.(n <= 100000,m <= 100,q <= 30) 假设数据很小,我们完全 ...
- VK Cup 2016 - Round 1 (Div. 2 Edition) A. Bear and Reverse Radewoosh 水题
A. Bear and Reverse Radewoosh 题目连接: http://www.codeforces.com/contest/658/problem/A Description Lima ...
- 从网络得到数据--Arduino+以太网
昨天我们讨论了如何使用Arduino以太网插板建立服务器,并通过网络控制Arduino的引脚.今天我们来看看用插板做为客户端来从一个网页上得到信息并返回报告.我几个月前用的这个方法,当时我做了一个Ni ...
- jsp动态导航栏
站点页面的导航栏是从数据库中生成出来的,所以在界面上展示导航栏时,要从数据库中读取出来,但不能每次显示一个页面都从数据库中读.这样就非常浪费性能.应该考虑把导航栏放到一个缓存中.如:session.a ...
- 【java】【mybatis】在使用mybatis进行批量插入,批量更新等批量操作时,切割In集合List进行分批批量操作的java中的切割代码
红字部分代表mybatis的批量操作调用方法: int num = 0; int maxLength = 200; int size = usableCodes.size(); if (size &l ...
- Cocos2d-x3.2 TextureCache类异步载入功能解说
本文TextureCache类异步载入功能的代码抽出,总共代码就200多行.感兴趣能够看看. 研究这个主要是由于项目中须要异步插入数据,但之前的方法在Android上总是崩溃所以想到TextureCa ...
- 学习笔记 ST算法
[引子]RMQ (Range Minimum/Maximum Query)问题: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值 ...