数据库从入门到出门之二

版权声明:转载请注明! https://blog.csdn.net/smile_geek_sq/article/details/82191406

上回说到DDL-数据库定义语言,说到定义数据库,就要说说数据完整性,该如何定义数据库。

目录

一:数据完整性

一)数据的准确性和可靠性

二)完整性约束

1.实体完整性

2.域完整性

3.引用完整性

4.自定义完整性

二:运算符

三:接上篇DML:数据操纵语言(数据操作 增删改查)

一:添加数据 insert

二:删除数据 delete

三:修改数据 update

四:查询数据 select

五:函数

1.单行函数

2.聚合函数和分组函数

3.加密函数


一:数据完整性

一)数据的准确性和可靠性

二)完整性约束

1.实体完整性

一个实体就是一条记录。

实体完整性约束保证数据记录之间是准确的(能够唯一标识一个实体)。

主键约束:唯一的,不为空。primary key

#添加主键约束
create table student(
sid int primary key,
sname varchar(20)
);
#第二种方式
creeate table student(
sid int ,
sname varchar(20),
primary key(sid)
);
#表创建之后添加主键约束
create table student(
sid int,
sname varchar(20)
);

alter table student add constraint PK_SID primary key(sid);

我们该如何选择主键呢?

唯一的,不要选择业务字段。

主键添加:

一张表中只能有一个主键,但是可以有联合主键(多个字段整体作为主键)

每张表必须设置主键。

唯一约束:不能重复,可以添加多个(unique)

alter table userinfo add constraint UQ_CARD unique(card);

主键自增,从一开始,每次自身加1 (Oracle不能使用)

create table student(

sid int primary key auto_increment,

sname varchar(20)

);

删除约束

alter table student drop primary key;

2.域完整性

域指的是字段

类型约束、非空约束:不能为空 not null 、默认值:default 值

#非空和默认值

create table student(

sid int primary key auto_increment,

sname varchar(20) not null,

gender bit(1) default 1     //存一位  0/1  0 女 1男

);

3.引用完整性

一张表中通用列的取值必须参考另外一张表主键字段。

外键约束:foreign key

alter table student add constraint FK_CID foreign key(cid) references classroom(cid);

注意:主外键关联字段名称可以不一致,但是类型必须一致

4.自定义完整性

check 约束:在mysql 中不能使用:

alter table student add constriaint check(age between 1 and 100);

二:运算符

#算术运算符 

 select 1+1;

 select 1-1;

 select 1*2;

 select 3/2;   # 1.5

 select 3 div 2; #整除

 select 3/0;   # null

# 比较运算符  = != >= <=  true 1 false 0

  select 1!=1;

  # is null / is not null / between ...and .../ in / not in

# 逻辑运算符  and or !

  select 1=1 and 1=2;

       select 1=1 or 1=2;

       select !1=1;

# 位运算符  & | ^

  select 3 & 2;   # 2

       select 3 | 2;   # 3

       select 3 ^ 2;   # 1

三:接上篇DML:数据操纵语言(数据操作 增删改查)

一:添加数据 insert

#添加数据到 classroom
#给所有字段添加值,和表中字段顺序一致
insert into classroom values(3,'class1');

#给cname字段添加值,和指定字段的顺序必须一致
insert into classroom(cname) values('class2');

#批量插入
insert into classroom(cname) values('class2'),('class3'),('class4');

#讲classroom 的值 整体复制到 classroom1
insert into classroom1 select * from classroom

二:删除数据 delete

delete from tablename where 条件

truncate:清空 文件级别清空 自增重置

delete: 删除 只修改数据,逐行删除 自增不会重置

三:修改数据 update

update tablename set 字段=新值  where 条件

update classroom set cname='class5' where cid=4;

四:查询数据 select

select 字段|表达式  from tablename|视图|结果集

where 条件

group by 分组

having 分组之后进行检索

order by 排序

limit 限制结果

下面来点Demo:

字段:

emp:

dept:

demo:

# 查询所有信息
 select * from emp;
 #查询所有员工的姓名和工资
 select ename,sal from emp;
 #查询工资>2000的员工信息
 select * from emp where sal > 2000;
 #查询工资在1000到2000之间的员工信息(范围查询)
 select * from emp where sal >= 1000 and sal <=2000;
 select * from emp where sal between 1000 and 2000; 
 #查询编号(empno)为7521,7369,7788的员工信息。(集合查询)
select * from emp where empno = 7521 or empno = 7369 or empno = 7788;
select * from emp where empno in (7521,7369,7788);
 #别名(简化   做解释说明)  [as] 别名
 #字段  表达式  结果集 表 都可以起别名
 select ename,sal*1.05 nsal from emp;
 # 查询所有职位信息  去重
 select distinct job from emp;
 # 查询在10号部门工资最高的员工信息
  #1.10号部门所有员工
	select * from emp where deptno =10;
	#2.排序,取第一个
	select * from emp where deptno =10 order by sal desc limit 0,1;
# 排序 order by 排序字段   默认升序排序 asc | desc
  #根据员工工资降序排序,工资一致的按照员工编号的降序排序。   select * from emp order by sal desc,empno desc;
# 限制结果查询  limit 下标,长度	 (仅适用于mysql,分页查询)
  select * from emp limit 0,5;
# 查询所有有奖金的员工信息   select * from emp where comm is not null;
# 模糊查询  like  %:0到多个任意字符 _:1个字符
  # 查询名字以s打头的员工信息
	 select * from emp where ename like 's%';
	 #包含   
	 select * from emp where ename like '%s%';
	 # 第二个字符为L的所有员工信息
	 select * from emp where ename like '_l%';

五:函数

1.单行函数

#数学函数
	 select PI()* 2 *2;  #pi
	 select CEIL(-12.3); #向上取整
	 select FLOOR(12.3); #向下取整
	 select ROUND(8.45,-1); #四舍五入
	 select MOD(5,2);  #取模
	 select RAND();  #随机数 [0,1)
	 select POW(2,3); #幂运算 
	#随机从emp中获取两条记录。
  select * from emp order by RAND() limit 2;
 #字符函数
   select LENGTH('this is a dog');   #获取长度
	 select length(ename) from emp; 
	 select LOWER('THIS'); 
	 select UPPER('this');
	 select SUBSTR('this is zs',1,6); #下标从1开始
	 #select REPLACE(str,from_str,to_str);
	 select trim(' this is '); #去两端空格
	 select LPAD('aa',10,'*');  #左填充
	 select RPAD('aa',10,'*');  #右填充
	#日期函数
	  select NOW();  #当前时间
		select SYSDATE();  #获取系统时间
		select CURRENT_DATE();
	  select CURDATE();
		select CURRENT_TIME();
	  select CURTIME();
	  select YEAR('1998-09-09');
		select YEAR(NOW());
		select MONTH(date);
		select DAY(date);
		#获取当前月最后一天
		select LAST_DAY('2018-02-02');
		#日期计算
		select DATE_ADD(NOW(),interval 2 MONTH);

2.聚合函数和分组函数

# 聚合函数
	  # min()  max()  avg()  count() sum()
		select max(sal) from emp;
		select min(sal) from emp;
		select avg(sal) from emp;  
		select count(*) from emp;  #记录数
		select count(1) from emp;  #记录数
		select count(comm) from emp; #字段非空总数
		select sum(sal) from emp;
	 
	 
	 #分组 group by 分组条件   having:分组之后进行检索
	  select deptno,avg(sal) from emp group by deptno;
		
	 # 查询平均工资大于2000的部门的编号和平均工资。
	   # 1.where在group by之后
		 # 2.where中不能使用聚合函数
	   select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000;

3.加密函数

#加密函数
	 select MD5('root');
	 select SHA('root');
	 select password('root');

猜你喜欢

转载自blog.csdn.net/smile_geek_sq/article/details/82191406