如何用mysql建立数据库(MySQL数据库基础知识及优化)
SQL语句基础知识及优化
SQL语句主要分为哪几类 *
- 数据据定义语言DDL(Data Definition Language):主要有CREATE,DROP,ALTER等对逻辑结构有操作的,包括表结构、视图和索引。
- 数据库查询语言DQL(Data Query Language):主要以SELECT为主
- 数据操纵语言DML(Data Manipulation Language):主要包括INSERT,UPDATE,DELETE
- 数据控制功能DCL(Data Control Language):主要是权限控制能操作,包括GRANT,REVOKE,COMMIT,ROLLBACK等。
SQL约束有哪些? **
- 主键约束:主键为在表中存在一列或者多列的组合,能唯一标识表中的每一行。一个表只有一个主键,并且主键约束的列不能为空。
- 外键约束:外键约束是指用于在两个表之间建立关系,需要指定引用主表的哪一列。只有主表的主键可以被从表用作外键,被约束的从表的列可以不是主键,所以创建外键约束需要先定义主表的主键,然后定义从表的外键。
- 唯一约束:确保表中的一列数据没有相同的值,一个表可以定义多个唯一约束。
- 默认约束:在插入新数据时,如果该行没有指定数据,系统将默认值赋给该行,如果没有设置没默认值,则为NULL。
- Check约束:Check会通过逻辑表达式来判断数据的有效性,用来限制输入一列或者多列的值的范围。在列更新数据时,输入的内容必须满足Check约束的条件。
什么是子查询? **
子查询:把一个查询的结果在另一个查询中使用
子查询可以分为以下几类:
- 标量子查询:指子查询返回的是一个值,可以使用 =,>,<,>=,<=,<>等操作符对子查询标量结果进行比较,一般子查询会放在比较式的右侧。SELECT * FROM user WHERE age = (SELECT max(age) from user) //查询年纪最大的人
- 列子查询:指子查询的结果是n行一列,一般应用于对表的某个字段进行查询返回。可以使用IN、ANY、SOME和ALL等操作符,不能直接使用SELECT num1 FROM table1 WHERE num1 > ANY (SELECT num2 FROM table2)
- 行子查询:指子查询返回的结果一行n列SELECT * FROM user WHERE (age,sex) = (SELECT age,sex FROM user WHERE name="zhangsan")
- 表子查询:指子查询是n行n列的一个数据表SELECT * FROM student WHERE (name,age,sex) IN (SELECT name,age,sex FROM class1) //在学生表中找到班级在1班的学生
了解MySQL的几种连接查询吗? ***
MySQl的连接查询主要可以分为外连接,内连接,交叉连接
- 外连接外连接主要分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)、全外连接。左外连接:显示左表中所有的数据及右表中符合条件的数据,右表中不符合条件的数据为null。
右外连接:显示左表中所有的数据及右表中符合条件的数据,右表中不符合条件的数据为null。
MySQL中不支持全外连接。
- 内连接:只显示符合条件的数据
- 交叉连接:使用笛卡尔积的一种连接。笛卡尔积,百度百科的解释:两个集合X和Y的笛卡尔积表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 。例如:A={a,b},B={0,1,2},A × B = {(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
举例如下:有两张表分为L表和R表。
L表
R表
- 左外连接 :select L.`*`,R.`*` from L left join R onL.b=R.b
- 右外连接:select L.`*`,R.`*` from L right join R onL.b=R.b
- 内连接:select L.`*`,R.`*` from L inner join R on L.b=R.b
- 交叉连接:select L.`*`,R.`*` from L,R
mysql中in和exists的区别? **
in和exists一般用于子查询。
- 使用exists时会先进行外表查询,将查询到的每行数据带入到内表查询中看是否满足条件;使用in一般会先进行内表查询获取结果集,然后对外表查询匹配结果集,返回数据。
- in在内表查询或者外表查询过程中都会用到索引。
- exists仅在内表查询时会用到索引
- 一般来说,当子查询的结果集比较大,外表较小使用exist效率更高;当子查询寻得结果集较小,外表较大时,使用in效率更高。
- 对于not in和not exists,not exists效率比not in的效率高,与子查询的结果集无关,因为not in对于内外表都进行了全表扫描,没有使用到索引。not exists的子查询中可以用到表上的索引。
varchar和char的区别? ***
- varchar表示变长,char表示长度固定。当所插入的字符超过他们的长度时,在严格模式下,会拒绝插入并提示错误信息,在一般模式下,会截取后插入。如char(5),无论插入的字符长度是多少,长度都是5,插入字符长度小于5,则用空格补充。对于varchar(5),如果插入的字符长度小于5,则存储的字符长度就是插入字符的长度,不会填充。
- 存储容量不同,对于char来说,最多能存放的字符个数为255。对于varchar,最多能存放的字符个数是65532。
- 存储速度不同,char长度固定,存储速度会比varchar快一些,但在空间上会占用额外的空间,属于一种空间换时间的策略。而varchar空间利用率会高些,但存储速度慢,属于一种时间换空间的策略。
MySQL中int(10)和char(10)和varchar(10)的区别? ***
int(10)中的10表示的是显示数据的长度,而char(10)和varchar(10)表示的是存储数据的大小。
drop、delete和truncate的区别? **
dropdeletetruncate速度快逐行删除,慢较快类型DDLDMLDDL回滚不可回滚可回滚不可回滚删除内容删除整个表,数据行、索引都会被删除表结构还在,删除表的一部分或全部数据表结构还在,删除表的全部数据
一般来讲,删除整个表,使用drop,删除表的部分数据使用delete,保留表结构删除表的全部数据使用truncate。
UNION和UNION ALL的区别? **
union和union all的作用都是将两个结果集合并到一起。
- union会对结果去重并排序,union all直接直接返回合并后的结果,不去重也不进行排序。
- union all的性能比union性能好。
点个赞! ()