从现在开始,坚持一周,拿下SQL!
关系数据库:
SQL关键字总是大写,以示突出,表名和列名均使用小写。
1、数据模型分为层次模型、网状模型、关系模型
2、BIGINT\VARCHAR(N)是日常用于最广泛的数据类型
3、SQL-结构化查询语言、DDL-定义数据(增删表,修改表结构)、DML-管理数据(增删改数据)、DQL-查询数据
关系模型:
通常情况下,字段应该避免允许为NULL。不允许为NULL可以简化查询条件,加快查询速度,也利于应用程序读取数据后无需判断是否为NULL。
在关系数据库中,关系是通过主键和外键来维护的。
主键:
对主键的要求,最关键的一点是:记录一旦插入到表中,主键最好不要再修改,因为主键是用来唯一定位记录的,修改了主键,会造成一系列的影响。
所以,选取主键的一个基本原则是:不使用任何业务相关的字段作为主键,我们一般把这个字段命名为id。
对于大部分应用来说,通常自增类型的主键就能满足需求。我们在students表中定义的主键也是BIGINT NOT NULL AUTO_INCREMENT类型。
如果使用INT自增类型,那么当一张表的记录数超过2147483647(约21亿)时,会达到上限而出错。使用BIGINT自增类型则可以最多约922亿亿条记录。
外键:
由于外键约束会降低数据库的性能,大部分互联网应用程序为了追求速度,并不设置外键约束,而是仅靠应用程序自身来保证逻辑的正确性。这种情况下,class_id仅仅是一个普通的列,
只是它起到了外键的作用而已。
还有一些应用会把一个大表拆成两个一对一的表,目的是把经常读取和不经常读取的字段分开,以获得更高的性能。例如,把一个大的用户表分拆为用户基本信息表user_info
和用户详细信息表user_profiles,大部分时候,只需要查询user_info表,并不需要查询user_profiles表,这样就提高了查询速度。
索引:
在关系数据库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要使用索引。
索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,
因此,对该列创建索引就没有意义
可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。
对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。
无论是否创建索引,对于用户和应用程序来说,使用关系数据库不会有任何区别。这里的意思是说,当我们在数据库中查询时,如果有相应的索引可用,数据库系统就会自动使用索引来提高查询效率,
如果没有索引,查询也能正常执行,只是速度会变慢。因此,索引可以在使用数据库的过程中逐步优化。
查询:
许多检测工具会执行一条SELECT 1;来测试数据库连接。
分页:
在MySQL中,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15。
第几条数据开始,分页多少条数据。
分组:
聚合查询的列中,只能放入分组的列。
多表查询:
笛卡尔积:结果集的列数是students表和classes表的列数之和,行数是students表和classes表的行数之积。
连接查询:
内连接、外连接、左连接、右连接、
全连接:FULL OUTER JOIN,它会把两张表的所有记录全部选择出来,并且,自动把对方不存在的列填充为NULL
MySQL Client的可执行程序是mysql,MySQL Server的可执行程序是mysqld。
使用SQL语句:
如果记录已经存在,就先删除原记录,再插入新记录。此时,可以在insert语句前加上REPLACE语句
如果记录已经存在,就更新该记录,此时,可以使用INSERT INTO … ON DUPLICATE KEY UPDATE …语句
强制使用指定索引:FORCE INDEX
脏读(Dirty Read)
不可重复读(Non Repeatable Read)
幻读(Phantom Read)
Read Uncommitted
Read Committed
Repeatable Read
Serializable