数据库基本命令

数据库变量类型

在这里插入图片描述

数据库基本命令

创建数据库

create database <数据库名字>;

创建表

create table student(id int auto_increment,name varchar(255),primary key(id),constraint <外键名字> foreign key(name) references <另一个表名>(name)) default charset=utf-8;

外键:表A中的主键ID,对应表B中的A_ID,创建表B的时候,constraint<外键名字> foreign key (B_ID) references B (ID),A_ID是表A中ID的外键

增加表字段

alter table student add score int defalut null;

删除表字段

alter table student drop column score;

  • 删除已有数据的表字段,数据会被删除吗?
修改表字段

alter table tablename modify column price varchar(20);

增加主键

alter table student contraint <主键名字> primary key (id);

增加外键

alter table student contraint <外键名字> foreign key (name) references <表名>(name);

删除外键

alter table student drop foreign key <外键名字>;

删除表

drop table <表名>;

新增表数据

insert into <表名>(id,name,sex,grade) values (‘张三’,‘女’,91);

删除表数据

delete from tablename where id = 1;

修改表数据

update tablename set name = ‘lisa’ where name = ‘张三’;

order by

单个排序标准 asc正序 desc倒序(空值在前)
多个排序标准 order by A asc, B desc[先按照A正序排,A相同,按照B倒序排]

group by

分组,值相等的为一组,再去计算集函数

集函数

count() avg() min() max() sum()

select s.id,c.name,count(s.sex),avg(s.score)
 from student s 
 LEFT JOIN student_class sc on s.s_id = sc.c_id 
 Left join class c on sc.s_id = c.c_id 
 where s.sex = '女' 
 group by c.c_name 
 order by c.c_id asc;

单个分组标准
多个分组标准
group by A ,B(先按照A分组,再在A分组的基础上,每一组按照B分组)

having

作用于组
group by A having count(A) > 3(选择统计结果大于3的组)

where

作用于基表或视图
两者结合:找到课程成绩都及格,且选修了3门以上课程的学生学号及课程数

select sno,count(cno) 
from sc where grade > 60 
group by sno 
having count(cno) > 3
通配符

like ‘’ %[0,无穷) _[1] a,b,c

查询满足条件的前5条记录

Oracle

SELECT * FROM TABLE1 WHERE ROWNUM<=N 

Mysql

SELECT * FROM TABLE1 LIMIT N 
UNION与UNION ALL

select的列数量一致,且字段类型基本一致
UNION过滤重复行,UNION ALL不过滤重复行,因为没有排序,删除等操作,所以效率比UNION高

mysql内连接与外连接,区别

内连接inner join 左连接、右连接、全连接outer join 左排除连接、右排除连接、外排除连接

SQL中的drop、delete、truncate的区别

drop删除表和表数据,delete、truncate删除表数据
delete可以删除table、view的数据;truncate可以删除table数据
delete放在事务中可以回滚,truncate、drop不能回滚。
删除速度:drop>truncate >delete
所以
删除整个表,drop
删除部分表数据:delete+where
删除所有表数据,保留表:truncate

SQL 中使用正则

oracle:select * from tablename where REGEXP_LIKE(name , ‘正则表达式’);
mysql:select * from tablename where name like ‘%正则表达式%’; select * from tablename where name REGEXP ‘%正则表达式%’;

主键、外键、候选键、超键

主键:primary key 非空,一个表只有一个
外键:对应另外一张表的主键
候选键:最小超键
超键:在关系中唯一标识元组的属性集成为关系模式的超键。超键包含候选键、主键

sql 安全

1.用户端:防止SQL注入,利用or、 引号注入
2.内部人员:最小权限原则
3.开发人员:SQL报错,不可以直接返回给用户,防止泄露数据库信息
4.开发与测试人员:规范编码,不能将登陆信息硬编码到程序中
5.DBA:有完善的数据备份与恢复机制,可以在出现突发状况时力挽狂澜
6.内部规范:所有的用户使用一个共用的帐号是不合理的,每个用户一定要有它自己的登录(我经历过的公司都是共用一个账号的,具体实施有待了解。)

数据库事务

单个逻辑单元执行一系列操作:增删改查等等
原子性:要么全部执行,要么全部不执行【事务回滚】
一致性:事务执行,不影响数据库的一致性
独立性:两个以上的事务不会出现交替运行的状态
持久性:事务运行成功后,数据库更新是永久的
数据库事务语句
开始 begin transaction
提交 commit transaction
回滚 rollback transaction
设置保存点savepoint,作为回滚的标记点。回滚的情况:在一个事务中回滚调用某个事务时,回滚
不同的回滚情况释放的锁是不一样的,锁:表级锁、行级锁、数据锁

存储过程

预编译的代码块,执行效率高;一个存储过程代替大量的T-SQL,可以降低网络通信;确保数据安全
有哪些功能:定义变量,入参、出参、条件语句、循环语句、游标、自定义函数、触发器等

索引

  • 索引的本质是一种数据结构,帮助数据库高效获取数据
  • 索引的优缺点:
    提高检索效率,降低io成本;
    索引排序,降低排序成本,降低CPU消耗
    降低更新表的速度,比如增删改操作,不仅要保存数据还要保存索引信息。
  • 什么时候创建索引?什么时候不需要索引?
    主键、外键、频繁查询的字段、分组统计依据字段、排序依据字段 适合创建索引
    表数据少的字段、经常增删改的字段、不经常做查询的字段、过滤性小的字段 不适合创建索引
  • 索引种类,从功能上划分
    普通索引(无约束)、唯一索引(数据唯一约束)、主键索引(非空约束)、全文索引
  • 索引种类,从物理实现分
    聚集索引(按照主键排序)、非聚集索引(二次查找:索引项(顺序存储)、索引指向的内容(随机))
  • 索引存储在硬盘上 防止数据丢失

乐观锁与悲观锁

  • 目的:并发控制

  • 乐观锁:假设不会发生并发冲突,提交时检查是否有其他事务修改了该数据,如果有,则回滚。不使用锁,不会产生任何锁或死锁。但是如果两个事务同时读取了数据库的某一行,修改,可能会遇到问题。

  • 悲观锁:假设会发生并发冲突,提前屏蔽可能会违反数据完整性的操作(使用排他锁),可能会导致死锁
    1.在对任意记录进行修改前,先尝试为该记录加上排他锁(exclusive locking)
    2.如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常
    3.如果成功加锁,那么就可以对记录做修改,事务完成后就会解锁了
    4.其间如果有其他对该记录做修改或加排他锁的操作,都会等待我们解锁或直接抛出异常

  • 适用情况
    乐观锁,适用于并发情况出现的几率很小的情况
    悲观锁,适用于并发情况出现概率大,数据安全级别高的情况。

  • 使用索引查询一定能提高查询性能吗?
    不一定。索引本身需要存储空间与维护,不必要的索引反而会使查询时间变慢。

视图

虚拟的表,建立一个表将多表的查询结果联合起来,获取数据更容易。数据权限上,可以暴露部分字段给访问者。

三个范式

一张数据表的表结构所符合的某种设计标准的级别。
检验3NF要求的数据库设计:是否存在数据冗余过大、插入异常、修改异常、删除异常的问题。

对数据库查询速度方面的优化

1.数据库设计:表结构(范式)、索引、分区、固定长度的字段、限制字段长度
2.数据库I/O:增加缓冲区、存在表的级联,不同的表放在不同磁盘,增加I/O速度
3.SQL语句:优化,减少比较次数;限制返回的条目
4.java:数据库连接,反复使用的查询,使用PreparedStatement

参考文章:https://blog.csdn.net/weixin_30363263/article/details/80114142

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值