数据库常用语句
时间:2021-07-01 10:21:17
帮助过:27人阅读
2
基本sql
create table
create database
select
insert
update
delete
3
select
模糊查询 like
分组查询 group by
排序 order by
聚合函数 sum count avg min max
分页 limit index,count
为什么要分页:数据量比较大 如果全部查询 出现一下问题:
1
全部数据都展示用户 数据量太大 用户难以接受
2
数据量大 查询慢
3
如果将大量数据读取到java内存中 可能存储崩溃
( 4GB
1GB =
1024MB
1MB =
1024KB
1KB =
1024B
1B =
8b
int a = 10
4字节
)
分页:(链接数据库查询 是非常占用资源)
A 全部查询 在前台展示的时候 只展示 其中的一部分(js)
(数据库较少)
B 数据库获取数据的时候 就只查询部分数据(当前页展示的数据)然后前台直接展示
(数据量大)
B : 在查询的时候 只查询部分数据 -----
》 limit index,length
select * from product limit 0,5 -- 1 5
select * from product limit 1,5 -- 2 6
select * from product limit 3,7 -- 4 10
首页 上一页 1 2 3 4 5 6 下一页 尾页 跳转【】页 每页【5
】条 共20页
问题1 : 第一页 limit 0,5
第二页 limit 5,5
第三页 limit 10,5
第四页 limit 15,5
第n页 每页x条 limit (n-1)*
x ,x
问题2 : 100条 5 总:20
101条 5 总:21
105条 5 总:21
106条 5 总:22
t条 x 总:(t+x-1)/
x
4
多表查询
1
为什么会多表 (主键,外键)
学生表
id name age grade
1 张三 18
QY97
2 李四 18
QY97
3 王五 60
QY98
4 马六 61
QY98
领导通知: QY97 ----
》 最强97
班主任 : update student set grade = 最强97 where grade =
QY97 (80亿)
数据库数据冗余(减少冗余)
学生表 班级表
id name age gid id gname
1 张三 18 1 1
QY97
2 李四 18 1 2
QY98
3 王五 18 2
4 马六 18 2
班主任: update grade set gname=最强97 where id = 1
2
两张表如何查询数据?
select *
from student
1 张三 18 1
2 李四 18 1
3 吴昂无 18 2
4 王阿斯顿18 2
5 阿斯顿 19 3
6 暗室逢灯19 3
班级我们其实希望看到 是 班级的名字 并不是班级的编号(我们需要将数据多表存储 又需要在查询的时候 将多表的数据 全部查询出来)
多表查询会出现 "笛卡尔乘积"
问题
(a,b) (c,d) ===>
ac,ad,bc,bd
(哪几张表,各个表之间的联系)
内连接
隐式内连接
SELECT
s.id,s.name,s.age,g.gname
FROM
student s,
grade g
WHERE
s.gid = g.id ==>
消除笛卡尔乘积
显示内连接
SELECT
s.id,
s. NAME,
s.age,
g.gname
FROM
student s
INNER JOIN grade g ON s.gid =
g.id
select 列名 from 表1 inner join 表2 on 表1.列 =
表2.列
外连接
左外(需求:查询所有学生信息 如果有班级显示班级名称)
SELECT
s.id,
s. NAME,
s.age,
g.gname
FROM
student s
left JOIN grade g ON s.gid =
g.id
右外
SELECT
s.id,
s. NAME,
s.age,
g.gname
FROM
student s
right JOIN grade g ON s.gid =
g.id
内连接查询的是多个表的交集
外连接查询的是一张表的全部数据和另一张表满足要求的数据
5
子查询
需求: 查询张三的同班同学
1
查询张三是哪个班?
select gid from student WHERE name = "张三"
2
查询和张三班级一样的同学
select * from student where gid = 1
SELECT
*
FROM
student
WHERE
gid =
(
SELECT
gid
FROM
student
WHERE
NAME = "张三"
)
数据库范式(数据库设计的规范):
注意:后面的范式一定满足前面
第一范式: 原子性(范式、事务ACID、线程)(不可再分 列不能再分)
表:存储用户信息 手机号 (需求 一个用户可能没有手机号 也可能有多个手机号)
错误一:(
关系型数据库(列固定 行多个)MySQL oracle sqlserver
非关系型数据库NoSQL 是关系型数据库的补充(基于内存)缓存服务 redis
)
id name age sex tel tel1 tel2 tel3 tel4 tel5
错误二:
id name age sex tel
1 张三 18 男
2 李四 18 男 110
3 王五 18 男 120,130,140
正确
User telephone
id name age sex id uid tel
1 张三 18 男 1 2 120
2 李四 19 男 2 3 130
3 王五 19 男 3 3 140
第二范式:唯一性
设计: 学生 选修课 成绩
id 姓名 年龄 选修课 成绩
1 张三 18 化学 99
2 张三 18 毛概 66
3 李四 18 物理 99
4 李四 18 java 59
学生表 成绩表
id 姓名 年龄 id sid 课程 成绩
1 张三 18 1 1 化学 99
2 李四 18 2 1 毛概 66
3 2 物理 99
4 2 java 59
第三方式:减少冗余
id name age gname 班主任
1 张三 18 QY97 罗
2 李四 18 QY97 罗
3 王五 18 QY98 罗
4 赵六 18 QY98 萝
id name age gid id gname
1 张三 18 1 1 QY97
2 李四 18 1 2 QY98
3 王五 18 2
4 赵六 18 2
问题: 主外键 总结 哪张表应该加外键
一对多 一个班级 有 多个学生
一个用户 有 多个手机号
一个学生 有 多个课程
反三范式:在实际开发中,适当的冗余能提高开发效率
数据库常用语句
标签:base dex 效率 pre nbsp ade 三范式 链接 课程