以下笔记摘自网易云课堂
DDL:数据定义语言 用来定义数据库对象:创建库,表,列等
DML:数据操作语言 用来操作数据库表中的记录
DQL:数据查询语言 用来查询数据
DCL:数据控制语言 用来定义访问权限和安全级别
一些常用数据类型表示
double(5,2) : 表示最多5位,其中必须有2位小数,即最大值为999.99;
char : 固定长度字符串类型;char(10)'abc '
varchar : 可变长度字符串类型;varchar(10)'abc'
text : 字符串类型;
blob : 二进制类型;
date : 日期类型,格式yyyy-MM-dd;
time:时间类型 格式:hh:mm:ss
datetime:日期时间类型yyyy-MM-dd hh:mm:ss
注意:字符串类型和日期类型都要用单引号括起来,‘Mysql’ '2018-01-01'
创建数据库:create database 数据库名 character set utf8;
修改数据库:
1、先进入某一个数据库
use my_test
2、输入建表的命令
create table student(id int,name varchar(25),age int,email varchar(255));
3、添加一列
alter table 表名 add 列名 数据类型;
4、查看表的字段信息
desc 表名;
5、修改一个表的字段类型
alter table 表名 modify 字段名数据类型;
6、删除一列
alter table 表名 drop 字段名;
7、查看创建表的细节
show create table 表名;
8、修改表的字符集为gbk
alter table 表名 character set 字符集名称;
9、修改表的列名
alter table 表名 change 原始列名 新列名 数据类型;
10、删除表
alter table 表名;
1、查询表中的所有数据
select * from 表名;
2、DML是对表中的数据进行增、删、改的操作
3、插入操作
增加一条记录:
mysql> insert into student (id,name,age,email,score) values
-> (2,'尼玛',18,'[email protected]',null);
增加多条记录:
mysql> insert into student(id,name,age,email,score) values
-> (2,"is",18,"abc",null),
-> (2,"is",18,"abc",null);
注意事项:
列名与列值的类型、个数、顺序要一一对应
值不要超出列定义的长度
插入的日期和字符一样,都是用引号括起来
4、更新操作
update 表名 set 列名1=列值1,列名2=列值2.。。。where列名=值
把wc的年龄在原来的基础上加1 update student set age=age+1 where name='wc';
修改数据库密码
5、删除操作
a、delete from 表名 [where 列名=值]
没有where的话就删除了所有数据
b、truncate table 表名;
c、delete与truncate的区别
delete删除表中的数据,表结构还在,删除后的数据可以找回
truncate删除是把表直接drop掉,然后再创建一个同样的新表。删除的数据不能找回,执行速度比delete快。
查询所有列 select * from 表名
结果名
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。
结果集
通过查询语句查询出来的数据以表的形式展示我们称这个表为虚拟结果集。
查询返回的结果集是一张虚拟表。
查询指定列的数据
select 列名1,列名2...from表名;
条件查询
条件查询就是在查询时给出where子句,在where子句中可以使用一些运算符及关键字;
条件查询运行符及关键字
=(等于)、!=(不等于)、<>(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于);
BETWEEN...AND;值在什么范围
IN(set);
IS NULL;(为空) IS NOT NULL(不为空)
AND:与
OR:或
NOT:非
使用
查询性别为男,并且年龄为20的学生记录
查询学号为1001 或者 名为zs的记录
查询学号为1001,1002,1003的记录
查询年龄为null的记录
select * from customer where age is null;
查询年龄在18到20之间的学生记录
select * from customer where age between 18 and 20;
select * from customer where age >= 18 and age<=20;
查询性别非男的学生记录
select * from customer where gender!='男';
查询姓名不为null的学生记录
select * from customer where name is not null;
模糊查询
根据指定的关键进行查询
使用like关键字后跟通配符
通配符
_: 任意一个字符
%:任意0-n个字符
使用
查询姓名由5个字母构成的学生记录
select * from stu where name like '_____';
查询姓名由5个字母构成,并且第5个字母为s的学生记录
select * from stu where name like '____s';
查询姓名以m开头的学生记录
select * from student where name like 'm%';
其中%匹配0-n个任何字母;
查询姓名中第2个字母为“u”的学生记录
select * from student where name like '_u%';
查询姓名中包含s字母的学生记录
select * from stu shere name like'%s%';
字段控制查询
去除重复记录
select distinct name from customer;
把查询字段的结果进行运算,必须都要是数据型
select *,字段1+字段2 from 表名;
列由很多记录的值为null,
因为任何东西与null相加结果还是null,所以运算结果可能会出现null;
下面使用了把null转换成数值0的函数ifnull;
select*,age+ifnull(score,0) from customer;
对查询结果起别名
在上面查询中出现列名为sx+ifnull(yw,0) 这很不美观,现在我们给这一列给出一个别名,为total;
select*,yw+ifnull(sx,0) as total from score;
省略as select *,yw+ifnull(sx,0) total from score;
任何字段都可以起别名 select name as resname from customer;
排序
创建表
create table 'customer'(
INSERT INTO `customer`(`name`, `id`, `want`, `age`, `gender`, `date`) VALUES ('wiowio', NULL, '23234', 19, 'm', NULL);
INSERT INTO `customer`(`name`, `id`, `want`, `age`, `gender`, `date`) VALUES ('gender', 4, 'water', NULL, 'f', NULL);
INSERT INTO `customer`(`name`, `id`, `want`, `age`, `gender`, `date`) VALUES ('adgns', 5, 'alljfs', 18, 'm', NULL);
INSERT INTO `customer`(`name`, `id`, `want`, `age`, `gender`, `date`) VALUES ('mary', 6, 'nothing', 19, 'm', NULL);
INSERT INTO `customer`(`name`, `id`, `want`, `age`, `gender`, `date`) VALUES ('样样', NULL, NULL, NULL, NULL, NULL);
)engine = innodb default charset = utf8;
对查询的结果进行排序
使用关键字order by
排序类型
升序ASC 从小到大 默认
降序DESC 从大到小
使用
聚合函数
对查询的结果进行统计计算
常用聚合函数
count():统计指定列不为null的记录行数;
max():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
min():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
sum():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
avg():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
使用
count
查询employee表中记录数;select count(*) as total_record from employee;
查询员工表中有绩效的人数;select count(performance) from employee;
查询员工表中月薪大于2500的人数;select count(*) from employee where salary>2500;
统计月薪与绩效之和大于5000元的人数;select count(*) from employee where ifnull(salary,0)+ifnull(performance,0)>5000;
查询有绩效的人数,和有管理费的人数;select count(performance),count(manage) from employee;
sum和avg
查询所有雇员月薪和:
查询所有雇员月薪和,以及所有雇员绩效和:
select sum(salary),sum(performance) from employee;
查询所有雇员月薪+绩效和:
select sum(salary+ifnull(performance,0)) from employee;
统计所有员工平均工资:
select avg(salary) from employee;
max和min
查询最高工资和最低工资:select max(salary),min(salary) from employee;
分组查询
什么是分组查询
将查询结果按照1个或多个字段进行分组,字段值相同的为一组
分组使用
select gender from employee group by gender
根据gender字段来分组,gender字段的全部值只有两个('男'和'女'),所以分为了两组
当group by单独使用时,只显示出每组的第一条记录
所以group by单独使用时的实际意义不大
分组注意事项
在使用分组时,select后面直接跟的字段一般都出现在group by后
group by+group_concat()
group_concat(字段名)可以作为一个输出字段来使用
表示分组之后,根据分组结果,使用group_concat()来放置每一组的某字段的值的集合
select department,group_concat(name) from customer group by department;
group by+聚合函数
通过group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个
使用
查询每个部门的部门名称和每个部门的工资和
select department,group_concat(salary),sum(salary) from employee group by department;
查询每个部门的部门名称以及每个部门的人数
select department group_concat(name) ,count(*)from employee group by department;
查询每个部门的名称以及工资大于1500的人数
select department,group_concat(salary),count(*) from employee where salary>1500 group by department;
group by+having
用来分组查询后指定一些条件来输出查询结果
having作用和where一样,但having只能用于group by
查询工资总和大于9000的部门名称以及工资和
查询每个部分的工资总和
select department,group_concat(salary) from employee group by department;
select department sum(salary) from employee group by department;
总和大于9000
select department,sum(salary) from employee group by department having sum(salary)>9000;
having与where的区别
having是在分组后对数据进行过滤;
where是在分组前对数据进行过滤;
having后面可以使用分组函数(统计函数);
where后面不可以使用富足函数;
where是对分组前计录的条件,如果某行记录没有满足where子句的条件,那么这行记录不会参加分组;而having是对分组后数据的约束;
查询工资大于2000的,工资总和大于6000的部门名称以及工资和
select department,group_concat(salary),sum(salary) from employee where salary>2000 group by department having sum(salary)>6000 ;
查询工资大于2000的
select * from employee where salary>2000;
各部门工资总和大于6000
select department,sum(salary) from employee where salary>2000 group by department having sum(salary)>6000;
各部门工资总和大于6000降序排列
select department,sum(salary) from employee where salary<2000 group by department having sum(salary)>6000 order by sum(salary) desc;
书写顺序
select->from->where->group by->having->order by->limit
执行顺序
from->where->group by->having->select->order by->limit
LIMIT
从哪一行开始,总共要查几行
limit参数1,参数2
参数1:从哪一行开始查
参数2:一共要查几行
角标是从0开始
格式:select * from 表名 limit 0,5;
分页思路
int curPage=1; -- 当前页
int pageSize=3; -- 每页多少条数据
-- 当前页为1 第一页从0开始 (1-1)*3=0
-- 当前页为2 第二页从3开始 (2-1)*3=3
-- 当前页为3 第三页从6开始 (3-1)*3=6
-- 当前页为4 第四页从9开始 (4-1)*3=9
select * from employee limit (curPage-1)*pageSize,pageSize;
数据完整性
什么是数据的完整性:保证用户输入的数据保存到数据库中是正确的。
如何添加数据完整性:在创建表是给表中添加约束
完整性分类:实体完整性、域完整性、引用完整性
实体完整性:
什么是实体完整性:表中一行(一条记录)代表一个实体(entity)
实体完整性的作用:标识每一行数据不重复,行级约束
约束类型:主键约束、唯一约束、自动增长列
主键约束:
特点:每个表中要有一个主键;数据唯一,且不能为null;
添加方式:
create table 表名(字段名1 数据类型 primary key,字段2 数据类型)
create table 表名(字段1 数据类型,字段2 数据类型,primary key(要设置主键的字段));
create table 表名(字段1 数据类型,字段2 数据类型,primary key(主键1,主键2));
联合主键 两个字段数据同时相同时,才违反联合主键约束。
1、先创建表
2、再去修改表,添加主键
alter table student add constraint primary key(id);
唯一约束:
特点:指定列的数据不能重复,可以为空值。
格式:create table 表名(字段名1 数据类型,字段2 数据类型 unique);
自动增长列:
特点:指定列的数据自动增长;即使数据删除,还是从删除的序号继续往下
格式:create table 表名(字段名1 数据类型 primary key auto_increment,字段2 数据类型 unique)
域完整性
使用
限制此单元格的数据正确,不对照此列的其它单元格比较
域代表当前单元格
域完整性约束
数据类型:数值类型、日期类型、字符串类型
非空约束:create table 表名(字段名1 数据类型 primary key_auto_increment,字段2 数据类型 unique not null);
默认值约束 create table 表名(gender char(1) default '男');
参照完整性
什么是参照完整性
是指表与表之间的一种对应关系
通常情况下可以通过设置两表之间的主键、外键关系,或者编写两表的触发器来实现。
有对应参照完整性的两张表格,在对他们进行数据插入、更新、删除的过程中,
系统都会将被修改表格与另一张对应表格进行对照,从而阻止一些不正确的数据的操作。
数据库的主键和外键类型一定要一致;
两个表必须得要是innodb类型
设置参照完整性后,外键当中的内值,必须得是主键当中的内容
一个表设置当中的字段设置为主键,设置主键为主表
创建表时,设置外键,设置外键的为子表
create table score (sid int,score int,constraint sc_st_fk foreigh key(sid) references stu(id));
alter table score add constraint sc_st_fk foreigh key(sid) references stu(id);
表之间的关系
一对一 一夫一妻
一对多关系
一个人可以有多辆汽车,要求查询某个人拥有的所有汽车;
创建Person表;
create table person( id int primary key not null,name varchar(50),age int,sex char(1) );
创建Car表;
create table car( cid int primary key,cname varchar(50),color varchar(25),pid int,
constraint fk_Person foreign key(pid) references person(id) )
多对多关系
学生选课,一个学生那个可以选修多门课程,每门课程可供多个学生选择。
一个学生可以有多个老师,而一个老师也可以有多个学生
1、创建老师表
create table teacher(
tid int primary key auto_increment,
name varchar(50),
age int,
gender char(1) default '男'
) ;
2、创建学生表
create table student (
sid int primary key auto_increment,
name varchar(50) not null,
age int,
gender char(1) default '男'
);
3、创建学生与老师关系表
create table tea_stu_rel(
tid int,
sid int
);
4、添加外键
alter table tea_stu_rel add constraint fk_tid foreign key(tid) references teacher(tid);
alter table tea_stu_rel add constraint fk_sid foreign key(sid) references student(sid);
为什么要拆分表,避免大量冗余数据的出现
多表查询
合并结果集
什么是合并结果集:合并结果就是把两个select语句的查询结果合并到一起
合并结果集的两种方式:
union、union all
union 合并时去除重复记录
union all 合并时不去除重复记录
格式
select * from 表1 union select * from 表2;
select * from 表1 union all select * from 表2;
示例
创建表
create table A(name varchar(10),score int);
create table B(name varchar(10),score int);
...
insert into A values('a',10),('b',20),('c',30);
insert into B values('a',10),('b',20),('d',40);
union
select * from A union select * from B;
union all
select * from A union all select * from B;
注意事项
被合并的两个结果:列数、列类型必须相同。
连接查询
什么是连接查询
也可以叫跨表查询,需要关联多个表进行查询
什么是笛卡儿集
同时查询两个表,出现的就是笛卡儿积结果
查询时给表起别名
select * from stu ST,score SC;
多表联查,如何保证数据正确
在查询时要把主键和外键保持一致
select * from stu st,score sc where st.id=sc.sid;
主表当中的数据参照子表当中的数据
原理
根据连接方式分类 内链接、外连接、自然连接
内连接
等值连接
两个表同时出现的id号(值)才显示;
select * from stu st INNER JOIN score sc ON st.id=sc.sid;
与多表联查约束主外键是一样,只是写法改变了。
ON后面只写主外键
如果还有条件直接在后面写where
select * from stu st INNER JOIN score sc ON st.id=sc.sid where sc.score>60;
多表联查后面还有条件就直接写and
select st.id,st.'name',st.gender,sc.score from stu st
JOIN score sc
ON st.id=sc.sid
where sc.score>60
AND st.gender='男';
多表连接
建立学生,分数,科目表
使用99连接法
使用内联查询
非等值连接
前提:有三个表,叫employee,dept,salgrade,employee表和dept表里面都有deptno这个字段;
隐式连接
select e.ename,e.salary,d.dname,g.grade from emp e,dept d,salgrade g
where e.deptno = d.deptno
AND e.salary>=g.lowSalary and e.salary<=g.highSalary;
select e.ename,e.salary,d.dname,g.grade from emp e,dept d,salgrade g
where e.deptno = d.deptno
AND e.salary BETWEEN g.lowSalary AND g.highSalary;
显示连接
select * from emp e
JOIN dept d ON e.deptno = d.deptno
JOIN salgrade g ON e.salary BETWEEN g.lowSalary AND g.highSalary;
自连接
外连接
左外连接(左连接)
两表满足条件的相同的数据查出来,如果左边表当中有不相同的数据,也把左边表当中的数据查出来。
使用内连接时,没有成绩的人查不出来,没有成绩,缺考了。把所有考过试的学生分数查出来。
使用左连接查询所有学生及学生的考试分数。
select * from stu st LEFT OUTER join score sc on st.sid=sc.sid;
右外连接(右连接)
右外连接
参照左外连接
多表连接
建立学生,分数,科目表
使用99连接法
select st.name,c.name,sc.score from stu st,score sc,course c
where st.id=sc.sid
and sc.cid=c.cid;
使用内联查询
select st.name,c.name,sc.score from stu st
INNER JOIN score sc ON st.id=sc.sid
INNER JOIN course c ON sc.cid=c.cid;
自然连接
子查询
自连接