【数据库(MySQL)基础】以MySQL为例的数据库基础

文章目录

  • 0. 本文用到的emp表,dept表,salgrade表
  • 1. MySQL入门
  • 2. 简单查询
  • 3. 字段计算
  • 4. 条件查询
    • 4.1 and
    • 4.2 null
    • 4.3 or
    • 4.4 and和or的优先级
    • 4.4 in 和 not in
    • 4.5 模糊查询
  • 5. 排序
    • 5.1 简单排序
    • 5.2 两个字段排序
    • 5.3 综合排序
  • 6. 一些常用函数
    • 6.1 大小写转换
    • 6.2 substr子字符串
    • 6.3 concat和rand
  • 7. 统计
  • 8. 执行循环
  • 9. 分组查询
    • 9.1 基础分组查询
    • 9.2 升级分组查询
    • 9.3 having
    • 9.4 distinct去重
  • 10. 多表查询
    • 10.1 笛卡尔积
    • 10.2 内连接等值连接
    • 10.3 内连接非等值连接
    • 10.4 内连接自连接
    • 10.5 外连接
    • 10.6 三表查询
  • 11. 子查询
    • 11.1 where
    • 11.2 from
  • 12. union
  • 13. limit
  • 14. 表的创建与删除
  • 15. 增删改
    • 15.1 增insert
    • 15.2 改update
    • 15.3 删除delete
  • 16. 约束
    • 16.1 非空约束not null
    • 16.2 唯一性约束unique
    • 16.3 unique作为表级约束
    • 16.4 表约束unique和not null
  • 17. 主键自增
  • 18. 外键
  • 19. 事务开启

0. 本文用到的emp表,dept表,salgrade表

emp表:

empno, ename, dept, mgr表示员工编号,员工姓名,所属部门编号,经理编号

dept表:

deptno, dname表示部门号和部门名

salgrade表:

grade, losal, hisal表示工资等级、该工资等级的最低工资、该工资等级的最高工资

1. MySQL入门

mysql -uroot -proot:进入mysql,-u表用户名,-p表密码

show databases:展示所有数据库

use 数据库名称:打开数据库

show tables:查看所有的数据库表

create 数据库名;:创建数据库,注意一定要有分号

source 表路径:将路径的内容导入到表中(sql文件)

describe 表名desc 表名:展示表字段名称、类型等信息

select version():查看数据库版本

select database():查看当前使用的数据库

drop database 数据库名:删除数据库

2. 简单查询

select * from 表名:选择表中的所有字段

select 属性名[,属性名,...] from 表名:选择表中的指定字段(属性)

select 属性名 as 别名[,属性名 as 别名...] from 表名:将属性名用别名替代展示在表中。如果别名之间有空格,则:属性名 as '别名1 别名2',用两个引号(单引号、双引号都可以,但双引号在Oracle里边是不行的)引起来,这里的as好像也可以不用

3. 字段计算

select sal*12 (as) 名称 from 表名:其中sal是一个数值类型的字段,这里实际上就是sal*12,由于这一列没有名字,我们可以通过在后面写名称来给这一列加上名字,其中(as)可要可不要

4. 条件查询

4.1 and

select * from 表名 where sal>=10 and sal <= 20,通过where实现,后面写的是字段(属性)的条件,多个条件用and连接,或者用between...and...,如:where sal between 10 and 20

4.2 null

假如有的字段为null,想要查询为null/不为null的行,应写:select * from 表名 where is (not) null

4.3 or

select* from 表名 where job='某职业' or job='另一职业',表示选择job为某职业/另一职业的字段

4.4 and和or的优先级

and的优先级比or的优先级高,解决方案是在or的语句两侧加(),举例子:

想要查询deptno=10/20的,工作为manager的员工信息:

select * from emp where job='manager' and deptno=20 or deptno=10,这个句子会先查出job='manager' and deptno=20的人,再查deptno=10的人。而deptno=10的人中,有的人的job并不是manager,就会导致问题

将and语句和or语句顺序对调,同样会有问题,正确的方法是加括号:

select * from emp where job='manager' and (deptno=20 or deptno=10)

4.4 in 和 not in

select * from 表名 where 属性 (not) in (数值1/带引号的字段1, 数值2/带引号的字段2...)

4.5 模糊查询

select * from 表名 where 属性名 like 'xxxx',其中'xxxx'中,可以使用%表示任意长度的字符串,比如%s%表示包含有s的字符串

注意,如果想要查询带有下划线的,使用like '%_%'会有问题,因为似乎表中存的信息就带有这个_吧,为了避免这个问题,使用转义解决,即like '%\_%'

5. 排序

排序的关键字是order by

5.1 简单排序

select * from 表名 order by 字段名(属性名),将表的内容按照字段名或属性名升序排序(默认为升序排序),这句话等同于select * from 表名 order by 字段名(属性名) asc

若要降序排序,将asc替换成desc

5.2 两个字段排序

select * from 表名 order by 字段1名(属性1名),字段2名(属性2名) asc/desc,通过逗号隔开两个排序,也就是字段1按升序(或降序)排序后,字段1相等的,按照字段2升序(或降序)

select * from 表名 order by 字段1名(属性1名) asc/desc ,字段2名(属性2名) asc/desc

5.3 综合排序

where和order by同时使用:

select * from 表名 where 条件 order by 具体字段

6. 一些常用函数

6.1 大小写转换

lower(内容)可以实现将大写转换为小写,如:select lower(ename) from 表名,其中ename为属性名(字段名)

类似的,upper()是小写转大写

6.2 substr子字符串

substr(属性名,起始字节,截止字节),如:

select substr(ename, 1, 1) from emp,截取的是ename属性的内容,仅展示第一个字符串

从起始字节截取到末尾则需要使用到获取字段长度的length(属性名)函数,如:select substr(ename,2,length(ename)-1) from emp,即截取从第2个字符开始,到长度-1处的字符串

6.3 concat和rand

concat表示的是连接,例如select concat(ename,empno) from emp,则会将ename属性和empno属性的内容进行连接

rand表示的是随机生成随机数,如select rand() from emp,生成的随机数是DOUBLE类型的

7. 统计

max(属性名)表示找到该属性字段下所有内容的最大值

min(属性名)表示找到最小值

sum(属性名)表示统计该属性字段下所有内容的和

count(属性名)表示统计该属性字段下的数量

8. 执行循环

select * from emp where sal >= min(sal)的语句是会出错的,提示错误为:Invalid use of group function

语句的执行顺序为:where, group by, select, order by,统计函数在where中是基于group by的,没有group by会导致统计字段出问题。

9. 分组查询

9.1 基础分组查询

按照职员的job进行分组,来统计薪资:

select job, sum(sal) from emp group by job,表示的是按工作来分组统计总和

在上述语句中加上按部门薪资排序:

select job, sum(sal) from emp group by job order by sum(sal) desc

9.2 升级分组查询

找出每个部门不同岗位的最高薪资,存在两个分组:deptnojob,只需要在group by后使用逗号做区分即可

select dept,job,max(sal) from emp group by deptno,job order by max(sal)

9.3 having

根据deptno汇总每个部门的薪资,并排序,仅统计总薪资>9000的那些部门,若书写语句:

select sum(sal), deptno from emp where sum(sal) > 9000 group by deptno order by deptno

则会报错,原因是:先执行where,才执行group by,而在where语句中就已经出现了sum(sal),所以会报错

所以需要使用到having,having和where的性质类似,但必须与group by同时出现

select sum(sal), deptno from emp group by deptno having sum(sal)>9000 order by deptno

9.4 distinct去重

select distinct job from emp,表示去除job中的重复值,去重复的值,每个出现的值值保留一次

select distinct job, deptno from emp,表示对于job和deptno的组合,有很多不同的组合,去重复的组合

10. 多表查询

10.1 笛卡尔积

select ename, dname from emp,dept从emp表和dept表中查询ename和dname数据,这时候会出现的问题是,一个人会对应多个部门,所以会有问题。

此时就需要使用笛卡尔积,对于emp中每个职工对应的部门号,在dept中根据部门号查具体的部门名。

select ename, dname from emp, dept where emp.deptno=dept.deptno,通过where使得两个表的某个字段相等

10.2 内连接等值连接

select ename, dname from emp (inner) join dept on emp.deptno=dept.deptno,通过join...on...进行内连接等值连接

10.3 内连接非等值连接

emp表内有员工工资sale,工资等级(salgrade)内有(等级,最低值,最高值),想根据员工工资判断他们的所属等级,查询语句为:

select ename, grade from emp join salgrade on emp.sal between salgrade.losal and salgrade.hisal

通过between...and...获得员工的工资

10.4 内连接自连接

emp表内有empno和mgr(员工对应经理的empno),想通过表的自连接来查询每个员工对应的经理姓名,则:

select a.ename, b.ename from emp a join emp b on a.mgr = b.empno

10.5 外连接

10.4也可以通过外连接实现:

select a.ename as '员工名', b.ename as '领导名' from emp a (right) join emp b on a.mgr=b.empno,join前的()中可以填right/left,right以右边表为主,left以左边表为主。

这时候以右边的表为主,有一位员工没有更大的领导,其mgr为NULL,相当于NULL=b.empno,把每一个员工的查询都显示出来了,显示为空?有一点没想明白

所以这里的语句应该写left join以左边为主

10.6 三表查询

就是通过一些值什么的多表连接,连接emp,dept,salgrade三张表,查出员工名、员工部门名、员工工资等级

select e.ename, d.dname, s.sgrade from emp e join dept d on e.deptno=d.deptno join salgrade s on e.sal between s.losal and s.hisal

11. 子查询

11.1 where

想要选出所有工资比 工资最少的人 多的人的信息

这可能需要两条语句实现:

select min(sal) from emp -> 查出min(sal)是800

select ename, sal from emp where sal > 800实现目标

合并成一条语句就需要通过子查询实现:

select ename, sal from emp where sal > (select min(sal) from emp)

11.2 from

查询每个岗位平均工资的所属等级:

select t.job, t.avgsal, s.grade from (select job, avg(sal) as avgsal from emp group by job) t join salgrade s on t.avgsal between s.losal and s.hisal order by s.grade

12. union

select ename from emp where empno=7369
union
select ename from emp where empno=7499

union类似于求并集,会过滤掉相同记录

select * from emp union select * from emp等价于select * from emp

union all不会过滤相同记录

对于select * from emp union all select * from emp,得到的结果是将两个表查询的结果合并到一张表里,两个子查询的结果是一样的,但会将查询出来的两个表的内容放到一个表里边

MySQL中UNION语句用法详解与示例

13. limit

做一个限制,限制数据条数等,例如:select * from emp limit 8就得到表中的8条数据

或者select * from emp limit 0,5,0是起始位置,5是条数(长度),得到的是1-5名,如果limit 2,3就是3到5名

14. 表的创建与删除

表的创建如下:

create 表名(属性1 类型1,属性2 类型2,...
);

类型包括:字符串varchar(长度)int(长度)char(长度)等,类型还可以通过default 值来给默认值,如defalt 'm'

删除为:drop table 表名

加上if判断:drop table if exist 表名,表存在则删除,表不存在不删除,这样就不会因为表不在而出错

15. 增删改

15.1 增insert

插入语句为:

insert into 表名(属性1,属性2,...) values(值1,值2...)

注意:有多少个属性就要有多少个值

insert into 表名 values(值1,值2),不写属性的时候,默认值依次对应了表中的所有属性

15.2 改update

更改属性的语句为:

update 表名 set 字段名1=值1,字段名2=值2,...

也可以使用where指定更新的条件。值得注意的是这里不需要添加括号(和insert区别开来,不要弄混)

15.3 删除delete

删除语句为:

delete from 表名 where 条件

如果不写条件,则默认删除表中的所有语句

16. 约束

约束在建表时写明

16.1 非空约束not null

表示该字段属性不能为空,插入时为空则会报错

create 表名(属性1 类型1 not null,...
);

16.2 唯一性约束unique

表示该属性字段不能与现有的其他值重复,值在该字段下是唯一的

create 表名(属性1 类型1 unique,...
);

16.3 unique作为表级约束

create 表名(属性1 类型1,属性2 类型2,...unique (属性1, 属性2) 
);

表示要求(属性1,属性2)的值不可以重复

16.4 表约束unique和not null

create 表名(属性1 类型1 not null unique,属性2 类型2,...
);

实际上uniquenot null属性就代表的是主键,所以也可以直接用primary key指定

create 表名(属性1 类型1 not null unique,属性2 类型2,...primary key(属性1)
);

17. 主键自增

auto_increment表自增:

create 表名(属性1 类型1 primary key auto_increment,属性2 类型2,...
);

18. 外键

举个例子,假如有学生表和班级表,每个学生属于一个班级,但是如果这个班级在班级表中没有出现的话,就是不合理的,为此需要设置外键来约束学生的班级来源于班级表

假设有班级表:含有属性classno班级编号,name班级名

假设有学生表:含有属性name学生名,sno学生号,age年龄,班级编号classno,则建表时候通过foreign key来做外键:

create 表名{属性1 类型1 ,属性2 类型2,...foreign key(学生表的班级编号classno) references 班级表名(classno)

19. 事务开启

事务开启:start transaction

事务开启之后就不会自动提交,如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/810593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库系统工程师考试大纲

数据库系统工程师考试大纲主要包括以下几个方面的考试要求&#xff1a; 1.掌握计算机体系结构以及各主要部件的性能和基本工作原理。 2.掌握操作系统、程序设计语言的基础知识&#xff0c;了解编译程序的基本概念。 3.熟练掌握常用数据结构和常用算法。 4.熟悉软件工程和软件开…

15. 【Android教程】按钮 Button/ImageButton

在前面两章我们讲了 TextView&#xff0c;它是一个纯输出的控件&#xff1b;而 EditText 在 TextView 基础之上加入了简单的输入功能&#xff1b;今天要讲的 Button 是一个和用户互动感很强的控件&#xff0c;从今往后不再是单纯的文本展示&#xff0c;我们可以通过 TextView、…

蒙德冒险者的游戏

描述 蒙德城的一群冒险者计划进行一场特殊的表演以庆祝风神节。这场表演涉及到一项特别的挑战&#xff0c;即“冒险者塔”——一项测试冒险者们团队协作和个人承受能力的活动。 在“冒险者塔”表演中&#xff0c;参与者需要站在彼此的肩膀上&#xff0c;形成一个人类塔&#…

智能汽车领域检测实验室数智化转型

随着汽车制造行业自主研发能力的提高&#xff0c;当前的汽车企业实验室不仅需要进行种类繁多的试验项目&#xff0c;同时还需要将试验过程中的试验结果、试验过程、报告文档等一系列重要数据进行统一管理。为了提升实验数据的安全性及应用性&#xff0c;青软青之通过软硬件结合…

快速下载huggingface资源 (cli使用)

因为墙的原因&#xff0c;huggingface上的资源难以下载&#xff0c;通过本博客的方法不需翻墙也能快速下载。 本博客主要介绍&#xff1a; 1. 如何离线下载huggingface 资源 2. huggingface cli 的简单使用 安装 pip install -U "huggingface_hub[cli]" 配置 #…

for in 和 for of 的区别

1.for in 和 for of 都可以循环数组&#xff0c;for in 输出的是数组的 index 下标&#xff0c;而 for of 输出的是数组的每一项的值。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport…

Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_CraftWindow.cs using UnityEngine.UI; using TMPro; using UnityEngin…

动态规划在电商订单计算的例子

你在网上买了一堆商品,比如说,你买了2件T恤,每件10块,5件袜子,每双5块,还有1个帽子,8块钱。但是呢,商家有个促销活动,买得越多,单价就越便宜。比如,T恤买3件以上,每件就变成9块了。这时候,怎么算出你这一单的最少花费呢? 商品价格可能会因为购买数量的不同而有所…

重看Spring聚焦ApplicationContext分析

一、理解下ApplicationContext的设计 &#xff08;一&#xff09;功能性的理解 ApplicationContext 提供了一个轻量级、灵活、可扩展的容器&#xff0c;能帮助我们更加轻松地构建和管理复杂的应用程序&#xff0c;其通过依赖注入和控制反转等技术&#xff0c;降低了组件之间的…

SpringBoot 多数据源与事务管理:一站式解决方案

大纲 引言 在当今的软件开发中&#xff0c;随着业务的不断扩展和复杂化&#xff0c;许多应用程序都不再局限于单一的数据库&#xff0c;而是需要同时操作多个数据源以满足各种需求。SpringBoot作为一种快速开发框架&#xff0c;在处理单数据源的情况下表现出色&#xff0c;但…

【算法】统计英文字母出现的频率

题目 字母出现频率是指26英文个字母在文章中出现的频率。根据统计&#xff0c;在英语中最常出现的字母是e&#xff0c;大约占12~13%&#xff0c;出现最少的字母是z&#xff0c;不到0.1% &#xff0c;如下图所示&#xff08;统计结果来自wiki百科&#xff09; 字母出现频率的统…

三方库移植之NAPI开发(三)通过IDE开发NAPI工程

在三方库移植之NAPI开发[1]—Hello OpenHarmony NAPI一文中&#xff0c;笔者开发的是一个rom包的napi工程。该工程需要编译烧录固件&#xff0c;C 的动态库会集成到开发板的ROM中。在本篇文章中&#xff0c;笔者使用三方库移植之NAPI开发[1]—Hello OpenHarmony NAPI中一样的he…

VXWorks6.9 + Workbench3.3 开发环境部署

VxWorks系列传送门 一、安装包 有需要的朋友可以私信~ 二、安装 安装挺简单 1、先安装DVD-R147826.1-1-01-vx69.udf.iso 镜像中的Setup.exe程序&#xff0c;记住要使用管理员权限 2、再安装DVD-R147826.1-23-00.iso 镜像中的Setup.exe程序&#xff0c;同样要使用管理员权限 3…

基于大数据的汽车信息可视化分析预测与推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本项目通过集成网络爬虫技术&#xff0c;实时获取海量汽车数据&#xff1b;运用先进的ARIMA时序建模算法对数据进行深度挖掘和分析&#xff1b;结合flask web系统和echarts可视化工具&#xff0c;…

CF698B Fix a Tree 题解 贪心

Fix a Tree 传送门 A tree is an undirected connected graph without cycles. Let’s consider a rooted undirected tree with n n n vertices, numbered 1 1 1 through n n n . There are many ways to represent such a tree. One way is to create an array with n…

基于GitHub的开源讨论系统,赋予网站交互可能

Giscus&#xff1a;让每一条见解直达GitHub&#xff0c;用Giscus开启网站与社区的无缝对话新纪元&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 纯静态网站或博客&#xff0c;由于没有数据存储功能&#xff0c;经常借助第三方的评论系统以插件的方式集成进来&#x…

uniapp 编译后分包下静态图片404问题解决方案

如上图官方说明&#xff1a; 在分包下建立一个static文件夹即可&#xff1a; 分包内代码引用图片 <image src"/分包名称/img/图片名称"></image> <image src"/dataView/img/图片名称"></image>

图书整理 I 1、返回列表 2、头插法,返回链表 3、尾插法,返回链表

返回列表 class Solution:def reverseBookList(self, head: Optional[ListNode]) -> List[int]:li []while head:li.append(head.val)head head.nextreturn li[::-1]头插法&#xff0c;返回链表 class ListNode:def __init__(self, item):self.val itemself.next None…

Rust教程 – 学习天文图像的多尺度处理

最近&#xff0c;人们投入了大量精力开发新颖的图像处理技术。其中许多技术都源自于傅里叶和小波变换等数字信号处理方法。 这些技术不仅使得各种图像处理技术如降噪、锐化和动态范围扩展成为可能&#xff0c;而且还使得计算机视觉中使用的许多技术如边缘检测、目标检测等成为…

RobotFramework测试框架(7)-SeleniumLibrary常用关键字

浏览器操作 打开浏览器 Open Browser urlhttps://www.baidu.com browseredge关闭浏览器 Close Browser最大化浏览器 Maximize Browser Window设置浏览器宽高 Set Window Size 800 600刷新页面 Reload Page iframe操作 选中指定iframe Select Frame loc…