MYSQL基础
1.SQL类别
SQL语句主要可以分为三个类别:
- DLL(Data Definition Language):数据定义语言,用来定义不同的数据段,数据库,表,列,索引等数据库对象,常用的语句包括create,drop,alter等。
- DML(Data Manipulation Language):数据操纵语言,就是常见的增删改查,常用的关键字包括:insert,update,delete,select等。
- DCL(Data Control Language):数据控制语句,用于访问控制不同数据段直接的许可和访问级别的语句。定义数据库,表,字段,用户权限和安全级别,常用关键字grant(赋予),revoke(收回)等。
具体的DLL,DML语句就不说了,只说几个特殊的例子。
- 比如:在mysql中。update可以同时更新多个表中的数据
emp:
dept:
select * from emp;
select * from dept;
update emp a,dept b set a.sal = a.sal * b.deptno ,b.deptname = a.ename where a.deptno = b.deptno;
执行后发现两个表的数据同时进行了更新
注意:多表更新的语法更多的用于根据一个表的字段动态的更新另外一个表的字段
- 查询不重复的记录
select ename, hiredate, sal, deptno from emp;
select distinct deptno from emp;
select distinct * from emp;
- 查询数据只显示一部分
select ...[LIMIT OFFSET_START,ROW_COUNT]
其中offset_start表示记录的偏移量,默认从0开始,row_count表示显示的行数,默认情况下,不写偏移量,只写显示的行数,显示的就是前n条记录,例如,显示emp的前三条数据
select * from emp;
select * from emp limit 3;
如果想要查询从第二条记录开始往后走三条,就可以这么写
select * from emp limit 1,3;
注意:limit经常和order by一起配合使用来进行记录的分页查询,改变limit的两个变量即可,注意order by的时候多带一个唯一值排序(比如ID),防止唯一值重复分页出现问题
- having和where的区别
having是对聚合后的结果进行条件的过滤,where是在聚合前就对记录进行过滤,如果逻辑允许,尽可能先用where过滤记录,这样结果集减小,聚合效率将大大提高。
- with rollup关键字
可选参数,表明是否对分类聚合后的结果再汇总
select deptno,count(1) from emp group by deptno;
select deptno,count(1) from emp group by deptno with rollup ;
- 表连接很多情况下可以优化子查询
--子查询所有员工表中部门在部门表中的数据
select * from emp where deptno in (select dept.deptno from dept);
select a.* from emp a inner join dept b on a.deptno=b.deptno;
- union和union all的区别
有时候会有这样的情况,需要将多个sql查询出的数据拼接在一起(注意使用时显示字段名两段sql必须一致),就需要用到union和union all
union all是将所有结果都聚合在一起,union在聚合后会对结果去重,相当于使用了distinct
select deptno from emp
union all
select deptno from dept;
select deptno from emp
union
select deptno from dept;
- 查询元数据信息
MYSQL5.0后新增了一个数据库information_schema,里面记录了Mysql中的元数据信息,比如表名,列名,列类型,索引名等属性名称,它是一个虚拟数据库,物理上不存在目录和文件,而是视图的方式展示
,一些比较常见的视图
- SCHEMATA:该表提供了所有数据库的信息,show database来自此表。
- TABLES:该表提供了数据数据库表的信息(包括视图),详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息,show table from schemaname来自此表。
- COLUMNS:该表提供了表中的列数据,表示某张表的所有列以及列信息,show columns from schemaname.tablename的结果来自此。
- STATISTICS:该表提供了表索引的信息,show index from schemaname.tablename的结果来自此。
use information_schema;
show tables ;
select * from SCHEMATA;
select * from TABLES;
select * from COLUMNS;
select * from STATISTICS;