IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 数据库知识点+sql语句增删改查(详解) -> 正文阅读

[大数据]数据库知识点+sql语句增删改查(详解)

# 数据库相关SQL

1.查询所有数据库

- 格式: show databases; ? ? ? ?

2.创建数据库

- 格式: create database 数据库名 charset=utf8/gbk;

- 举例:

- create database db1;

- create database db2 charset=utf8;

- create database db3 charset=gbk;

- show databases; ??

3.查看数据库信息

- 格式: show create database 数据库名;

- 举例:

- show create database db1;

- show create database db2;

- show create database db3;

4.删除数据库

- 格式: drop database 数据库名;

- 举例:

- drop database db2;

- drop database db3;

5.使用数据库

- 执行表相关和数据相关的SQL语句之前必须使用了某一个数据库 否则会报错.

- 格式: ?use 数据库名;

- 举例:

- use db1;

??

# [练习]()

create database +数据库名字 charset=utf8/gbk

drop database +数据库名?

insert into +数据库名 (表字段1,表字段2)values(值1,值2)?

insert into +数据库名 values(值1,值2)?

delete from +表名字 where +条件

update +表名字 ?set ?值 where 条件

select ?字段信息 ?from ?+表名字 ?where ?条件


**[模糊查询]**
%: 代表0或多个未知字符
? ? _:代表1个未知字符
? ? ? ? 举例:以x开头 ? ? ? x%
? ? ? ? ? ? 以x结尾 ? ? ? %x
? ? ? ? ? ? 包含x ? ? ? ? ? %x%
? ? ? ? ? ? 第二个字符是x ? ? ? _x%
? ? ? ? ? ? 以x开头以y结尾 ? ?x%y
? ? ? ? ? ? 第三个是x倒数第二个是y ? ? ? __x%y_
? ? ? ? ? ??
查询姓孙的员工信息
? ? select * from emp where name like "孙%";
查询名字以精结尾的员工姓名
? ? select name from emp where name like "%精";
查询1号和2号部门中工作以市开头的员工信息
? ? select * from emp where job like "市%" and dept_id in(1,2);


[in(x,y,z) ?查询字段的等于多个值]?
?? ?当查询某个字段的值等于多个值的时候使用 ?

? ? ?
[between x and y 两者之间(包含x和y)] ?


[is null 和is not null]
[and 和 or 和 not]
?? ?and: 等效java中的&&, ?需要多个条件同时满足时使用?
? ? or: 等效java中的|| , ?多个条件满足一个时使用 ? ? ? ??

? ? ? ??
查询1号和2号部门中工作以市开头的员工信息
select *from emp where job like "市%" and dept_id in(1,2);
?



[distinct去重]
去掉重复的数据
查询员工表中出现了哪几种不同的工作select distinct job from emp;
查询员工表中出现了哪几个部门的idselect distinct dept_id from emp;


[别名]?
select name as "名字" from emp;
select name "名字" from emp;
select name 名字 from emp;
?



*[排序 order by]** [放在where后面]
格式: order by 字段名 asc升序(默认)/desc降序;


*[分组查询group by]**[替代掉where]
? ? 可以将某个字段相同值的数据划分为一组,然后以组为单位进行统计查询 ?
? ? 如果题目中出现每个或每种这样的关键字 并且查询的内容为聚合函数的结果
? ? 例子:
?? ?查询每个部门的平均工资
? ? ? ? select dept_id,avg(sal) from emp group by dept_id;
? ? 查询平均工资最高的部门id和平均工资 ?
? ? ? ? select dept_id,avg(sal) from emp group by dept_id order by avg(sal) desc limit 0,1; ? ? ? ? ? ?
? ? ? ? ? ??
? ? ? ? ? ??

查询工资高于2000的员工姓名和工资, 按照工资降序排序
select name,sal from emp where sal>2000 order by sal desc;
?



**[聚合函数]**
通过聚合函数可以对查询的多条数据进行统计查询
有哪些统计方式??
平均值avg
最大值max
最小值min
求和sum
计数count
平均值avg()
? ? 查询1号部门的平均工资
? ? select avg(sal) from emp where dept_id=1;
求和sum()
? ? 查询程序员的工资总和
? ? select sum(sal) from emp where job="程序员";
计数count(*)
? ? 查询员工表的人数
? ? select count(*) from emp;
?



**[having 关键字]**
where后面只能写普通字段条件,不能写聚合函数条件
having后面专门写聚合函数条件,而且需要和group by分组查询结合使用,写在group by 的后面

举例:查询每个部门的平均工资,要求平均工资大于2000
?? ?select dept_id,avg(sal) from emp group by dept_id having avg(sal)>2000;
?? ?select dept_id,avg(sal) a from emp group by dept_id having a>2000; ? ?<给平均工资起个别名>
?? ?查询每种工作的人数,只查询人数大于1的?
?? ?select job,count(*) c from emp group by job having c>1;
?? ?查询每个部门的工资总和,只查询有领导的员工, 并且要求工资总和大于5400.
?? ?select dept_id,sum(sal) s from emp where manager is not null group by dept_id having s>5400;
?? ?查询每个部门的平均工资, 只查询工资在1000到3000之间的,并且过滤掉平均工资低于2000的
?? ?select dept_id,avg(sal) a from emp where sal between 1000 and 3000 group by dept_id having a>=2000;
?? ?
?



**[分页查询]**
格式: limit 跳过的条数,请求的条数(每页的条数)
? ? 跳过的条数= (请求的页数-1)*每页的条数
? ? 举例:查询第一页的5条数据(1-5) ? limit 0,5 ?
? ? ? ? 查询第2页的5条数据(6-10) ? limit 5,5
? ? ? ? 查询第5页的5条数据 ? ? ? ? ? ? limit 20,5
? ? ? ? 查询第8页的10条数据 ? ? ? ?limit ?70,10
? ? ? ? 查询第7页的8条数据 ? ? ? ? ?limit ?48,8


1.查询工资最低的3个人的信息
select * from emp order by sal limit 0,3;
2.查询工资最高的员工信息
select * from emp order by sal limit 0,1;
3.按照入职日期排序 查询第2页的3条数据
select *from emp order by hiredate limit 3,3;
?



**[子查询][又名嵌套查询]
可以将一条SQL语句查询的结果当做另外一条SQL语句条件的值?

查询工资大于2号部门平均工资的员工信息
? ? select avg(sal) ?from emp where dept_id=2;
?? ?select * from emp where sal>(select avg(sal) ?from emp where dept_id=2);

查询工资高于程序员最高工资的员工信息
? ? select max(sal) from emp where job="程序员";
?? ?select * from emp where sal>(select max(sal) from emp where job="程序员");

查询孙悟空的部门信息(用到dept部门表)
? ? select dept_id from emp where name="孙悟空";
?? ?select * from dept where id=(select dept_id from emp where name="孙悟空");



**[关联查询]
1.[等值查询] ?select * from A,B where 关联关系 and 其他条件 ?

2.[内连接] 格式: select * from A join B on 关联关系 where 条件


查询每个员工的姓名和对应的部门名 ?
select e.name,d.name from emp e,dept d where e.dept_id=d.id;

3.[外连接] 查询工资高于2000的员工姓名,工资和部门信息
select e.name,e.sal,d.* from emp e,dept d where e.dept_id=d.id and sal>2000;



/**字符串拼接*/
concat(str1, str2,…)函数
把多个串连接起来形成一个较长的串

concat_ws(separator, str1, str2, …)函数
该函数可以一次性指定分隔符
? ??
*详细SQL字符串怎么拼接*
答:①CONCAT() 拼接字符串基本型:SELECT CONCAT ( lastname , firstname) AS student_name FROM kalacloud_student;
②2.使用空格拼接字符串:仍然使用 SELECT CONCAT() 命令,空格需要使用' ' 两个单引号引起来。SELECT CONCAT(firstname, ' ', Subject) AS StudentDetail FROM kalacloud_student;
③使用特殊符号拼接字符串:SELECT CONCAT(firstname, '-', subject, '-', qualification) AS Detail FROM kalacloud_student;
④在筛选查询中进行字符串拼接并显示在表格里:SELECT CONCAT(qualification, ' ', firstname, ' - ', subject) AS 候选人资料, wechat_id, phone FROM kalacloud_student WHERE qualification = 'MPhil';
/**⑤字符串与中文文本的拼接:SELECT CONCAT('候选人:', lastname,firstname, ' 学科:',subject,' 学历:', qualification) AS 简历 FROM kalacloud_student ORDER BY qualification DESC;*/⑥CONCAT_WS() 仅需写一次分隔符即可拼接所有字符串:SELECT CONCAT_WS(' / ', firstname, phone, subject, qualification) AS Detail FROM kalacloud_student;
⑦总结:CONCAT() 字符串拼接功能在日常工作场景中使用非常频繁,但它的原理很好理解。任何非数据库中的字符串都加上' 单引号引起来即可。
```

# 特殊查询方式

### 1.关联查询(关联查询包括: 等值链接, 内连接和外连接)

??? ?[同时查询多张表数据的查询方式称为关联查询]()

- 如果查询的是多张表中的数据则使用关联查询:(等值链接,内连接和外连接)

- 如果查询的是多张表的交集数据,则使用等值链接或内连接(推荐)

- 如果查询的是一张表的全部和其它表的交集数据则使用外连接


### 2.关联查询之等值链接

- 格式: select * from A,B where 关联关系 and 其它条件

1. 查询每个员工的姓名和对应的部门名 ?

select e.name,d.name

from emp e,dept d where e.dept_id=d.id;

1. 查询工资高于2000的员工姓名,工资和部门信息

select e.name,e.sal,d.*?

from emp e,dept d where e.dept_id=d.id and sal>2000;


### 3.关联查询之内连接?

- 内连接和等值链接作用一样,查询到的都是两个表的交集数据,查询不到交集以外的数据

insert into emp(name,sal) values("灭霸",5);

- 格式: select * from A join B on 关联关系 where 条件

1. 查询每个员工的姓名和对应的部门名 ?

select e.name,d.name

from emp e join dept d on e.dept_id=d.id;

1. 查询工资高于2000的员工姓名,工资和部门信息

select e.name,sal,d.*

from emp e join dept d on e.dept_id=d.id

where sal>2000;


### 4.外连接

- 作用:查询一张表的全部和另外一张表的交集数据

- 格式:select * from A left/right join B on 关联关系 where 条件;

1. 查询所有员工名和对应的部门名

select e.name,d.name

from emp e left join dept d on e.dept_id=d.id;

1. 查询所有部门名称,地点和对应的员工姓名和工资,只查询有领导的员工

select d.name,loc,e.name,sal

from emp e right join dept d on dept_id=d.id where e.manager is not null;

数据类型?

**5数据类型**  

1). 整数: int(m) 和 bigint(m) , bigint等效java中的long,  m代表显示长度,举例m=5,存18  查询到 00018   , 需要补零的话必须使用zerofill关键字             
create table t1(age int(5) zerofill);
insert into t1 values(18);
select * from t1;

2). 浮点数: double(m,d)  m代表总长度,d代表小数长度   54.432  m=5 d=3   
create table t2(price double(5,3));
insert into t2 values(45.2312312123);
insert into t2 values(455.231);   //报错 

3). 字符串
- char(m): 固定长度字符串 , m=5  存abc  占5个字符长度 , 应用场景: 当存储长度固定时,比如存储性别char(1)  , 最大字符长度255
- varchar(m):可变长度字符串, m=5 存abc 占3个字符长度, 最大值65535但是建议保存255以内长度的数据
- text(m):可变长度字符串, 最大值65535 建议保存长度大于255的数据

4). 日期
- date: 只能保存年月日
- time: 只能保存时分秒
- datetime: 保存年月日时分秒, 最大值9999-12-31, 默认值为null
- timestamp(时间戳:保存1970年1月1日到现在的毫秒数):保存年月日时分秒, 最大值2038-1-19 , 默认值为当前系统时间(当赋值为null时触发默认值)
举例:
create table t_date(t1 date,t2 time,t3 datetime,t4 timestamp);
insert into t_date values("2022-06-09",null,null,null);
insert into t_date values(null,"16:16:20","2011-11-22 10:20:30",null);
select * from t_date;

?数据库相关事务

**1.数据库里索引的作用**
    优点:主要作用为了增加数据的查询速度
    缺点:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。    
       
下不适合加索引:
1):如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。
2)、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。    
3)、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间

**2.什么是数据库的事务**
    事务就是为了保证原有事物的完整性和一致性,通过一定的条件规定该事物的可靠性和安全性(如数据库中的事物)。

事务的四大特性:
A:原子性:一个事物是不可再分的工作单位,该事物要么成功要么失败。
B:一致性:事物必须是使数据库从另外一个一致性状态到另一个一致性状态,与原子性密切相关。
C:持久性:指一个事物一旦提交后对数据库中数据的改变应该是永久不变的。
D:隔离性:一个事物的执行不能够被其他事物所干扰。
    
    
**3.数据库里的字段约束有哪些,各有什么作用** 
    1).主键约束:实现实体的完整性(PK:主键),值唯一,不能为空,且可以自动递增
    3).非空约束:(NOT NULL)保证该字段的内容不能为空null
    4).唯一约束:列表的唯一性约束(UNIQUE)
    5).检查约束:检查列的值是否满足一个boolean表达式(CHECK)
    6).默认约束:给指定的字段可以设置默认值,不设置值时使用默认值而不是null
    
**4.数据库优化的方案有哪些**
    (1)查询时,能不用* 就不用,尽量写全字段名。
    (2)索引不是越多越好,每个表控制在6个索引以内。范围where条件的情况下,索引不起作用,比如where value<100
    (3)大部分 情况连接效率远大于子查询
    (4)多用explain 和 profile分析查询语句
    (5)有时候可以1条大的SQL可以分成几个小SQL顺序执行
    (10)尽量避免使用order by
    (9)查看慢查询日志,找出执行时间长的SQL进行优化

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:18:22  更:2022-09-04 01:22:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:01:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码