扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,属于Oracle旗下产品,是最流行的关系型数据库管理系统之一。
兴县网站建设公司成都创新互联公司,兴县网站设计制作,有大型网站制作公司丰富经验。已为兴县千余家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的兴县做网站的公司定做!
端口是3306。
表很多时,使用linux脚本,需要根据需要修改一下:
和创建一样,可以加上 if exists
可两篇文章:
如:
用于在已有的表中添加、删除或修改列。
添加 ADD
或
默认是添加到最后,但可以指定位置。 FIRST :添加最前
AFTER 字段名 :添加指定字段之后
例子:
删除 DROP
修改 MODIFY 主要修改原列的类型或约束条件 同样可以用 FIRST 和 AFTER 字段名 ,代表的是修改到哪里。
修改字段名 CHANGE
可以把表2的数据复制到表1中,但 不能复制约束性条件 。
单行
多行,注意 只有一个VALUES :
不写 (行1, 行2...) 这一部分的话,默认一一对应
除了以上方法外,还可以用SET为每一行附上相应的值。
假如没有筛选的话,就给全部都修改了。可以用 WHERE 筛选。
假如 没有筛选的话,就给全部删除了 。相当于清空。
清空
先把表删除,然后再建一个。与 DELETE FROM 相比, TRUNCATE 的效率更快,因为 DELETE FROM 是把记录逐条删除的。
查询执行的顺序
FROM -- WHERE -- SELECT -- GROUP BY -- HAVING -- ORDER BY -- LIMIT
注意
当数据很大,上百万的时候,使用LIMIT ... OFFSET ..的方式进行分页十分浪费资源且耗时长。最好是结合WHERE使用,如:
REGEXP 使用正则表达进行匹配。 查询时,需要搭配WHERE或HAVING使用 。
两个表之间有交集且要用到两个表的数据时,可以使用内连接查询。
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
用法:
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。 把LEFT JOIN的表1、表2调换顺序,就是REGHT JOIN 。
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行. 相当于结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
但 MySQL中不支持 FULL OUTER JOIN 。
即SELECT嵌套。
IN 一个查询结果作为另一个查询的条件。 如:
EXISTS 用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。True时执行。 如:
索引的本质是一种排好序的数据结构。利用索引可以提高查询速度。
常见的索引有:
MySQL通过外键约束来保证表与表之间的数据的完整性和准确性。 外键的使用条件:
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作。
对已有的两个表增加外键 比如:主表为A,子表为B,外键为aid,外键约束名字为a_fk_b
为子表添加一个字段,当做外键
为子表添加外键约束条件
假如删除记录报错: [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...)
这是因为MySQL中设置了foreign key关联,造成无法更新或删除数据。可以通过设置 FOREIGN_KEY_CHECKS 变量来避免这种情况。 第一步:禁用外键约束,我们可以使用: SETFOREIGN_KEY_CHECKS=0; 第二步:删除数据 第三步:启动外键约束,我们可以使用: SETFOREIGN_KEY_CHECKS=1; 查看当前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;
使用 UNION 来组合两个查询,如果第一个查询返回 M 行,第二个查询返回 N 行,那么组合查询的结果一般为 M+N 行。
每个查询必须包含相同的列、表达式和聚集函数。
默认会去除相同行,如果需要 保留 相同行,使用 UNION ALL 。
只能包含一个 ORDER BY 子句,并且必须位于语句的最后 。
内置函数很多, 见: MySQL 函数
我们一般使用 START TRANSACTION 或 BEGIN 开启事务, COMMIT 提交事务中的命令, SAVEPOINT : 相当于设置一个还原点, ROLLBACK TO : 回滚到某个还原点下
一般的使用格式如下:
开启事务时, 默认加锁
根据类型可分为共享锁(SHARED LOCK)和排他锁(EXCLUSIVE LOCK)或者叫读锁(READ LOCK)和写锁(WRITE LOCK)。
根据粒度划分又分表锁和行锁。表锁由数据库服务器实现,行锁由存储引擎实现。
除此之外,我们可以显示加锁
加锁时, 如果没有索引,会锁表,如果加了索引,就会锁行
InnoDB默认支持行锁,获取锁是分步的,并不是一次性获取所有的锁,因此在锁竞争的时候就会出现死锁的情况
解决方法:
即ACID特性:
由于并发事务会引发上面这些问题, 我们可以设置事务的隔离级别解决上面的问题.
MySQL的默认隔离级别(可重复读)
查看当前会话隔离级别
方式1
方式2
设置隔离级别
主从集群的示意图如下:
主要涉及三个线程: binlog 线程、 I/O 线程和 SQL 线程。
同步流程:
由于MySQL主从集群只会从主节点同步到从节点, 不会反过来同步, 所以需要读写分离
读写分离需要在业务层面实现 , 写数据只能在主节点上完成, 而读数据可以在主节点或从节点上完成
索引是帮助MySQL高效获取数据的排好序的数据结构
MySQL的索引有
推荐两个在线工具:
简单来说, B树是在红黑树(一个平衡二叉树)的基础上将一个节点存放多个值, 实现的, 降低了树的高度, 每个节点都存放索引及对应数据指针, 同一层的节点是递增的
而B+树在B树的基础上进行优化, 非叶子节点存放 子节点的开始的索引, 叶子节点存放索引和数据的指针, 且叶子节点之间有双向的指针
如下示意图:
不同的引擎, 主键索引存放的数据也不一样, 比如常见的 MyISAM 和 InnoDB
MyISAM 的B+树叶子节点存放表数据的指针, InnoDB 的B+树叶子节点存放处主键外的数据
其他的:
即多个列组成一个索引, 语法:
由于联合索引的B+树的结构, 根据列建立, 所以我们的查找条件也要根据索引列的顺序( where column1=x, column2=y,columnN... ), 否则会全表扫描
如果你对列进行了 (+,-,*,/,!) , 那么都将不会走索引。
OR 引起的索引失效
OR 导致索引是在特定情况下的,并不是所有的 OR 都是使索引失效,如果OR连接的是 同 一个字段,那么索引 不会失效 , 反之索引失效 。
这个我相信大家都明白,模糊搜索如果你前缀也进行模糊搜索,那么不会走索引。
这两种用法,也将使索引失效。另 IN 会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描, 见: MySQL中使用IN会不会走索引
不走索引。
走索引。
所以设计表的时候, 建议不可为空, 而是将默认值设置为 "" ( NOT NULL DEFAULT "" )
count()是Mysql的内置函数,用于统计符合条件的行数。
一般用法:select count(*) from sql(sql语言)as name(别名)
select count(*) table_name
这里对count(1)和count(*)作对比
一般情况下,count(1)和count(*)返回的数据是相同的。
而效率方面也差不多。只是在有主键的情况下,count(*)是最快的。
两者都是记录null的行数
select count(a) from test
-- 扫描a列的数据记录数,如果a上没有索引,则效率最差,并且如果a列包含null,则不会计数
mysql数据库中提供了很丰富的函数。mysql函数包括数学函数、字符串函数、日期和时间函数、条件判断函数、系统信息函数、加密函数、格式化函数等。通过这些函数,可以简化用户的操作。
简单介绍几类函数的使用范围:
数学函数:这类函数只要用于处理数字。这类函数包括绝对值函数、正弦函数、余弦函数、获取随机数函数等。
字符串函数:这类函数主要用于处理字符串。其中包括字符串连接函数、字符串比较函数、将字符串的字母变成小写或大写字母的函数、获取子串的函数等。
日期和时间函数:这类函数主要用于处理日期和时间。其中包括取当前时间的函数、获取当前日期的函数、返回年份的函数、返回日期的函数等。
流程函数:这类函数主要用于在SQL语句中控制条件选择。其中包括IF语句、CASE语句、WHEN语句等。
系统信息函数:这类函数主要用于获取mysql数据库的系统信息。其中包括获取数据库名的函数、获取当前用户的函数、获取数据库版本的函数等。
加密函数:这类函数主要用于对字符串进行加密解密。其中包括字符串加密函数、字符串解密函数等。
其他函数:包括格式化函数、锁函数等。
update
test
set
id
=
UUID();MYSQL无法在默认值中设置UUID函数,实际上其它函数除TIMESTAMP之外都不可以。
MYSQL的默认值目前只能是常数或者CURRENTTIMESTAMP。
转载 以下的文章主要介绍的是如何用MySQL内置函数来转换ip地址与相关数字,在实际操作中在处理字符格式的时候,例如将54789转换为5,4789这样的,我们只要用:format(12345,0)即可,以下就是具体内容介绍。
用MySQL内置函数转换ip地址和数字
利用两个内置函数
inet_aton:将ip地址转换成数字型
inet_ntoa:将数字型转换成ip地址
充分利用mysql内置的format函数
尤其是在处理字符格式的时候,例如将12345转换成12,345这样的,只要用:format(12345,0)即可,如果用format(12345,2)则显示的是12,345.00了...
利用MySQL内置函数处理时间戳问题
eg : select FROM_UnixTIME(UNIX_TIMESTAMP(),'%Y %D %M %h:%i:%s %x');
结果: 2004 3rd August 03:35:48 2004
利用mysql_convert_table_format转换表类型
需要DBI和DBD的mysql相关模块支持才能用,例子:
mysql_convert_table_format --user=root --password='xx' --type=myisam test yejr
修改mysql表中的字段名
alter table tb_name change old_col new_col definition...
利用临时变量
select @var1:=a1+a2 as a_sum,@var2:=b1+b2 as b_sum,@var1+@var2 as total_sum from test_table xxx;
用int类型存储ip地址
原先错误的认为必须用bigint才够,后来发现使用int unsigned类型就足够了。 :)
利用IF函数快速修改ENUM字段值
一个例子:
update rule set enable = if('0' = enable,'1','0') where xxx;
enable 类型:enum('0','1') not null default '0'
事务无法嵌套
避免长时间的sleep连接造成的连接数超出问题
设定全局变量 wait_timeout 和 interactive_timeout 为比较小的值,例如
10(s),就能使每个sleep连接在10s之后如果还没有查询的话自动断开。
设定mysql内置函数客户端的提示符(prompt)
export MYSQL_PS1="(\u:\h:)\d "
则用 mysql -hlocalhost -uroot -pxx db_name 登录后,提示符变成:
(root:localhost:)db_name
好用吧 :), 时时刻刻提醒你在哪个服务器上,尽量避免误操作的发生
更详细的请查看MySQL手册
整理MyISAM碎片
1.) 定期运行 OPTIMIZE TABLE 命令即可
2.) 用mysqldump出数据,然后重新import回去,这对大表来说显然第一种方法比较方便
整理Innodb碎片
1.) 运行NULL命令, ALTER TABLE XXX ENGINE=Innodb;
2.) 同上的mysqldump方法
MySQL如果认为检索的记录数量超过总记录数的30%,则选择全表扫描,而非使用索引
MySQL 5.0.3之后,VARCHAR字段后面的空格就不再删除
升级到4.1.1或更高后,就很难降级回到4.0或4.1了,因为 InnoDB 使用了多个表空间的缘故
MySQL 4.1之后,MySQL把字符串类型字段的长度定义理解为字符长度而不是字节长度
MySQL 4.1=5.0时,增加了一个新的启动选项 innodb_table_locks,它导致 LOCK TABLE 时也可以请求 InnoDB
表锁。这个选项默认打开,不过可能在 AUTOCOMMIT=1 和 LOCK TABLES 应用中会导致死锁
5.0.3开始,在计算 DECIMAL 值和舍入精确值的时候采用精确数学,DECIMAL 用更有效的格式来存储
从5.0.12开始,自然连接和使用 USING
的连接,包括外部连接的衍生形式,都按照SQL:2003标准来处理了;这个变化导致减少了自然连接和使用 USING
的连接产生的结果字段数,并且还将按照更合理的顺序显示这些字段,逗号比较符的优先顺序和 JOIN, LEFT JOIN 中的一样了
在以前,等待超时的锁会导致 InnoDB 回滚当前全部事务,从5.0.13开始,就只回滚最近的SQL语句了
InnoDB 和 MyISAM 表中空格结尾的 TEXT 字段索引顺序改变了。因此需要运行 "CHECK TABLE" 语句修复数据表,如果出现错误,就运行
"OPTIMIZE TABLE" 或 "REPAIR TABLE" 语句修复,甚至重新转储(用mysqldump)
MySQL 5.0.3到5.0.5之间版本的 MyISAM 和 InnoDB 表中创建的 DECIMAL 字段升级到5.0.6之后会发生崩溃。
以上的相关内容就是对用MySQL内置函数转换ip地址和数字的介绍,望你能有所收获。
1.字符串函数
char_lengt()
concat()
instr()
lcase()
left()
ltrim()
mid()
2.时间函数
now()
curdate()
curtime()
datediff()
date_add()
数学函数
abs()
ceiling()
floor()
pow()
rand()
round()
其他函数
md5()
version()
database()
UUID()
同一使用select 函数名(参数列表)
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流