mysql数据库的操作
数据库操作
1.创建数据库
(1).character set:指定数据库采用的字符集,如果不指定字符集,默认时候是utf8
(2).collate:指定数据库字符集的校对规则 (常用utf8_bin、utf8_general_ci注意默认是utf8_general_ci)
create database mysql01;//默认创建数据库表mysql01
create database mysql01 default character set utf8;//创建指定默认字符集为交的数据库
show character set;//查看可用字符集名称
show collation;//查看可用的排序规则名称
create database student character set utf8 default collate utf8_bin;
//创建指定的默认字符集utf8,排序规则为utf8_bin的数据库(student)
2.查看、删除和修改数据库
(1).使用数据库:use 数据库名称;
(2).修改数据库:使用alter database语句可以修改一个已有的数据库的默认字符集和排序规则。
(3)删除数据库:drop database mysql01;
每次只能删除一个数据库。
show databases;//查看所有数据库
show create databases;//查看数据库属性
use mysql01;//使用数据库
alter database mysql01 character set gbk;
//将指定的utf8的数据库修改为gbk的数据库
alter database student character set gb2312 default collate gb2312_chinese_ci;
//将student数据库的默认字符集修改为gb2312,排序规则修改为gb2312_chinese_ci
drop database mysql01;//删除数据库
Mysql常用数据类型
1.数值类型
int(4个字节) float(单精度 4个字节) double(双精度 8个字节) decimal(M,D)(大小不确定)
decimal(M,D)精度高 可以用于财务和货币 内存和分配不一样
int not null default 0不允许就空默认为0
create table student(id int(5),name varchar(10),age int not null default 20);
//创建一个学生表编号为整型5个字节,名字为 变长字符串类型10个字节,年龄不允许为空默认为20
2.字符串类型
char(定长字符串 0-255) Varchar( 变长字符串0-65535) text(0-2^16-1)
char和varchar的区别:
char:定长字符串在分配数据的存储空间是固定的
varchar:它会根据数据的实际长度动态的改变存储值的长度,所以不能确定字段需要多少字符
就可以使用varchar大大节省了磁盘空间。
3.日期和时间类型
date[日期 年月日] time[时间 时分秒] datetime[年月日 时分秒 YYYY-MM-DD HH:mm:ss]
timestamp[时间戳] year[年]
注意:没有在time类型加冒号,理解为持续的的时间,而不是一个时间段
系统在年份中,将00-69范围内的年份转化为2000-2069
把70-99范围内的年份值转化为1970-1999
4.复合类型
enum 枚举类型
表示:从一个集合选取一个值,犹似一个单选题
比如性别enum(“男”,“女”)
集合中每一个值都是字符串类型的,他们都是都好隔开
set可以预定义的集合中取得任意数量的值
set(“值1”,“值2”…)多项选择器 可以选择多个或者一个 ,set不可以包含两个相同的元素
表操作
1.创建表
create table shop(id int(10),goods_name varchar(10),price double(10));创建表
2.查看表
show tables;
3.查看表结构
desc 表名;
4.查看建表语句
show create table;
5.快速创建一个表结构相同的表
create table 新表名 like 旧表名;
6.删除表
drop table 表名;
7.删除表,如果表结构存在的话
drop table if exits 表名;
修改表结构
8.添加字段
alter table 表名 add [column] 字段名 类型;
9.删除字段
alter table 表名 drop 字段名;
10.修改字段名
alter table 表名 change 旧字段名 新字段名 类型;
11、修改字段类型
alter table 表名 modify 字段 新字段类型;
12.修改表名
rename table 表名 to 新表名;
13.修改表的字符集
alter table 表名 character set 字符集;
增删改查
insert(添加数据)
插入全部数据
insert into 表名 values (值1,值2);
值的顺序一定要与字段对应
insert into user values('张三','30','133324','男');
插入部分数据
insert into 表名 (字段名1,字段名2,字段名3,...)values(值1,值2,值3,...);
insert into user(name,age,modile) values('小艾',20,'243252');
insert into 表名(字段名1,字段名2,字段名3,...)values(值1,值2,值3,...),(值1,值2,值3,...)...;
复制表
目标表必须存在,并且表结构要与源表一致。
insert into 目标表名 select*from 源表名;
update(修改数据)
更新表记录
update 表名 set 字段名1 = 值1, 字段名2 = 值2,......
更新全部记录
update user1 set gender = '男';
更新时加入运算
update user1 set age = age+1;
部分更新:
update 表名 set 字段名1 = 值1,字段名2 = 值2,...where 字段条件
update user1 set sex='女' where name = '张三';
delete(删除数据)
删除记录
delete from 表名; 删除全部记录
delete from 表名 where 字段条件; 按条件删除
delete from user1 where name = '张三';
delete from user1 where age<20;
delte from user1 where age<23 and name = '小天';
delete from user1; 删除表内全部数据
删除全部记录
truncate 表名;
truncate user1;
delete与truncate的区别
delete是将表中的数据逐行清除。如果表里的数据过多速度会很慢,但是它支持按条件删除
truncate是直接将表中的数据物理删除,删除速度快和表里有多少数据无关,它不支持条件删除
查看mysql的字符集设置
show varables like '%character%';
设置字符集编码集编码:
set character_set_client = 字符集名称
set character_set_connection = 字符集名称
set character_set_ results = 字符集名称
set character_set_client = gbk;
set character_set_connection = gbk;
set character_set_results = gbk;
select(查找数据)
查询语句
select 关键字用来查询取出表中的数据
简单查询:
select *from 表名;取出表中的所有数据
查询指定列:
select 字段名1,字段名2,.... from 表名
查询指定列带别名:
select 字段名1 as 别名 ,字段名2 as 别名,.....
消除重复值:
distinct关键字用来去除重复值 只能写道select后面,一个select只能有一个distinct
distinct 会根据查询字段的数据做组合操作,如果合并后的数据和前面的数据没有冲突,那就显示。
如果有冲突。那就不显示。
distinct并没有去掉表中的重复数据。只是去掉了结果集中的重复数据。
如果去除表中的重复数据,步骤如下、
1.先创建一个和原表结构相同的表
2.用insert into 目标表 select distinct from 原表
3.删除原表或为安全起见将原表改名
4.将目标表的名字改为源表名
这样就完成了一个对表的去重
查询结果参与运算:
CREATE TABLE student (
id int,
name varchar(20),
age int,
sex varchar(5),
address varchar(100),
math int,
english int
);
INSERT INTO student (id, NAME, age, sex, address , math, english)
VALUES (1, '马云', 55, '男', '杭州' , 66, 78),
(2, '马化腾', 45, '女', '深圳' , 98, 87),
(3, '马景涛', 55, '男', '香港' , 56, 77),
(4, '柳岩', 20, '女', '湖南' , 76, 65),
(5, '柳青', 20, '男', '湖南' , 86, NULL),
(6, '刘德华', 57, '男', '香港' , 99, 99),
(7, '马德', 22, '女', '香港' , 99, 99),
(8, '德玛西亚', 18, '男', '南京' , 56, 65);
用到的表
select name,english+10 from student;
注意,这里面的null值是不参与 运算的,但也不会报错,会被忽略
select name,ifnull(esnglish ,0) as 英语 from student;
where 关键字 按条件查询
相关运算符: < 小于 = 等于 >大于 >=大于等于 <=小于等于 != 或 <>不等于
英语不等于77
select * from student where english !=77;
math和英语都大于60的
select *from student where math>60 and ehglish>60;
数学大于60 或者英语大于 80
select * from student where math>60 or english>80;
逻辑运算符: and (&&)与 并且 or(||)或 not(!)非
select * from student where math not in(66,76);
范围关键字 between and
between 值1 and 值2 取出来的结果集范围包含 值1 和 值2
select * from student where math between 56 and 66;
等同于
select *from student where math >= 56 and math <=66;
模糊查询关键字:
%通配符 代表任意长度的任意字符
like like ‘马%’
select * from student where name like '马%';
select * from student where name like '%德';
select * from student where name like '%德%';
_通配符 代表一个字符长度的任意字符 用法与%一样,只不过只代表一个字符
select * from student where name like ‘马_’;
select * from student where name like ‘马__’;
select * from student where name like ‘_岩’;
排序关键字
order by [asc] [desc] asc 按升排序 desc 降序排序
单列排序
select * from student order by math; asc默认可以不写
select * from student order by math desc; desc 必须写上
组合排序
order by 字段1 [asc|desc], 字段2 [asc|desc]
select * from student order by math desc, english desc;
聚合函数:
count 统计数量
count(*) 统计共有多少行
count(字段名)
select count(*) as 行数 from student;
min(字段名) 函数:
求字段的最小值。
select min(math) from student;
max(字段名) 函数
求字段的最大值。
select max(math) from student;
avg 求某列的平均值
select avg(ifnull(english,0)) as 平均分 from student;
--因为NULL不计入计算,所必须给null一个0值
select avg(math) from student; --没有空的列可以直接进行计算。
sum(字段名) 求合
select sum(english) from student;
select sum(ifnull(english,0)) from student;
分组关键字
group by 将数据进行 分组
select sum(sex) from student group by sex;
按性别进行分组计算。
执行顺序是先进行分组,然后再按组对字段进行计算
按条件进行筛选
having关键字
select math,count(*) from student group by math having count(*)>1;
执行顺序:
where 在group by 之前执行
having 在group by 之后执行
先分组,在count()统计,再按条件显示
分页
分页关键字limit
limit 一个数字 ,限制条数
limit 数字1,数字2, 数字1加上1是开始的行位置,数字2要取的记录条数
注意查询时候列的起始值为0,不是为1
select *from student limit 0,2;
主键
表中值不重复的字段,可以作为记录的唯一标识
create table user2(id int primary key,name varchar(10));
自增 auto_increment
create table user3(id int primary key auto_increment,name varchar(10));
给没有主键的表添加主键
alter table user add id int primary key auto_increment;
约束
唯一
关键字 unique
create table user5 (
id int primary key auto_increment,
name varchar(10),
mobile varchar(11) unique --此字段值唯一
)
非空
关键字 not null
create table user5 (
id int primary key auto_increment,
name varchar(10),
mobile varchar(11) unique, --此字段值唯一
sex varchar(2) not null
)
默认值
关键字 default
create table user5 (
id int primary key auto_increment,
name varchar(10),
mobile varchar(11) unique, --此字段值唯一
sex varchar(2) not null,
age int default 18
)
嵌套查询
select 语句可以把语句查询出来的结果集当成表来再次查询
select name from (select * from user_db where sex = ‘女’)as nigu;
union 关键字
将两个结果集上下拼接起来。要求两个结果集的表结构一致
select *from student where sex ='女'
union
select * from student where name = '马化腾';
表之间的关系
一对多:
用户表: 购物记录表:
id name id userid spname
100 张三 1 100 小米手机
101 李四 2 100 苹果手机
3 101 巧克力
4 100 华为手机
多对多:
双向一对多,就是多对多。
用户表: 中间表 购物记录表:
id name id userid gwid id userid spname
100 张三 1 100 1 1 100 小米手机
101 李四 2 101 3 2 100 苹果手机
3 100 4 3 101 巧克力
4 100 2 4 100 华为手机
一对一:
一张表里的一条记录,对应另一张表里的一条记录
用户表: 用户头像表:
id name id userid Picture
100 张三 1 100 1.png
200 李四 2 200 2.png
外键
一个表的某个字段,是另一张表的主键
外键约束
外键表在入更新数据时,会从主检查表是否存在,如果不存在,则插入更新失败。
如何创建外键:
constraint: 约束
froeign : 外键
references: 引用
constraint: 外键名称 foreign key 当前表的外键字段 references 主键表主键字段
创建主表: 数据复制自 testdb.student表
create table user6 (
id int primary key auto_increment,---主键
name varchar(10)
);
从表:
create table sp (
id int primary key auto_increment,---主键
spname varchar(30),
userid int,
constraint spuserid foreign key (userid) references user6(id)
);
将某键改为主键:
alter table user add primary key(id)
将某键改为主键并自增:
alter table user change id id int not null auto_increment;
外键约束:
从表里如果插入的数据不包含在主表的主键里,那就插入失败
如果从表数据已经包含了主表的信息,那主表删除对应主键的记录时会失败
如果要删除主表的数据,必须先将从表里的关联的数据全部删除之后才能删除
删除外键方法
alter to table 表名 drop forrign key 外键名
alter to table sp drop foreign key spuserid
删除外键就是删除两个之间的关系
多表查询
笛卡尔积:
进行多表查询时,数据库会将两张表的数据进行组合。笛卡尔积会生成无意义的数据。
如果要必免生成笛卡尔积,那就要在确认关联字段,使用条件过滤。
内连接:
内连接,查询两张表的交集数据
1.隐式内连接
select a.name,b.spname from user6 as a,sp as b where a.id=b.userid;
2.显示内连接
select * from sp as a inner join user6 as b on a.userid=b.id;
外连接
1.左外连接
select 字段名1,字段名2,... from 表1 left [outer] join 表2 on 条件
2.右外连接
select 字段名1,字段名2,... from 表1 right [outer] join 表2 on 条件
grant 赋权语句
revoke 收回用户权限语句
备份还原
mysqldump 备份数据库
登录之前在命令提示抽口执行
mysqldump -u root -p 数据库名 > 备份出的文件要保存的位置
source 还原是数据库
登录数据库后执行
source D:/testdb.sql
范式
1.什么是范式
范式就是数据库建表的规范
常用的范式有一范式,二范式,三范式
一范式
每个字段储存的数据都是不可再分的原子数据
二范式
一张表只能描述一件事,如果不满足就需要进行拆分
所有的字段都必须依赖于主键,也就是说,每行都有一个唯一标识
三范式
从表的外键必须使用主表的主键
视图
1.什么是视图
视图是一句select查询语句。是一张虚拟表
2.如何创建视图
语法:
create [ or replace][algorithm] = {undefinde| merge | temptable}
view 视图名称 [列名1,列名2,列名3......]
as select 语句[with check option]
整个表作为视图
部分表作为视图
指定视图的列名
3.对视图进行操作时的注意事项
视图可以当作表来用,支持用户对视图中的数据进行查询操作,DML操作
不是所有的视图都可以进行dml操作
例如创建视图的语句包含有下列关键字,那就无法将其当作表来进行更新操作
- 聚合函数
- DISTINCT关键字
- group by 关键字
- having 关键字
- union关键字
- from 子句中包含多个表
- select 子句中引用了不可更新的视图
- where 子句中的子查询 引用from子句中的表
- algorithm 选项指定为temptable
- 位于选择列表中的子查询
4.删除视图
drop view 视图名称;
表与视图的区别
-
视图已编译好的sql语句,而表不是
2.视图没有实际的物理记录,而表有
3.表是内容,视图是窗口
4.表占用物理空间,而视图不占用,它只是逻辑存在
5.表可以及时修改,而视图只能由创建语句来进行修改
6.视图是查看 数据表的方法 从安全角度来看,视图可以只给用户看到表的部分字段,
从而不知道表的结构
7.表是全局中的表,是实表,视图局部模式,是虚表
8.视图的创建和删除只影响视图本身,而不会影响到基本表
视图的优缺点
优点:
1.使用视图可以定制用户数据,聚焦特定数据
2.使用视图可以简化数据库的操作
3.使用视图对基表有一定的安全性
4.使用视图可以合并分离数据,也可以创建分区视图
缺点:
1.视图有修改限制
2.视图的性能差
索引
1.什么是索引及索引的作用
索引相当于字典中的目录,使用索引可以提高数据查询的速度
索引本质是一张地址表,它里面报讯了主键与索引字段的地址
经常变动的列不适合建立索引
数据分布均匀的列不适合建立索引
记录太少的表不适合建立索引
2.创建普通索引
create index 索引名字 on 表名(列名)
3.创建唯一索引
create unique index 索引名字 on 表名(列名);
4.创建复合索引
index 索引名字 on 表名 (列名,列名2);
5.使用alter语句也可以给表添加或删除索引
6.删除索引
drop index [索引名] on 表名
7.显示表中有那些索引
show index from 表名\G
索引基础使用
普通索引 查询条件里加上建立索引的列
select *from student where name = '马云'
复合索引 查询条件里的字段顺序要和创建索引时的顺序一致
select * from student where name =’马云‘ and math = 80;
如果选择要显示的字段,那顺序也要一致
select name , math from student where name = '马云' and math = 80;
复合索引创建时排一位的字段叫先导列,先导列的顺序要排前面
查询时如果条件上面有建立索引,那就会自动走索引
系统函数
字符串函数
-
字符串函数
合并字符串函数 concat(s1,s2,…)
返回字符串长度 char_length(str);
返回字节长度 length(str);
将小写字母转为大写字母 ucase(str) 或 upper(str)
将大写字母转为小写 lcase(str) 或 lower(str)
去空格 trim(str) ltrim() rtrim()
字符替换 replace(s,s1,s2); s要操作的字符串,s1要替换的字符串,s2要替换成的字符串
字符串截取 substr(s,strat,length); s要操作的字符串,start开始位置,length长度
字符串比较 strcmp(str1,str2); str1大返回1 str1小返回-1
-
日期时间函数
now() 或curdate() curtime()
now()返回日期和时间
curdate()返回年月日
curtime()返回时分秒
year(now()或字段名) month(now()或字段名) day(now()或字段名)
last_day(now()或字段名) 返回一个月中的最后一天
adddate(日期,天数) 返回当前日期+天数后的日期
subdate(日期,天数) 返回当前日期-天数后的日期
quarter(日期) 返回日期为一年中的第几个季度
datediff(日期1,日期2) 返回两个日期之间差的天数 (注意日期一定要用引号引起来)
date_format(日期,’%Y-%m-%d’) 按指定格式显示日期。
-
数字相关的函数
ABS(X) 求绝对值
ceil(x) 向上取整
floor(x)向下取整
mod(x,y) 取余数
RAND() 返回0到1之间的随机数。
Round(任意小数) 四舍五入
truncate(x,y) 返回数值x 保留到小数点后y位的值。
高级函数
select
case 字段
when 判断条件1
then 希望得到值1
when 判断条件
then 希望得到的值2
........
else
前面的条件都不满足时的值
end
from 表
select case name
when '马云' then '阿里巴巴'
when '马化腾' then '腾讯'
else ‘其它’
end
,math,english
from student;
trim(str) ltrim() rtrim()
字符替换 replace(s,s1,s2); s要操作的字符串,s1要替换的字符串,s2要替换成的字符串
字符串截取 substr(s,strat,length); s要操作的字符串,start开始位置,length长度
字符串比较 strcmp(str1,str2); str1大返回1 str1小返回-1
-
日期时间函数
now() 或curdate() curtime()
now()返回日期和时间
curdate()返回年月日
curtime()返回时分秒
year(now()或字段名) month(now()或字段名) day(now()或字段名)
last_day(now()或字段名) 返回一个月中的最后一天
adddate(日期,天数) 返回当前日期+天数后的日期
subdate(日期,天数) 返回当前日期-天数后的日期
quarter(日期) 返回日期为一年中的第几个季度
datediff(日期1,日期2) 返回两个日期之间差的天数 (注意日期一定要用引号引起来)
date_format(日期,’%Y-%m-%d’) 按指定格式显示日期。
-
数字相关的函数
ABS(X) 求绝对值
ceil(x) 向上取整
floor(x)向下取整
mod(x,y) 取余数
RAND() 返回0到1之间的随机数。
Round(任意小数) 四舍五入
truncate(x,y) 返回数值x 保留到小数点后y位的值。
高级函数
select
case 字段
when 判断条件1
then 希望得到值1
when 判断条件
then 希望得到的值2
........
else
前面的条件都不满足时的值
end
from 表
select case name
when '马云' then '阿里巴巴'
when '马化腾' then '腾讯'
else ‘其它’
end
,math,english
from student;