- left(str, length)
right(str, length)
substring(字符串,起始位置); substring(字符串,起始位置,长度)
#order by排序
设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]]
可用任何字段作为排序条件
可设定任意个字段来排序
可用 asc 或 desc 设置查询结果按升/降序
默认升序排列
可添加 where ... like 设置条件
#ength和char_length
length
获取字符串长度的内置函数方法,utf8编码下一个汉字是算三个字符,一个数字或字母算一个字符
其他编码下,一个汉字算两个字符, 一个数字或字母算一个字符。
char_length
在任何编码下,不管汉字还是数字或者是字母都算是一个字符
replace函数
根据主键确定被替换的是哪一条记录、
- replace(object,search,replace)
把object中出现search的全部替换为replace ,返回替换后的字符串
select replace('www.jb51.net','w','Ww')--->WwWwWw.jb51.net
把表table中的name字段中的aa替换为bb
update table set name=replace(name,'aa','bb')
- replace into
replace into table (id,name) values('1','aa'),('2','bb')
向表中插入两条记录。如果主键id为1或2不存在
就相当于
insert into table (id,name) values('1','aa'),('2','bb')
如果存在相同的值则不会插入数据 。
2 CREATE DATABASE和CREATE SCHEMA
在MySQL中,官方的中文文档在 CREATE DATABASE 语法一节中写了一句:也可以使用CREATE SCHEMA。那么CREATE SCHEMA和CREATE DATABASE在MySQL难道是一样的吗?
MySQL 5.0官方的英文文档中有这么一句:
这个说法译成中文应该是:CREATE DATABASE根据给定的名称创建数据库,要用这个语法,你需要有数据库的CREATE权限,CREATE SCHEMA从MySQL5.0.2起,可作为CREATE DATABASE的一个代名词。
按照这个说法,CREATE SCHEMA是和CREATE DATABASE是一样的,为了验证这个说法,参阅了后继的官方文档,在MySQL5.5的英文文档中,官方如是说:
中文:CREATE DATABASE根据给定的名称创建数据库,你需要拥有数据库的CREATE权限来使用这个语句。CREATE SCHEMA是CREATE DATABASE的一个代名词。
由此可见,在MySQL的语法操作中(MySQL5.0.2之后),可以使用CREATE DATABASE和CREATE SCHEMA来创建数据库,两者在功能上是一致的。在使用MySQL官方的MySQL管理工具MySQL Workbench 5.2.47创建数据库时,使用的是CREATE SCHEMA来创建数据库的。而这和MS SQL中的SCHEMA有很大差别。
3 视图
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。
使用视图可以简化复杂的sql操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。
视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by 则对视图再次order by将被覆盖。
创建视图:create view XXX as XXXXXXXXXXXXXX;
对于某些视图比如未使用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。
4 删除
- drop直接删掉表
- truncate删除表中数据,再插入时自增长id又从1开始
- delete删除表中数据,可以加where字句
(1)
- DELETE
每次从表中删除一行,并同时将该行的删除操作作为事务记录在日志中保存,以便回滚 - TRUNCATE TABLE
一次性地从表中删除所有的数据,并不把单独的删除操作记录记入日志保存,删除行是不能恢复的,在删除的过程中不会激活与表有关的删除触发器。执行速度快。
(2)表和索引所占空间
- 表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小
- 而DELETE操作不会减少表或索引所占用的空间
- drop语句将表所占用的空间全释放掉
(3) 一般而言,drop > truncate > delete
(4) 应用范围
- TRUNCATE 只能对TABLE
- DELETE可以是table和view
(5)
- TRUNCATE 和DELETE只删除数据
- 而DROP则删除整个表(结构和数据)
(6)
- truncate与不带where的delete :只删除数据,而不删除表的结构(定义)
- drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(7)
- delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发
- truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚
(8)
在没有备份情况下,谨慎使用 drop 与 truncate
要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。
要删除表用drop;
若想保留表而将表中数据删除
如果与事务无关,用truncate即可实现。
如果和事务有关,或老是想触发trigger,还是用delete
(9) Truncate table 表名 速度快,而且效率高,因为:
truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
(10)
- TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。
- 如果想保留标识计数值,请改用 DELETE。
- 如果要删除表定义及其数据,请使用 DROP TABLE 语句。
(11) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器




