数据库学习笔记1
1.关于属性数据类型里括号的意义:
1)对于整数类型后面括号里的数字,只是设置最小显示位数,实际的存储位数还是只和数据类型有关,比如int(4), 当存入值为1时,显示的是0001,但是当存入12345时,还是会显示12345的。占用的内存也是4个字节。
2)对于float和double浮点类型,虽然也可以有float(M,D)这样的限制,但是这并不是标准的SQL,为了在数据迁移时不遇到麻烦,还是不要用括号了,也没必要。
3)对于char、binary这样的定长字符串(字节串),char(n)、binary(n)就是指定了字段实际的长度,插入的比n长,会把后面的截断,插入的数据比n短,会在前面的字符位(字节位)补上空格(\ 0)。另外,char会自动删除右边的空格。
4)对于varchar、text、BLOB这样的变长字符串(字节串),varchar(n)、text(n)、BLOB(n)只是限定了最大长度,但是实际的储存长度是根据实际情况确定的,存入多少数据,就使用多大的内存,当然还要加上1个字节或者2个字节来保存实际长度信息。插入的比n长,会把后面的截断。但是插入的数据比n短,则实际内存就还是和实际数据保持一致。
5)bit(m)的m指定的不是字节数而是比特数,它也是定长的。插入的比n长,会把后面的比特截断,插入的数据比n短,会在前面的比特位补上0。
2.在进行比较运算的时候,字符串和数值作比较是,mysql会自动把字符串转换为相应的数值后再进行比较。
3.任何值和null进行比较运算时,都会返回null(包括两个null比较)。如果要判断一个值是否为空,应该用 is null或者is not null。另外,为了兼容null的逻辑等比较,提供了一个安全等于运算符<=>,这个比较运算符遇到null时,统一返回false。
4.字符比较用Like ‘pattern’ ,pattern中%表示多个字符的通配符,_表示单个字符的通配符
5.mysql支持正则表达匹配, regexp ‘pattern’ 。
6.mysql的字符串比较和collation有关,如果是语句内的字符常量的比较,按照collation_connection指定的排序规则比较,如果里面有字段值,则按照具体的字段来确定比较规则。在字符常量比较时,大小写和操作系统有关,window是大小写无关的,unix/linux是大小写有关的。
7.在使用逻辑操作的时候 AND 的优先级总是高于 RO 的优先级。
8.函数可以用在插入数据中,查询数据中,where从句中。
select char_length(stu.name) from student stu where char_length(stu.num)>5;
返回Num字符数大于5的num字节数。
9.函数的参数可以是字段,不仅可以在WHERE字句中用于判断条件,在,还可以UPDATE语句中用来给字段赋值:UPDATE books SET price=price+5 WHERE note like ‘novel’; 所有的小说加价5元。
1.分组查询使用group by子句,通常配合聚合函数,有MAX(),MIN(),COUNT(),SUM(),AVG()等,如果查询某个字段,经过聚合后,该字段可能有多个值,默认只显示第一个值,如果要显示全部的值,则需要使用GROUP_CONCAT(字段名)函数,将各个值用逗号拼接起来成为一个单一的字符串(否则违反第一范式)。
2.order by是对查询的结果进行排序,因此它肯定是放到最后的。
3.数据库连接查询可以连接多张表,连接查询的ANSY SQL语法为:SELECT table1.filed1,table.filed2 FROM table1 {INNER | LEFT OUTER| RIGHT OUTER } JOIN table2 ON condition_exp1 WHERE conditioin_exp2 。其中前一个condition_exp是含有table1.filed=table.filed的条件表达式,WHERE后面的条件表达式可以对连接查询做进一步的约束,比如,可以用下面的语句实现左边有但是右边没有的数据:
SELECT left_tbl.*
FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
WHERE right_tbl.id IS NULL;
当然,也可以直接使用这样的语法实现连接查询:SELECT table1.filed1,table.filed2 FROM table1,table2 WHERE conditioin_exp,效果是一样的,但是这不是标准的SQL语句,不推荐。
4.子查询:子查询先计算内层查询的结果,然后和外层查询做比对,比对时候,存在ANY(SOME)、ALL、IN、EXISTS、NOT EXISTS几种选择。
1)ANY(SOME):ANY和SOME是一个意思,只要子查询结果记录的比对结果都为真,就返回真。
SELECT num1 FROM tbl1 WHERE num1 > ANY (SELECT num2 FROM tbl2)
只要子查询中有一个比Num1小,就为真,也就是比子查询中最小的那个大就可以了。
2)ALL:所有子查询结果记录的比对结果都为真,才为真
SELECT num1 FROM tbl1 WHERE num1 > ANY (SELECT num2 FROM tbl2)
SELECT num1 FROM tbl1 WHERE num1 > ALL (SELECT num2 FROM tbl2)
只要子查询中所有的值都要比Num1小,才为真,也就是比子查询中最大的那个还要大的值。
3)EXISTS:看是否返回的是一个Empty table(即没有一行记录),如果不是,则为True,否则为false。
4) NOT EXISTS:和EXISTS类似。
5) IN:要求子查询的返回值仅有一个值的列表,看判断值是否在这个列表中,如果在,则为true,否则为false。
5.使用UNION或者UNION ALL实现把多个查询结果表示在一张表上面,UNION和UNIONO ALL的区别在于前者会把重复的行删除,因此效率上会受到一定影响(需要查找重复行)
1.可以将查询出来的结果插入到一张表中,只需要将INSERT语句与SELECT语句连用即可
INSERT INTO table1 (filed1,filed2) SELECT fileda,filedb FROM table2。
2.删除数据时,使用DELETE FROM table1 WHERE condition,如果没有WHERE子句,将删除所有的行,所以一般要有WHERE子句。如果想通过删除所有的行来清空表,可以使用TRUNCATE TABLE语句,TRUNCATE TABLE会删除整张表,在创建一个新的表,所以性能比DELETE高很多。DROP TABLE是把表删除,并删除表的索引、触发器,依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。TRUNCATE TABLE和DROP TABLE是DDL,DELETE是DML。关于三者的具体区别,请查看其他资料。
3.DDL的事物是隐式提交的,所以DDL语句是不可回滚的,一旦执行,事务即自动提交了。所以DELETE会记录在事务日志中,可以回滚, TRUNCATE TABLE 和 DROP TABLE不记录日志,不可回滚。
1.索引是一个单独的、存储在磁盘上的数据库结构,占用独立的物理空间,它们包含了对数据库表里所有记录的引用指针,并且是由存储引擎维护的,不同的存储引擎采用不同的索引方式,常见的又BTree和Hash索引,具体支持什么索引,要看具体的存储引擎实现。
2.一个表中的索引数量是有限的,索引的长度也是有限的。所有存储引擎支持的每个表至少16个索引,索引长度至少为156字节。
3.索引的优缺点:
*优点:
1)可以加快查询速度,这是索引的初衷;
2)通过创建唯一索引,可以保证数据库表中每一行数据的唯一性
3)在实现数据的参考完整性方面,可以加速表与表之间的连接
4)在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间(说明还能排序)。
*缺点:
1)索引的创建和维护需要消耗时间,并且随着数据量的增大,时间也增大;
2)索引需要占用独立的物理空间。
3)当对表中的数据进行增删改时,数据会变动,那么索引也要动态维护,这样就降低了增删改的速度。
4.索引的分类: