1.SQL语句主要分为哪几类
1. 数据定义语言DDL(Data Ddefinition Language)CREATE,DROP,ALTER
主要为以上操作即对逻辑结构等有操作的,其中包括表结构,视图和索引。
2. 数据查询语言DQL(Data Query Language)SELECT
这个较为好理解即查询操作,以select关键字。各种简单查询,连接查询等都属于DQL。
- 3.数据操纵语言DML(Data Manipulation Language)INSERT,UPDATE, DELETE
主要为以上操作即对数据进行操作的,对应上面所说的查询操作DQL与DML共同构建了多数初级程序员常用的增删改查操作。而查询是较为特殊的一种被划分到DQL中。
- 4. 数据控制功能DCL(Data Control Language)GRANT,REVOKE, COMMIT,ROLLBACK
主要为以上操作即对数据库安全性完整性等有操作的,可以简单的理解为权限控制等。
2.超键、候选键、主键、外键分别是什么?
- 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。
- 候选键:是最小超键,即没有冗余元素的超键。
- 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。 一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
-
3.SQL 约束有哪几种?
NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
- UNIQUE: 控件字段内容不能重复,一个表允许有多个Unique 约束。
- PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一 个。
- FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键 列,因为它必须是它指向的那个表中的值之一。
- CHECK: 用于控制字段的值范围。
4.mysql中 in 和 exists 区别
mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop 循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。
- 如果查询的两个表大小相当,那么用in和exists差别不大。
- 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。
- not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
5.varchar与char的区别
- char的特点
- 1.char表示定长字符串,长度是固定的;
- 2.如果插入数据的长度小于char的固定长度时,则用空格填充;
- 3.因为长度固定,所以存取速度要比varchar快很多,甚至能快50%, 但正因为其长度固定,所以会占据多余的空间,是空间换时间的做法;
- 4.对于char来说,最多能存放的字符个数为255,和编码无关
- varchar的特点
- varchar表示可变长字符串,长度是可变的;
- 2.插入的数据是多长,就按照多长来存储;
- 3.varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间,是时间换空间的做法;
- 4.对于varchar来说,最多能存放的字符个数为65532
总之,结合性能角度(char更快)和节省磁盘空间角度(varchar更小),具体情况还需具体来设计数据库才是妥当的做法。
6.varchar(50)中50的涵义
最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度 (memory引擎也一样)。在早期 MySQL 版本中, 50 代表字节数,现在代表字符数。
7.int(20)中20的涵义
是指显示字符的长度。20表示最大显示宽度为20,但仍占4字节存储,存储范围不变;不影响内部存储,只是影响带 zerofill 定义的 int 时,前面补多少个 0,易于报表展示
8.mysql中int(10)和char(10)以及varchar(10)的区别
- int(10)的10表示显示的数据的长度,不是存储数据的大小; chart(10)和varchar(10)的10表示存储数据的大小,即表示存储多少个字 符。
- char(10)表示存储定长的10个字符,不足10个就用空格补齐,占用更多的存储空间
- varchar(10)表示存储10个变长的字符,存储多少个就是多少个,空格也按一个字符存储,这一点是和char(10)的空格不同的,char(10)的空 格表示占位不算一个字符
9.FLOAT和DOUBLE的区别是什么?
- FLOAT类型数据可以存储至多8位十进制数,并在内存中占4字节。
- DOUBLE类型数据可以存储至多18位十进制数,并在内存中占8字节。
10.drop、delete与truncate的区别
三者都表示删除,但是三者有一些差别:
| delete | truncate | drop | |
|---|---|---|---|
| 类型 | 属于DML | 属于DDL | 属于DDL |
| 回滚 | 可回滚 | 不可回滚 | 不可回滚 |
| 删除内容 | 表结构还在,删除表的全部或者一部分数据行 | 表结构还在,删除表中的所有数据 | 从数据库中删除表,所有的数据行,索引和权限也会被删除 |
| 删除速度 | 删除速度慢,需要逐行删除 | 删除速度快 | 删除速度最快 |
因此,在不再需要一张表的时候,用drop;
在想删除部分数据行时候,用 delete;
在保留表而删除所有数据的时候用truncate。
11.UNION与UNION ALL的区别?
- 如果使用UNION ALL,不会合并重复的记录行
- 效率 UNION 高于 UNION ALL
