数据库SQL知识

1.sql语法
Ddl数据定义语言,dml数据管理语言,dcl数据控制语言
基本语法

select 查询属性
from 表
where 条件

多表查询

JOIN
ON

Where, 为了定义条件来过滤数据的。
Group by, 通过指定的条件来对数据进行分组.
Having, 跟group by结合使用, 用来过滤数据.
Order by用来排序。
Using, 跟Join结合使用,可以用on来替代.

  • sql语法名称属性中不出现'-',sql不区分大小写,sql中允许重复,*表示所有属性
  • sql使用select distinct from distrcutor查询得到不重复的结果
  • sql使用as重命名属性.select name as instucter_name ---
  • Constraints(五大约束)用来对表的记录设定规则。如果相关的记录不符合规则,就会被终止操作
  • 使用的aggarate函数:Avg, count, max, min, sum, first, last.
  • 使用的scalar函数:ucase, lcase, mid, format, len, round
  • VARCHAR用于存储可变长字符串,它比定长类型更节省空间。
    VARCHAR使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用1字节表示,否则使用2字节表示。
    VARCHAR存储的内容超出设置的长度时,内容会被截断。
    CHAR是定长的,根据定义的字符串长度分配足够的空间。
    CHAR会根据需要使用空格进行填充方便比较。
    CHAR适合存储很短的字符串,或者所有值都接近同一个长度。
    CHAR存储的内容超出设置的长度时,内容同样会被截断。
  • 主键约束或者唯一性键约束创建的索引的优先级高于使用create index语句创建的索引
  • %匹配任意字符串,_匹配一个字符
    2.sql存储过程
    Trigger相当于stored procedure, 它是用来对某些动作出反应的机制
    存储过程是一个被定义并保存在数据库服务器中的sql语句集,是一种介于应用程序和数据库间的编程接口,也是封装重复性工作的一种有效方法,它支持用户变量、条件执行及其它的编程功能。
存储过程的语法

CREATE PROCEDURE procedure_name([paramters[,...]])[attributes]
BEGIN
    body_statement
END;
  1. 数据库的三范式和五大约束
  • 第一范式:数据表中的每一列(字段)是不可拆分最小单元,确保每一列的原子性
  • 第二范式:满足1NF的基础上,表中的所有列,都必需依赖于主键,而不能有任何一列与主键没有关系
  • 第三范式:任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)(也表明不允许数据存在冗余的现象)
  • 五大约束:
    1.主键约束(Primay Key)
    2、唯一约束 (Unique)
    3、检查约束 (Check)
    4、默认约束 (Default)
    5、外键约束 (Foreign Key)

4.sql中不同类型的join

  • Inner join, 就是只要有一个列能够匹配, 就简单的返回两个table中所有的对应行。
    select columnnames from tablename1 inner join tablename2 on columnname1=columnname2

  • Left join也就是left outer join。当有一个列能够匹配时就返回左边表中所有的行。
    select columnnames from tablename1 left join tablename2 on columnname1=columnname2

  • Right join也就是right outer join,当有列匹配时,返回右边表格中所有的行。
    select columnnames from tablename1 right join tablename2 on columnname1=columnname2

  • Full join也就是full outer join, 当有匹配时, 会返回左边表格和右边表格任意情况下的行组合。

5.sql中的事务
有4种控制,一种是commit,也就是提交。一种是rollback,也就是回调。再一种是set transaction,对这个事务设定一个名字。再一种是save point。这个控制是用来设定某个点用来回退的。

6.权限
Grant和revoke分别是给予权限和去除权限。

7.聚集索引
Clustered索引和非clustered索引
一张表只有一个clustered索引,可以有多个非clustered索引。
clustered索引,要快于非clustered索引。
Clustered索引会存储数据在表和视图当中。而非clustered索引不会

8.查询
嵌套查询和关联查询有什么区别吗
在一个子查询中再套另外一个字查询成为嵌套查询。如果查询的输出依赖于父查询表的话,这个查询称为关联子查询。

9.Stored procedure是一系列的sql语句,可以被当做函数来执行操作数据库。stored procedure用来减轻网络负担并提高性能。

数据库的索引是为了快速的获取数据。
create index indexname on tablename (columnname )

11.identity
dentity是数据库自动生成的数字值来标识主键列, 我们可以定义一个起始值

如何随机的从表中取行?
select * from tablename sample 10

13.主键和唯一键
一个表中只允许有一个primary key,但是可以有多个unique key。

Primary key不可以为空,uniquekey 可以可以为空

14.数据库优化

  • 我们可以将表中字段的宽度设得尽可能小
  • 将字段很多的表分解成多个表
    对于字段较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。
    因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢
  • 增加中间表
    对于需要经常联合查询的表,可以建立中间表以提高查询效率。
    通过建立中间表,将需要通过联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询
  • 增加冗余字段
    设计数据表时应尽量遵循范式理论的规约,尽可能的减少冗余字段,让数据库设计看起来精致、优雅。但是,合理的加入冗余字段可以提高查询速度

15.大表优化
当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:
限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。;
读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读;
缓存: 使用MySQL的缓存,另外对重量级、更新少的数据可以考虑使用应用级别的缓存;
还有就是通过分库分表的方式进行优化,主要有垂直分表和水平分表

16.存储引擎MyIsam和Innodb区别

  • MyIsam类型不支持事务处理等高级处理,而Innodb类型支持
  • MyIsam表不支持外键。innodb支持外键
  • 在执行数据写入的操作(insert,update,delete)的时候,MyIsam表会锁表,而innodb表会锁行
  • MyIsam只要简单的读出保存好的行数,innodb中不保存表的具体行数
    ALTER TABLE `wp_posts` ENGINE = MyISAM;

17.几种索引类型的比较
聚集索引:物理存储按照索引排序(表中行的物理顺序与键值的索引顺序相同),叶子结点即存储了真实的数据行。
非聚集索引:物理存储位置不按照索引排序,叶子结点包含索引字段值及指向数据页数据行的逻辑指针。
一张表中只能创建一个聚集索引,但表中的每一列都可以有自己的非聚集索引。
唯一性索引:这一列数据不重复,只能一个为NULL
主键索引:主键索引是唯一索引的特定类型。不重复,不允许为空。主键只能有一个。
普通索引:create index等建立的索引,alter tablename add index …

行级锁是mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁。
特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
表级锁是mysql中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分Mysql引擎支持。最常使用的myisam和innodb都支持表级锁定。表级锁定分为表共享读锁(共享锁)和表独占写锁(排他锁)。
特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。
页级锁是mysql钟锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折中的页级,一次锁定相邻的一组记录。BDB支持页级表。
特点:开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。

事务的隔离级别有哪些
读未提交(Read Uncommitted)
读已提交(Read Committed)
可重复读(Repeatable Read)
串行化(Serializable)

超键:在关系模式中,能唯一知标识元组的属性集称为超键。
候选键:是最小超键,即没有冗余元素的超键。
主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
外键:在一个表中存在的另一个表的主键称此表的外键。

21.主键使用自增ID还是UUID,为什么?
如果是单机的话,选择自增ID;如果是分布式系统,优先考虑UUID吧,但还是最好自己公司有一套分布式唯一ID生产方案吧。
自增ID:数据存储空间小,查询效率高。但是如果数据量过大,会超出自增长的值范围,多库合并,也有可能有问题。
uuid:适合大量数据的插入和更新操作,但是它无序的,插入数据效率慢,占用空间大

22.MySQL的复制原理以及流程
主从复制原理,简言之,就三步曲,如下:
主数据库有个bin-log二进制文件,纪录了所有增删改Sql语句。(binlog线程)
从数据库把主数据库的bin-log文件的sql语句复制过来。(io线程)
从数据库的relay-log重做日志文件中再执行一次这些sql语句。(Sql执行线程)

你可能感兴趣的:(数据库SQL知识)