6.MySql第六课
34.索引:用来快速查询数据库表中的特定记录。所有数据类型都可以被索引。方式有普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
35.索引优点:提高检索速度;对于有依赖关系的子表和父表的联合查询时可以提高查询速度;使用分组和排序子句进行数据查询时,可以节省分组和排序的时间。
36.索引缺点:创建和维护索引需要消耗时间,且消耗时间的数量随着数据量的增加而增加;索引需要占用物理空间,每一个索引要占一定的物理空间;增加、删除和修改数据时,要动态的维护索引,造成数据的维护速度降低了。
37.索引设计的一般经验:选择唯一性索引;为经常需要排序、分组和联合操作的字段建立索引;为常作为查询条件的字段建立索引;限制索引的数目;尽量使用数据量少的索引;尽量使用前缀来索引;删除不再使用或者很少使用的索引。
38.在已经存在的表上创建索引语法:
Create [unique|fulltext|spatial|] index 索引名 on 表名( 属性名 [(长度)] [ASC|DESC]);
39:用alter table来创建索引
Alter table 表名add[unique|fulltext|spatial] index 索引名( 属性名[(长度)] [ASC|DESC] );
7.MySql第七课
40.视图是从一个或多个表中导出来的表,是一种虚拟存在的表。通过视图可以看到系统专门提供的数据。这样用户可以不用看到整个数据库表中的数据,而只关心对自己有用的数据。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。
41.创建视图语法格式:
Create [algorithm={undefined|merge|temptable}] view 视图名 [(属性清单)] as select语句[with [cascaded|local] check option ];
42.在单表上创建视图:【也可以多表上创建视图】
Create view 视图名 as select *from 表名
43.查看视图必须要有show view的权限,mysql数据库下的user表中保存有这个信息。
44.查看视图:
Describe 视图名;
Show create view 视图名;此语句可以查看视图的详细定义。
Select * from information_schema.views;可以查看数据库中所有视图的详细信息。其中“*”号表示查询所有的列的信息。
45.mysql中可以使用create或replace view来修改视图:
Create or replace [algorithm={ undefined|merge|temptable }] view 视图名 [(属性清单)] as select语句 [with [cascaded| local | check option]];
Alter [algorithm={ undefined|merge|temptable }] view 视图名 [(属性清单)] as select语句 [with [cascaded| local | check option]];
46.更新视图是指通过视图来插入、更新、删除表中的数据。因为视图是一个虚拟表,其中没有数据。通过视图更新时都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据,不能更新超出了范围的数据。
47.以下情况不能更新视图:
视图中包含sum(),count(),max(),min()等函数时。
视图中包含union,union all,distinct,group by,having等关键字时。
常量视图也不可更新;
视图中的select语句包含子查询;
由不可更新的视图导出的视图;
创建视图时algorithm为temptable类型;
视图对于的表上存在没有默认值的列,而且该列没有包含再视图里。因为在更新视图时,这个没有默认值的记录将没有值插入,也没有null插入。数据库系统是不会允许这样的情况出现的。
48.删除视图只能删除视图的定义,不能删除数据。语法如下:
Drop view [if exists] 视图名列表 [restrict|cascade]
8.MySql第八课
49.触发器是由事件来出发某个操作。这些事件包括insert语句、update语句、delete语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。
50.创建只有一个执行语句的触发器:
Create trigger 触发器名 before|after 触发事件 on 表名 for each row 执行语句
51.创建有多个执行语句的触发器:
Create trigger 触发器名 before|after 触发事件 on 表名 for each row
Begin
执行语句列表
End
52.查看触发器:
Show triggers;
Select * from information_schema.triggers;
mysql中所有触发器都存在information_schema数据库下的triggers表中。
53.删除触发器:
Drop trigger 触发器名;
9.MySql第九课
54.本章讲解以下内容:查询语句的基本语法;在单表上查询数据;使用聚合函数查询数据;多表上联合查询;子查询;合并查询结果;为表和字段取别名;使用正则表达式查询。
55.基本查询语句:
Select 属性列表 from 表名和视图列表 [where 条件表达式1] [group by 属性名1 [having 条件表达式2]] [order by 属性名2 [ASC|DESC]];
56.单表查询所有字段:
可以有两种方式:select 属性1,属性2.....属性n from 表名;
或者是:select * from 表名;其中“*”指查询所有属性。
57.查询指定记录:
使用where语句。例如:select * from 表名 where 指定属性值
58.带in关键字的查询:in关键字可以判断某个字段的值是否在指定的集合中。如果在集合中则满足查询条件,该记录将被查询出来。
[not ]in (元素1,元素2,.......元素n);
59.常用的查询条件:
条件 |
符号或关键字 |
比较 |
=,<,<=,>,>=,!=,<>,!>,!< |
指定范围 |
[not] Between 值1 and 值2 |
指定集合 |
In,not in |
匹配字符 |
[not] Like '字符串',可以借助通配符“%”或者“_”来实现模糊查询。 |
是否为空值 |
Is null,is not null |
多个查询条件 |
And,or |
60.带distinct关键字的查询:消除选中属性的重复记录
Select distinct 属性 from 表名;
61.对查询结果排序:
Order by 属性名[ASC|DESC];
62.分组查询:group by关键字可将查询结果按某个字段或多个字段进行分组。字段中值相等的为一组。语法如下:
Group by 属性名[having 条件表达式] [with rollup];
63.group by的扩展语法:
Select 属性名1,group_concat(属性名2) from 表名 group by 属性名1;把表按属性名1进行分组查询,使用group_concat()函数将每个分组的属性名2的值显示出来。
Select 字段1,count(字段1) from 表名 group by 字段1;把表按字段1进行分组查询,字段取值相同的为一组。然后对每一组使用集合函数count()进行计算,求出每一组的记录书。
Select 字段1,count(字段1) from 表名 group by 字段1 having count(字段1) >= num;把表按字段1进行分组查询,然后显示记录数大于等于num的分组。
Select * from 表名 group by 字段1,字段2;把表按照字段1和字段2进行分组。
64.limit关键字:指定查询结果从那条记录开始显示,两种使用方式,不指定初始位置和指定初始位置。
Select * from 表名 limit 2;查询表的所有记录,但是只显示前两条;
Select * from 表名 limit 1,2;查询表的所有记录,并从第二条记录开始显示,共显示两条;
65.集合函数:count(),sum(),avg(),max(),min()的使用。
Select count(*) from 表名;统计表的记录数;
Select 字段1,count(*) from 表名 group by 字段1;统计表中不同的字段1的记录数;
Slect 字段1,sum(字段2) from 表名 where 字段1=1000;利用sum函数统计字段1的值为1000的该条记录的字段2的总和。
Select 字段1,sum(字段2) from 表名 group by 字段1;把表按照字段1进行分组,然后使用sum函数统计各分组的总成绩。
Select avg(字段1) from 表名;使用avg函数计算表中字段1的平均值;
Select 字段1,avg(字段2) from 表名 group by 字段1;先把表按照字段1进行分组,然后再在各个分组里计算字段2的平均值;
Select max(字段1) from 表名;使用max函数计算表中字段1的最大值;
Select 字段1,字段2,max(字段3) from 表名 group by 字段2;先按字段2进行分组,再在每个组里查找字段3的最大值;
注:min函数语法也一样;
66.连接查询:将多个表按某个条件连接起来查询,从中选取需要的数据。当不同的表中存在相同意义的字段时可以通过该字段来连接这几个表。
【为方便理解,我有时候直接按教程里的源代码些了,即用课程里的字段名来代理“字段名”,表名的处理方式也是一样。】
基本语法:
select 字段列表 function from 表名1.属性名1=表名2.属性名2;
Select 字段列表 from 表名1 left|right join 表名2 on 表名1.属性名1 = 表名2.属性名2;
Select num,name,employee.d_id,age,sex,d_name,function from employee,department where employee.d_id = department.d_id;该以内连接查询方式查询employee表和department表。
Select num,name,employee.d_id,age,sex,d_name,function from emplyee left join department on employee.d_id = department.d_id;使用外连接中的左连接查询方式查询表employee和department,两表通过d_id字段进行连接。
Select num,name,employee.d_id,age,sex,d_name,function from emplyee right join department on employee.d_id = department.d_id;使用外连接中的右连接查询方式查询表employee和department,两表通过d_id字段进行连接。
67.复合条件查询,在使用各种查询方式的同时可以附件一些复合查询条件提高查询效率和精度。
68.子查询:将一个查询语句潜逃在另一个查询语句中。也就是把内层查询的结果作为外层查询的条件。
Select id,name,score from computer_stu where score >= (select score from scholarship where level = 1);从computer_stu表中查询获得一等奖学金的学生的学号、姓名和分数,各个等级的奖学金的最低分存储在scholarship表中。
Select * from employee where d_id [not] in (select d_id from department);查询employee表中的记录,这些记录的d_id字段的值必须【没有】在department表中出现过。
Select * from employee where【not】 exists (select d_name from department where d_id = 1003);如果department表中【不】存在d_id为1003的记录,则查询employee表的记录。带exists关键字的查询返回一个真假值true或者false,且当返回的值是真时,外层查询语句将进行查询。
Select * from employee where age>=24 and exists (select d_name from department where d_id = 1003);如果department表中存在d_id为1003的记录,则查询employee表中age大于24的记录。
Select * from computer_stu where score>=any (select score from scholarship);从computer_stu表中查询哪些同学可以获得奖学金,奖学金的信息存储在表schlarship中。Any关键字表示满足其中任一条件,any关键字通常与比较运算符一起使用。
Select * from computer_stu where score>=all (select score from scholarship);All关键字表示满足所有条件,只有满足内层查询语句返回的所有结果才可以执行外层查询语句。也常和比较运算符一起使用。
Select d_id from department union select d_id from employee;从department表和employee表中选择d_id字段,然后通过union关键字将结果合并到一起。
69.为表取别名,以方便输入:
Select * from department department d where d.d_id = 1001;为表department取别名d,然后查询表d中d_id字段的值。
Select d_id as department_id,d_name as department_name from department;为表department中的字段d_id取名为department_id,d_name取名为department_name。这里as似乎可以省略不写。
70.使用正则表达式查询。【这个目前暂未用到,为加快学习进度先搁置。】
正则表达式是使用某种模式去匹配一类字符串的一个方式。Mysql中使用regexp关键字来匹配查询正则表达式:属性名 regexp '匹配方式'。
10.MySql第十课【插入、更新、删除】
71.mysql中通过insert语句来插入新的数据。可以为表的所有字段插入数据,可以为表的指定字段插入数据,可以插入多条记录,还可以讲一个表中查询出来的数据插入到另一个表中。
Insert into 表名(属性名1,属性名2,.......属性名n) values(值1,值2,........值n);
72.将查询结果插入到表中:
Insert into 表名1(属性列表1) select 属性列表2 from 表名2 where 条件表达式;
Insert into product(id, function, name, address, company) select id,function,name,address,company from medicine;将medicine表中的所有数据查询出来并插入到表product中。
73.更新数据基本语法:update 表名 set 属性名1=取值1,属性名2=取值2,....属性名n=取值n where 条件表达式;
74.删除数据:delete from 表名 [where 条件表达式];
本文出自 “From quantity to quality” 博客,转载请与作者联系!