特殊数据类型
enum(‘m’,‘w’) 单选
set(‘java’,‘c’,‘linux’) 多选
插入,更新,删除数据
1.插入数据:
insert into 表名 values(插入属性对应的值);
2.将查询结果插入到表中:
insert into 表名1 (属性列表1)
select 属性列表2 from 表名2 where 条件表达式;
注意:必须保证‘列表1’和‘列表2’中字段个数和数据类型是一样的,
3.更新数据:
update 表名 set 属性名 = 新值 where 条件表达式;
4.删除数据:
delete from 表名 where 条件表达式;
创建,修改,删除表
设置表的主键:
1.单字段主键
属性名 数据类型 pirmary key;
2.多字段主键
primary key(属性名1,属性名2,,,属性名n)
设置表的外键:
外键可以为空值,
constraint 外键别名 foreign key(属性名1.1,属性名1.2,,,,,属性名1.n) references 父类表名(属性名2.1,属性名2.2,,,,,属性名2.n);
‘外键别名’指外键的代号,‘属性1’是子表中设置的外键,‘父类表名’指父类的名称,‘属性2’是父类的主键
删除表的外键约束:
alter table 表名 drop foreign key 外键别名;
修改表名:
alter table 旧表名 rename [to] 新表名;
修改字段的数据类型:
alter table 表名 modify 属性名 新数据类型;
‘属性名’指需要修改的字段的名称
‘数据类型’指修改后的新数据类型
修改字段名和字段数据类型:
alter table 表名 change 旧字段名 新字段名 新数据类型;
增加字段:
第一个位置添加元素:
alter table 表名 add 属性名1 数据类型 [约束条件] first;
指定位置添加元素:
alter table 表名 add 属性名1 数据类型 [约束条件] [first | after 属性名2];
删除字段:
alter table 表名 drop 属性名;
删除字段约束条件:
alter table 表名 drop 约束名;
修改字段的排列位置:
alter table 表名 modify 属性名1 数据类型 first | after 属性名2;
更改表的存储引擎:
alter table 表名 engine=存储引擎名;
改动字符集:
表的字符集:
alter table 表名 character set utf8;
属性的字符集:
alter table 表名 modify 属性名 数据类型 character set utf8;
视图
视图:
视图起着类似于筛选的作用;
create [algorithm = {undefined | merge | temptable }]
view 视图名 [(属性清单)]
as select 属性名 from 表名
[with [cascaded | local ] check option];
'algorithm’表示视图选择的算法;
'with check option’表示更新视图时要保证在该视图的权限范围之内;
使用create view 语句创建视图时,最好加上with cascaded check option 参数,这样,从视图上派生出来的新视图后,更新新视图需要考虑其父视图的约束条件。这种方式比较严格,可以保证数据的安全性;
查看是否具有select,create view,drop的权限
select Select_priv,Create_view_priv,drop_priv from mysql.user where user='用户名';
‘Y’表示有权限,‘N’表示没有权限;
在单表上创建视图:
1.create view 视图名 as select * from 表名;
2.create view 视图名(属性名) as select 属性名 from 表名;
在多表上创建视图:
create algorithm=merge
-> view stu_view3(name,id,sex,address,course)
-> as select name,num,sex,address,grade.course
-> from student,grade where student.num=grade.id
-> with local check option;
查看视图:
1.desc 视图名;
2.show table status like '视图名';
视图为虚拟表,同样这句查询语句,结果不同
3.show create view 视图名;
在views表中查看视图的详细信息:
select * from information_schema.views;
修改视图语句:
create or replace [algorithm = {undefined | merge | temptable }]
view 视图名 [(属性清单)]
as select 属性名 from 表名
[with [cascaded | local ] check option];
alter [algorithm = {undefined | merge | temptable }]
view 视图名 [(属性清单)]
as select 属性名 from 表名
[with [cascaded | local ] check option];
更新视图:
update 视图名 set 属性名1=新数据1,属性名2=新数据2;
删除视图:
drop view [if exists] 视图名;
drop 语句可以同时删除多个视图
触发器
触发器:
创建一个由insert出发的触发器:
create trigger 触发器名 before insert
on 表名 for each row
insert into 记录时间的表 values(now());
创建多个执行语句的触发器:
delimiter &&
create trigger 触发器名 before | after 触发事件
on 表名 for each row
begin
执行语句列表
end
delimiter ;
在创建触发器过程中需要用到‘;’,MySQL默认结束语句为分号,因此用delimiter语句修改结束符号,
注意:delimiter后需要加空格 delimiter &&
查看触发器:
1.show triggers\G
无法查询指定的触发器,该语句只能查询所有的触发器;
在触发器很少时,可以使用show triggers\G ;
2.select * from information_schema.triggers\G
select * from information_schema.triggers where trigger_name=‘触发器名’\G
删除触发器:
drop trigger 触发器名;
一定要删除不需要的触发器;
如果没有将这个触发器删除,那么每次执行触发事件时,都会执行触发器中的执行语句,执行语句会对数据库中的数据进行某些操作,这回造成数据的变化。
查询语句
带in关键字查询:
in关键字可以判断某个字段的值是否在指定的集合中
select * from 表名 where 属性名 in(元素1,元素2,...,元素n);
带between and 的范围查询:
between and 关键字可以判断某个字段的值是否在指定的范围内
select * from 表名 where 属性名 between 值1 and 值2;
带like的字符匹配查询:
like关键字可以匹配字符串是否相等
select * from 表名 where 属性名 like '元素';
匹配一个完整的字符串,like 和 = 效果是相同的;
如果查询的字符串中包含了通配符,就只能使用like 来查询;
‘%’表示多个字符;
‘_’表示一个字符;
查询空值:
select * from 表名 where 属性名 is [not] null;
‘is’ 不能换成 ‘=’;
带and的多条件查询:
同时满足所有查询条件的数据才会被查询
select * from 表名 where 条件表达式1 and 条件表达式2 [...and 条件表达式n];
带or的多条件查询:
只要满足其中一个查询条件的数据就会被查询出来
select * from 表名 where 条件表达式1 or 条件表达式2 [...or 条件表达式n];
注意:当 and 和 or 一起使用时,and 要比 or 先运算;
查询结果不重复:
select distinct 属性名 from 表名;
对查询结果排序:
select * from 表名 order by 属性名 [asc | desc];
asc表示按升序排序,desc表示按降序排序;
MySQL中,可以指定按多个字段进行排序,排序过程中,按代码顺序第一种字段进行排序,遇到值相同的情况,再将相同的值进行下一个字段排序;
select * from 表名 order by 属性名1 [asc | desc],属性名2 [asc | desc];
分组查询:
将查询结果按某个字段或多个字段进行分组;
1.单独使用group by 关键字来分组:
select * from 表名 group by 属性名;
group by 单独使用时,只能查询出每个属性分组的一条数据,
2.group by 与group_concat()函数一起使用:
select 属性名1,group_concat(属性名2) from 表名 group by 属性名1;
通过属性名1来分组,查询出属性名1数据相同的全部属性名2的数据
3.group by 与集合函数一起使用:
可以通过集合函数计算分组中的总记录,最大值,最小值等;
总记录:
select 属性名,count(属性名) from 表名 group by 属性名;
4.group by 与having 一起使用 :
可以限制输出的结果,只有满足条件表达式的结果才会显示;
select 属性名,count(属性名) from 表名 group by 属性名 having count(属性名)>3;
只有当所需要查询的属性的数据总量大于3才会显示出来;
5.按多个字段进行分组:
先按属性名1进行分组,遇到值相同的情况,再把相同的值按属性名2进行分组,以此类推。
select * from 表名 group by 属性名1,属性名2,...,属性名n;
6.group by 与 with rollup 一起使用:
使用with rollup 后缀时,会在所有记录的最后加上一条记录,这条记录是上面所有记录的总和;
limit关键字限制查询
用 limit 限制查询结果的数量:
1.limit 关键字不指定初始位置
limit 关键字不指定初始位置时,记录从第一条记录开始显示,显示记录的条数由limit关键字指定;
select * from 表名 limit 记录数;
2.limit 关键字指定初始位置时
select * from 表名 limit 初始位置,记录数;
‘初始位置’指定从哪条数据开始显示,
‘记录数’表示显示数据的条数,
第一条数据的位置时0,第二条数据的位置时1;
集合函数查询
1.count() 函数:
统计总数据的条数;
select count(*) from 表名;
统计单个属性的相同数据的条数:
select 属性名,count(属性名) from 表名 group by 属性名;
2.sum() 函数:
求和函数,可以求出表中某个字段取值的总和;
select sum(求和属性名) from 表名;
sum()函数一般与group by 关键字连用;
3.avg() 函数:
求平均值,可以求出表中某个字段取值的平均值;
4.max(),min() 函数;
求最大值或者最小值;
连接查询
1.内连接查询:
可以查询两个或者两个以上的表,当表中存在表示相同意义的字段时,可以通过该字段来连接这两个表:当该字段的值相等时,就查询出该记录;
select 属性名 from 表名1,表名2 where 表的相同字段值相等;
2.外连接查询:
外连接查询需要通过指定字段来进行查询,当该字段值相等时,查询出该记录,而且,该字段取值不相等的记录也可以查询出来。
select 属性名列表 from 表名1 left | right join 表名2 on 表名1.属性名 1 = 表名2.属性名2;
使用左查询,表1 的数据全部显示,表2 只显示匹配条件的记录;
使用右查询,表2 的数据全部显示,表1 只显示匹配条件的记录;
子查询
1.带in关键字的子查询:
一个查询语句的条件可能落在另一个select语句的查询结果中
select * from 表名1 where 属性名 [not] in (select 相关属性名 from 表2);
2.带比较运算符的子查询:
<> 与 != 是等价的
select * from 表名1 where 属性名 比较运算符 (select 相关属性名 from 表2);
3.带exists关键字的子查询:
exists表示存在,使用exists关键字时,内层查询语句不返回查询的数据,而是返回一个真假值。如果内层查询语句查询到满足条件的记录,就返回一个真值(true),否则,将返回一个假值(false)。当返回true时,外层查询进行查询;当返回false时,外层查询不进行查询或查询不出任何数据;
当exists与其他查询条件一起使用时,条件表达式与exists关键字之间用and 或者 or连接。
3.带any关键字的子查询:
表示满足其中任一条件;
4.带all关键字的子查询:
表示满足所有条件;
合并查询
进行合并操作使用union 和 union all 关键字
union:将查询结果合并到一起,然后出点相同的记录;
union all:简单的合并到一起;
select 语句1
union | union all
select 语句2
union | union all
select 语句n;