1.sql语句的分类
- DDL:表的创建,删除,修改
- DML:数据的插入,删除,修改
- DQL:数据的查询
- DCL:数据控制语言,grant,revoke
2.主键、外键、候选键、超键
- 主键:作表的行的惟一标识的候bai选关键字。一个表只有一个主关键字; 主键可以由一个字段,也可以由多个字段组成,分别成为单字段主键或多字段主键
- 外键:用于关联其他数据表的关系键
- 候选键:不含有多余属性的超键称为候选键
- 超键:在数据表中能唯一标识数据行属性的集合超键
3.sql约束
- 主键约束
- 非空约束
- 唯一约束
- 外键约束
- check约束:限制列中的值的范围
Id_P int NOT NULL CHECK (Id_P>0)
- 默认值约束
4. 关联查询
- 交叉连接(CROSS JOIN):没有任何关联条件,查询所有表
select * form a,b,c
select * from a cross join b cross join c
- 内连接(INNER JOIN)
- 外连接(LEFT JOIN/RIGHT JOIN)
- 联合查询(UNION 与 UNION ALL)
- 全连接(FULL JOIN)
5.子查询的三种情况
- 外层查询
select id,uid,name from goods where uid = (select max(uid) from goods)
- from查询
SELECT COUNT(uid)
FROM (
SELECT id,uid,action,currend,SUM(`value`) as val
FROM from
GROUP BY uid
) as tmp
WHERE tmp.val BETWEEN '0' AND '5'
- exists查询:先判断外层有没有,如果有就查询,否则没有就直接跳过
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。
select cat_id,cat_name
from category
where exists (
select *
from goods
where goods.cat_id=category.cat_id
);
6.in和exists的区别
- in 确定给定的值是否与子查询或列表中的值相匹配;在查询的时候,首先查询子查询的表,然后将内表查询的结果和外表做一个笛卡尔积,然后按照条件进行筛选
- exists:指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。(先查主表,再查子查询)
- 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists
- not in 和not exists:如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
7.mysql中int(10)和char(10)以及varchar(10)的区别:
- int(10)的10表示显示的数据的长度,不是存储数据的大小;chart(10)和varchar(10)的10表示存储数据的大小,即表示存储多少个字符
- char(10)表示存储定长的10个字符,不足10个就用空格补齐,占用更多的存储空间
- varchar(10)表示存储10个变长的字符,存储多少个就是多少个,空格也按一个字符存储
8.drop、delete与truncate的区别
- delete语句执行删除的过程是每次从表中删除一行(DML)
- truncate一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的,不会激活删除触发器(DDL)
- drop删除表结构和数据(DDL)
9.union和union all
- UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型
- UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值(包括重复的列)