数据库分类:
关系型数据库和对象型数据库
Mysql(关系型),SqlServer,Oracle(关系+对象),Db2
主键(主关键字primary key):表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。
范式:目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
候选关键字:如果一个超关键字去掉其中任何一个字段后不再能唯一地确定记录,则称它为“候选关键字,也就是说候选关键字是最简单的超关键字。
数据库语言:
DDL:数据库模式定义语言(crud数据库,表)
DML:数据库操作语言(crud基本数据类型)
DCL : 数据库控制语言 (事物指令)
数据库的创建与删除:
数据库的创建:
create database 数据库名;
数据库的删除:
drop database 数据库名;
表的创建与删除:
表的创建:
create table 表名(
列名1 类型 primary key auto_increment,
列名2 类型 (char(20)) not null ,
…
);
表的删除:
drop table 表名;
数据库的增减改查(dcl)
(dos环境下的数据库操作)
进入bin文件 : cd mySql安装的bin文件地址
输入密码: mysql -u 用户名 -p 密码
以下需要加分号作为结束:
显示数据库 名: show databases;
进入test数据库: use test;
显示表格属性结构: desc user;
查询表 show tables;
查询用户数据: select * from user;
(查询数据库的全部)
select 列名1,列名2 from user;
(查询数据库的指定列)
select 列名1,列名2 from user where 列名3=值1 and 列名>40;
(查询数据库中列名为列名3值为值3的指定列)
select 列名1,列名2 from user where 列名3>=值1;
(查询数据库中列名为列名3值大于等于值3的指定列)
select 列名1,列名2+1 from user where 列名3>=值1;
(查询数据库中列名为列名3值大于等于值3的指定列1,列2加1)
select 列名1,列名2 from user where is null;
(查询数据库中有空值定列)
插入数据(列): insert into user(id,name,age) values(1,'lisi',23);
自增长 : alter table user modify id integer auto_increment;
(改变用户表修改整形id为自增长)
删除 (行) : delete from user where name= 'lisi';
修改: update user set age=22 where id=2;
退出: exit;
删除user表 drop table if exists user
退出命令行输入 Ctrl+C
建表:
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(255) default NULL,
`password` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;
查询数学运算:
select count(*) from 表名;
count(distinct 表名) 返回不同的个数
sum()其中可以写比较表达式,真则为1,假为0,可做计数器
max()
min()
avg()
分组:group by
select 列名1,sum(列名2) from 表明 group by 分组依据的列表名1;
select 列名1,列名1-列名2 as cz from 表名 where 列名1-列名2<200;
(where从后向前运行)
select 列名1,列名1-列名2 as cz from 表名 having cz<200;
(从前向后运行,having后需用as后的新名字)
having和group by组合时group by在having前(先分组在输出)
在无where和having时默认从前向后运行
排序:order by(升序(默认),降序,种类排序)
select 列名1,列名1-列名2 as cz from 表名 order by 列表名1,列表名2 desc;(从前向后运行,先按列名1排序,在按列名2排序)
select * from goods where 1 order by cat_id asc,goods_id desc;(asc升序)
select * from goods order by cat_id desc,shop_price desc;
limit 起始位置,偏移量(分页)
select 列名1,列名1-列名2 as cz from 表名 order by 列表名 desc limit 0,3;(limit 3默认为limit 0,3)
where 1与where 0
where 1为默认,全部输出、
where 0为全部不输出
***优先级:***where,group by,having,order by,limit(优先级低的有,优先级高的可以没有)
select name,sum((score<60)*score)/sum(score<60),sum(score<60) as avg from result group by name having avg>=2;
limit 只能限制显示器输出不能限制数据库查询,所以,sum,count,avg求的是整体
COUNT(*) 返回表的所有纪录数,而COUNT(expression)则返回符合表达式计算结果的非空纪录数。通常情况 下,COUNT(DISTINCT expression)将相同的纪录只计算为一个。可以看到,根据不同的COUNT()描述,可以得到不同的查询结 果。
模糊查询 like ‘%积分%’ not like ‘%积分%’
_: 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句
mysql> show variables like ‘%char%’; 下划线占位符
https://blog.csdn.net/livebecauseofyou/article/details/79267767
**in ()**表示一个范围 not in()
select goods_id,cat_id,goods_name from goods where goods_id in (select max(goods_id) from goods group by cat_id);
between int and int; 一个连续的范围
select goods_id,goods_name from goods where goods_id between 25 and 30;
子查询:(嵌套select作为返回值)
where子查询(重点)
select goods_id,goods_name from goods where goods_id=(select max(goods_id) from goods );
select * from goods group by cat_id;
分组打印(随机打印第一个)
from子查询
from (select虚拟的结果表)
select goods_id,goods_name from (select * from goods where 1 order by cat_id asc,goods_id desc) as tmp group by cat_id;
exists子查询(两张表综合查询,where后,显示一张表的内容)
select * from category where exists (select * from goods where goods.cat_id=category.cat_id);
连接:
内连接(from后,两张表的内容混合显示)
列表名1 inner join 列表名2 on 条件
select boy.hid,boy.bname,girl.hid,girl.gname from boy inner join girl on boy.hid=girl.hid;
inner join on(显示满足条件的)
左连接: left join on(以左边为主体)
右连接: right join on
(可以嵌套连接,但同样的引用相同的表需要重命名)
实例:
select //打印声明
hid,t1.tname as hname ,mres,gid,t2.tname as gname,matime //打印格式
from //表格声明
m left join t as t1 //t重命名为t1
on m.hid = t1.tid //连接条件
left join t as t2 //t重命名为t2
on m.gid = t2.tid //连接条件
where //条件声明
matime between ‘2006-06-01’ and ‘2006-07-01’; //调取条件
in,exists,内连接性能比较:
内连接>exists>in
null:
空值(Null)与空字符(’’)
null不是对象,’‘是对象
从’’,你就可以知道这是一个字符串类型的数据,是一个长度为零的字符串。
从NULL,你只能知道这里没有赋过值,是空的,他不属于任何数据类型。
空值不一定为空
空值是一个比较特殊的字段。
空值不等于空字符
当比较表中的值是否为空时用is连接
null值也不等同于空值,空值是不占用存储空间的,null占用存储空间
拼接:
union:(查询体拼接)
select * from 表名1 union select * from 表名2;
union all:全部显示(有相同的也显示)
实例:
select
id,sum(r.num)
from
(select * from a union all select * from b) as r
group by id;
表的连接:
增加外键约束:
alter table 表名1 add constraint foreign key(中间表外键名)
references class(主键名)
on delete cascade;
select user_table.user_name, user_type_table.uer_type from user_table inner join user_type_table on user_table.user_type_id=user_type_table.user_type_id;
case when
case when sex=1 then '男'
case when sex=2 then '女'
else '其他'