数据库(MYSQL)知识学习笔记-DML

上一篇 / 下一篇  2016-03-16 11:52:28 / 个人分类:个人总结

DML:data manipulation language,数据库操纵语言,对表数据的操作,例如SELECT、UPDATE、INSERT、DELETE等
 
1.LIMT使用
UPDATE SellTicketInfo201506 s2
SET s2.PassagerName = '张FAN'
WHERE
 SellOrderID = (
  SELECT
   SellOrderID
  FROM
   SellOrderInfo201506 s1
  WHERE
   s1.OutOrderID = '9585307414'
 )
AND s2.PassagerName = '张璠'
LIMIT 2
注意:联表 UPDATE 不可以使用 ORDER BY 或 LIMIT。
 
LIMIT a,b
返回从a+1条(包含)开始最多共b条数据

2.CONCAT
  str1    str2    str3
    p      c       g
    x      m       t
                             pcg
  则CONCAT(str1,str2,str3) = xmt : 将返回结果作为字符串连接起来。如有任何一个参数为NULL ,则返回值为 NULL。
                                     p。c。g
  则CONCAT_WS('。',str1,str2,str3) = x。m。t:将返回结果作为字符串连接起来,中间被指定符合隔开。
  这类是把不同列值的按每行串在一起
  GROUP_CONCAT(str1) = p,x:把同一列不同行的值串在一起,默认用逗号分隔。
  GROUP_CONCAT(str1 SEPARATOR ';') = p;x:同上,分隔符用设置的值。
  GROUP_CONCAT(str1,str2 SEPARATOR ';') = pc;xm:先同一行的两列串起来,再把每行串到一列里。
  这类是行转列。如果后面跟条件GROUP BY XX,那么就是分组来按上述逻辑处理。
                                                        pc
  GROUP_CONCAT(str1,str2 SEPARATOR ';') GROUP BY str3 = xm

3.时间比较
可以直接输入和字段一致的时间格式,例如:createtime > '2015-07-16 00:00:00';
use TFPTicketOrderDB;
select * from ReverseOrderInfo2015 where rderDisplayIDForPlat = 8 and DATE_FORMAT(CreateOrderTime,'%Y %M %D %H:%i:%s') < DATE_FORMAT('2015-07-16 00:00:00','%Y %M %D %H:%i:%s')
select LENGTH('长度') from dual

1.varchar类型的变化
MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文件的大小。
MySQL 数据库的varchar类型在4.1以下的版本中,nvarchar(存储的是Unicode数据类型的字符)不管是一个字符还是一个汉字,都存为2个字节 ,一般用作中文或者其他语言输入,这样不容易乱码 ;varchar: 汉字是2个字节,其他字符存为1个字节 ,varchar适合输入英文和数字。
4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同,具体有以下规则:
a) 存储限制
varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。
b) 编码长度限制
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
c) 行长度限制
导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

5.DATE_SUB(date,INTERVAL expr unit)
表示date的前多长时间。DATE_SUB(now(),INTERVAL 1 DAY)表示当前时间前一天,DATE_SUB(now(),INTERVAL 1 YEAR)表示当前时间前一年

6.LEFT JOIN
select * from A
left join B
on A.aID = B.bID
left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
B表记录不足的地方均为NULL.
7.RIGHT JOIN
和left join相反
8.INNER JOIN
只查出条件满足的数据,为空的那种都不展示。
9.FULL JOIN
MYSQL 没有,SQL Server有,两表都作为基础,没有的用NULL。
10.EXISTS(NOT EXISTS)
SELECT
 *
FROM
 RefundTicketRuleRateSet rr
WHERE
 EXISTS (
  SELECT
   1
  FROM
   RefundTicketRuleSet rs
  WHERE
   rs.KeyID = rr.RuleKeyID
  AND rs.KeyID = '1507021941384920443ea06001'
 );
结论:
EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。
11.exists和in的效率
select * from A where x in (select x from B)
外查询用到了x列的索引,内查询查全表未用索引。
select * from A where exists (select * from B where A.x = B.x)
外查询未用到x列索引,内查询用到了x列索引。
 
所以,当外查询表的数据大于内查询表的数据时,使用in的效率更高,否则使用exists效率更高。
12.not in 和not exists的效率
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists 都比not in 要快。
13.UNION 和 UNION ALL
UNION和UNION ALL 都是是将具有相同列的两个表的数据合并,差别在于UNION会对合并后的数据去重,而UNION ALL则不会去重;

 

TAG: 数据库 知识

 

评分:0

我来说两句

Open Toolbar