数据库基础知识
创建和查看数据库
create database 数据库名称; #创建数据库
show databases; #查看数据库
drop database 数据库名称; #删除数据库
数据类型
常用数据类型 int,char,varchar,等等
创建数据表
创建数据表 use 数据库名称; #选择创建表的数据库 create table 表名(id int(11),name varchar(11)); #创建表和字段名称 desc 表名; #查看数据表
alter table 旧表名 rename to 新表名; #修改表名
alter table 表名 change 旧字段名 新字段名 新数据类型; #修改字段名
alter table 表名 modify 字段名 数据类型; #修改字段名的数据类型
alter table 表名 add 新字段名 数据类型; #添加字段
alter table 表名 drop 字段名; #删除字段
alter table 表名 modify 字段名 数据类型 first; #修改字段的排列位置(排在第一个位置)
alter table 表名 modify 字段名1 数据类型 after 字段名2; #字段名1 放在字段名2 后面
drop table 表名; #删除数据表
表的约束(列举的约束条件都是针对表中字段进行限制,从而保证数据表中的正确性和唯一性)
primary key 主键约束,用于唯一标识对应的记录
foreign key 外键约束
not null 非空约束
unique 唯一性约束
default 默认值约束
主键约束
create table table2(id int(11) primary key, #单字段主键
name varchar(11) not null,
grade float);
create table table2(id int(11),
name varchar(11),
grade float,
primary key(id,name)); #多字段主键
非空约束
create table table2(id int(11),
name varchar(11) not null, #非空约束
grade float);
唯一性约束
create table table2(id int(11),
stu_id int unique, #唯一性约束
grade float);
默认约束
create table table2(id int(11),
name varchar(11),
grade float default 0, #默认约束
stu_id int);
索引(普通索引-唯一性索引-全文索引-单列索引-多列索引-空间索引)
- unique 可选参数,表示唯一索引
- fulltext 可选参数,表示全文索引
- spatial 可选参数,表示空间索引
- index和key,用来表示字段的索引,二者选一即可
- 别名 可选参数 表示创建的索引的名称
- 字段名1 指定索引对应字段的名称
- 长度 可选参数 用于表示索引的长度
- ASC和DESC 可选参数 其中 ASC表示升序排列 DESC表示降序排列
创建普通索引
create table t1(id int,
name varchar(11),
score float,
index(id)); #在id上建立索引
show create table 表名 G; #查看表的结构
explain select * from 表名 where id=1 G; #查看索引是否被使用,当possible_keys和key的值都为id,说明索引已经存在
唯一性索引
create table t2(id int not null,
name varchar(20) not null,
score float,
unique index unique_id(id asc)); #在id的字段上建立索引名为unique_id的唯一性索引,并且按照升序排列
全文索引
create table t3(id int not null,
name varchar(20) not null,
score float,
fulltext index fulltext_id(name) #在name字段上建立索引名为full_text的全文索引
)engine=myisam; #目前只有myisam存储引擎之v胡全文索引
单列索引
create table t4(id int not null,
name varchar(20) not null,
score float,
index single_name(name(20))) #建立一个名为signal_name的单列索引,并且索引的长度为20
多列索引
create table t5(id int not null,
name varchar(20) not null,
score float,
index muli(id,name)); #在id和name上建立一个muli的多列索引
使用create index 语句在已经存在的表上创建索引
create index index_id on t1(id); #创建普通索引
create unique index unique_id on t1(id); #创建唯一性索引
create index multidex on t1(id,name); #创建多列索引
alter table t1 add index index_id(id); #创建普通索引
使用alter table 语句在已经存在的表上创建索引
alter table t1 add unique uniqueidx(id); #创建唯一性索引
alter table t1 add index multidx(id,name)#创建多列索引
使用alter table 删除索引
alter table 表名 drop index 索引名;
使用drop index 删除索引
drop index 索引名 on 表名;
数据库的增 删 改 查
#select * from 表名; 查看表中数据
添加数据
建表
create table student(id int(4) primary key auto_increment, #id会自增
name varchar(20) not null,
grade float);
insert into student(id,name,grade)values(1,'zhangsan',98.5);
insert into student(name,grade,id)values('zhangsan',98.5,2); #注意:字段名和值对应
insert into student(id,name)values(1,'zhangsan'); #为表的指定字段添加数据
insert语句中不指定字段名
insert into 表名 values(值1,值2,。。。) #添加值的顺序必须按照表中定义的字段顺序
insert into student values(1,'zhangsan',98.5);
insert语句的其他用法
insert into 表名 set 字段名1=值1, [字段名2=值2,...]
insert into student set id=5,name='boya',grade=99; #添加一条记录
insert into student values
(6,'a',99),
(7,'b',99),
(8,'c',99); #同时添加多条记录,按表中定义的字段顺序
insert into student(name,id,grade) values #同时添加多条数据,对应字段名和值
('a',6,99),
('b',7,99),
('c',8,99);
更新数据
update更新部分数据:
update student set name='asd',grade=89 where id=5; #更新id=5的数据
update stedent set grade=100 where id<10; #更新id<10的数据
update更新全部数据
update student set grade=100; #更新grade全部为100
删除数据
delete from 表名 [where 条件表达式]
delete 删除部分数据
delete from student where id=1; #删除id=1的数据
delete from student where id>6; #删除id>6的数据
delete 删除全部数据
delete from student #删除全部数据
使用关键字truncate删除表中数据 #使用delete删除数据会留下记录,体现在删除数据之后的id会继续增加不会从1开始,truncate不会留下记录,从0开始,所以效率更高
truncate student; #删除全部数据
查询数据
简单查询
在select语句中指定所有字段
select 字段名1,字段名2,。。。from 表名
select id name,grade,gender from student;
在select语句中使用*通配符代替所有字段
select * from 表名;
查询指定字段
select 字段名1,字段名2,。。。from 表名
select id,name from student;
按条件查询
select id,name from t where id=4; #查询t表中 id=4 的数据
select id,name,grade from t where grade>60; #查询表中 grade>60 的数据
带in的关键字查询
select id,name,grade,gender from t where id in(7,8,9); #查询id,name,grade,gender等数据 在id为7,8,9
select id,name,grade,gender from t where id not in(7,8,9); #查询id,name,grade,gender等数据 除了id为7,8,9
带between and 关键字的查询
select id,name,grade,gender from t where id between 5 and 9; #查询id,name,grade,gender等数据 在id为5-9之间
select id,name,grade,gender from t where id not between 5 and 9; #查询id,name,grade,gender等数据 除了id为5-9之间
空值查询
select id,name,grade,gender from t where grade is null; #查询id,name,grade,gender等数据 在grade为null值
带distinct 关键字的查询
select distinct 字段名 from 表名;
select distinct gender from t; #过滤掉重复的gender值
distinct 关键字作用于多个字段
select distinct gender,name from t; #过滤掉gender和name联合起来重复的值
带like关键字的查询
%通配符
select id,name from t where name like"a%"; #查询字段中以字符a开头的 id和name的值
select id,name from t where name like"d%h"; #查询字段中字符d开头,h结尾的 id和name的值
select id,name from t where name like"%h%"; #查询字段中含有h的 id和name的值
select id,name from t where name not like"%h%"; #查询字段中不含有h的 id和name的值
_通配符(一个下划线只能匹配一个字符)
select id,name from t where name like"__gs"; #查询字段中四个字节,后两位为gs的 id和name的值
select id,name from t where name like"_ _gs"; #查询字段中带有一个空格 ,后两位为gs的 id和name的值
匹配字符串总的%和_怎么办?
例子
%\%% 匹配字符串中带有%的
%\_% 匹配字符串中带有_的
带and关键字的条件查询
select id,name,gender from t where id<9 and gender='女'; #匹配id<9 且 gender=女
select id,name,gender from t where id in(1,2,3,4) and name like '%ng' and grade<80; #匹配id为1,2,3,4 且 name的最后两个字符是ng 且 grade<80
带or的关键字的多条件查询
select id,name,gender from t where id<9 or gender='女'; #匹配id<9 或 gender=女
or 和 and 一起用的情况
select id,name,gender from t where gender='女' or gender='男’ and grade=100; #匹配gender=女 或者 gender=男的且grade=100
高级查询
count函数
select count(*) from 表名;
select count(*) from t; #查询表中有多少条数据
sum函数
select sum(字段名) from 表名;
select sum(grade) from t; #计算grade字段的总和
avg函数
select avg(字段名) from 表名;
select avg(grade) from t; #计算grade字段的平均值
max和min函数
select max或者min(字段名) from 表名;
select max或者min(grade) from t; #查询grade字段最大值或者最小值
对查询结果排序
select * from t order by grade; #对t表中的grade进行排序,默认升序排列
select * from t order by grade asc; #对t表中的grade进行排序,升序排列 从小到大
select * from t order by grade desc; #对t表中的grade进行排序,降序排列 从大到小
分组查询
单独使用group by
select * from t group by gender; #查询对gender字段中不同的值进行分类,然后显示每个类的其中一组数据
group by 和 聚合函数一起使用
select count(*),gender from t group by gender; #对分类过后的数据统计并返回gender的几种情况
group by 和 having 关键字一起使用 #having 和 where关键的作用相同,区别在于 having关键字之后可以跟聚合函数,where关键字不能
select sum(grade),gender from t group by gender having sum(grade)<300; #对于分组后的结果进行过滤 查询gender分组过后grade字段值之和小于300的
使用limit限制查询结果
select * from t limit 4; #查询前四条记录
select * from t order by grade desc limit 4,4; #最后跟了两个参数,第一个表示偏移量为4,即从第五条记录开始查询,第二表示返回几条记录 desc 表示 grade字段从高到低排列
函数
select concat(id,'_',name,'_',grade,'_',gender)from t; #查询t表中的记录,将个字段的值用下划线连接起来
select id,if (gender='男',1,0) from t; #查询t表中id和gender的字段值,如果gender的字段值是男,返回1,否则返回0
为表和字段取别名
select * from 表名 [as] 别名;
select * from t as s where s.gender='女'; #为t表取别名为s s.gender表示t表中gender的字段值
为字段取别名
select 字段名 [as] 别名[,字段名 [as] 别名,... ] from 表名;
select name as n,gender g from t; #将name字段和gender字段取别名分别为n和g 查询结果也会显示n和g
多表操作
外键
创建两种数据表
create table grade(id int(4) not null primary key,
name varchar(36));
create table student(sid int(4) not null primary key,
sname varchar(36),
gid int(4) not null);
为表添加外键约束
alter table student add constraint fk_id foreign key(gid) references grade(id); #为student表添加外键约束 grade的id为主键 student的gid为外键
删除外键约束
alter table 表名 frop foreign key 外键名;
alter table student drop foreign key fk_id; #删除student表中的外键约束
操作关联表
添加数据
insert into grade(id,name)values(1,'软件一班');
insert into grade(id,name)values(2,'软件二班');
insert into student(sid,sname,gid)values(1,'王红',1);
insert into student(sid,sname,gid)values(2,'李强',1);
insert into student(sid,sname,gid)values(3,'赵四',2);
insert into student(sid,sname,gid)values(4,'李五',2);
select sname from student where gid=1; #查询gid为1的学生姓名 student和grade表之间有联系 gid的1表示的是软件一班
删除数据 注意:一定要先删除从表中的数据,然后删除主表中的数据 不然会报错
连接查询
交叉连接 select * from 表1 cross join 表2; #表一和表二分别有4条数据 交叉查询后有16条数据 4*4=16
内连接 select 查询字段 from 表1 [inner] join 表2 on 表1.关系字段=表2.关系字段; #关系字段相等的才会显示
外连接(左连接,右连接)
复合条件连接查询:
子查询:
带in关键字的查询:
带exists关键字的查询:
带any关键字的子查询:
带all关键字的子查询:
带比较运算符的子查询:
事物存储与过程
事物管理
存储过程的创建
存储过程的使用
视图
视图概述
视图管理
数据库的高级操作
数据备份与还原
用户管理
权限管理