MySQL基础笔记(附实例代码)
多线程的笔记https://www.nowcoder.com/discuss/355081
原文地址:https://blog.csdn.net/qq_41112238/article/details/103400224
01
数据库的好处
实现数据持久化存储
使用完整的管理系统统一管理,易于查询
02
数据的相关概念
1.DB
数据库(database) 存储数据的仓库,保存了一系列有组织的数据。
2.DBMS
数据库管理系统(Database Management System)用于管理DB中的数据,数据库是通过DBMS创建和操作的容器。
常见的数据库管理系统:MySQL、Oracle、 DB2、 SQL server。
3.SQL
结构化查询语言(Structure Query Language):专门用来与数据库通信的语言。
特点:①不是某个特定数据库供应商专有的语言,几乎所有DBMS都支持SQL。②简单易学。③灵活使用可以进行非常复杂和高级的数据库操作。
03
数据库存储数据特点
4.将数据放到表中,表再放到库中。
5.一个数据库可以有多个表,每个表都有一个唯一的表名用来标识自己。
6.表具有一些特性,这些特性定义了数据在表中如何存储,类似Java中的类。
7.表由列组成,也称字段。每个表都由一或多个列组成,类似Java中的属性。
8.表中的数据是按行存储的,每一行类似于Java中的对象。
4
MySQL
优点
成本低,开源,一般可***
性能高,执行很快
简单,易于安装和使用
DBMS的分类*:
基于共享文件系统的DBMS(access)
基于C/S的DBMS(MySQL,Oracle,SQL server)(一般安装的是服务端)
配置*
mysql安装目录中的my.ini中是mysql的配置文件[mysql]配置的是客户端
[mysqld]配置的是服务器端
port设置端口,默认为3306
datadir是数据目录
basedir是安装目录
character-set-server设置字符集
default-storage-engine设置默认数据库引擎
改完配置后需要重启服务
5
MySQL服务的启动和停止
第一种方式,右键计算机->管理->服务和应用程序->服务->找到MySQL
第二种方式,cmd打开命令行窗口
6
MySQL的登录/退出
方式一:通过MySQL自带客户端 只限于root用户(现在系统变量Path配置MySQL)
方式二:命令行窗口
登陆*:mysql [-h localhost] [-P 3306] -u root -p([...]代表可选,连接本机可省略)
退出*:exit
7
MySQL常用命令
需要登陆后使用:
8
MySQL的语法规范
不区分大小写,建议关键字大写,表名和列名小写。
每条命令用\g或;结尾,建议用;结尾。
根据命令需要,可以进行缩进或换行。
注释:
9.DQL Data Query Language
1
进阶1 :基础查询
语法:select 查询列表 from 表名;
查询列表可以是:表中的字段、常量、表达式、函数
查询的结果是一个虚拟的表格
1.查询表中的单个字段
例:select last_name from employees;
2. 查询表中的多个字段
例:select last_name,salary from employees;
3. 查询表中的所有字段
例: select * from 表名;
4. 查询常量值
例:select 100;/ select ‘john’;
5. 查询表达式
例:select 100*98;
6. 查询函数
例:select version();
7. 起别名
好处:便于理解、如果要查询的字段有重名情况,使用别名区分
用AS:select 10098 *as** 结果;
省略AS:select last_name 姓;
别名中有关键字,加引号,例:select salary as 'out put' from employees;
8. 去重
例:查询员工表中所有部门编号select DISTINCT department_id from employees;
9. +号的作用
仅有一个功能,运算符。
如要拼接,使用concat()。
如concat中有某列存在null值,结果为null。
可使用IFNULL(列名,为null时默认值),不为null时返回原本值。ISNULL 判断结果,为true返回1,false返回0。
进阶2 :条件查询
语法: select 查询列表 from 表名 where 筛选条件
分类:
1.按条件表达式筛选
条件运算符:大于> 小于< 等于= 不等于<> !=大于等于>= 小于等于<=。
2.按逻辑运算符筛选
逻辑运算符:
与:&& and 如果两个条件都为true则为true,否则为false。
或:|| or 如果有一个条件为true则为true,否则为false。
非:!not 取反。
3.模糊查询like
一般和通配符搭配使用 %:0或多个字符 _任意单个字符。
可判断字符型或数值型例:查询员工名包含a的信息。
例:查询员工名包含a的信息
例:查询员工名第三个字符为a第五个为b的信息
例:查询员工名第二个字符为_的信息
between and
可提高语句的简洁度,包含边界值,不能颠倒。
例:查询工资在8000到9000之间的员工信息
in
用于判断某字段的值是否属于in列表中的某一项,提高语句简洁度,in列表的值类型必须一致或兼容,不能包含通配符。
例:查询员工编号1,2,3中的一个的员工信息
is null
例:查询没有奖金的员工名
为空用IS NULL 不为空用IS NOT NULL不能用=或!=<=>
安全等于,除普通数值,还可用于判断null值。可读性差。
进阶3 :排序查询
语法:
select 查询列表 from 表 where 筛选条件 order by 排序列表 [asc/desc]
默认为asc升序。
一般放在查询语句的最后面,limit语句除外。
别名排序:
例:按员工年薪排序
函数排序:
例:按员工姓名长度排序
多字段排序:
例:先按工资再按编号排序
进阶4 :常见函数
好处:提高重用性、隐藏实现细节
调用:select 函数名(实参列表) from 表名
分类:单行函数*,如concat、length、ifnull等
1.字符函数*
①length(str) 获取str的字节个数 一个汉字占3字节(utf8)
②concat(str1,str2...strn) 拼接字符串
③upper(str)、lower(str) 转换大小写
④substr、substring返回子字符串,SQL中索引从1开始
substr(str,n) 截取从n开始的所有字符
substr(str,n,m) 截取从n开始的m个字符
⑤instr(str,substr) ,返回substr在str中第一次出现的索引,没有返回0。
⑥trim(str),去掉字符串中空格。
trim(x from str),去掉str前后的x字符。
⑦lpad(str,n,c) 左填充,用指定字符c填充str左侧至n长度。
2.数学函数*
①round(x) 四舍五入
②ceil(x) 向上取整,返回大于等于参数的最小整数
③floor(x) 向下取整,返回小于等于参数的最大整数
④truncate(n,m) 截断n,保留m位
⑤mod(a,b) 取余
⑥rand() 获取0-1之间的随机数
3.日期函数*
①now() 返回当前系统日期+时间
②curdate() 返回当前日期
③curtime() 返回当前时间
④year(),month(),day(),hour(),minute(),second() 获取年月日时分秒
⑤str_to_date() 将日期格式的字符转换成指定格式的字符串
⑥date_format() 将日期转换成字符
⑦datediff()返回两日期相差的天数
4.其他函数*
①version() 版本号
②databases() 查看所有数据库
③user() 当前用户
④password(str) 返回加密形式(MySQL8已弃用)
⑤md5(str) 返回字符串的md5模式
5.流程控制函数*
①if (exp1,exp2,exp3) 若exp1为true,返回exp2,否则返回exp3
②case
用法一:
case 要判断的字段或表达式
when 常量1 then 要显示的值 或 语句1;
...
when 常量n then 要显示的值 或 语句n;
else 要显示的值或语句m
end
用法二:
case
when 条件1 then 要显示的值或语句1;
when 条件n then 要显示的值 或 语句n;
else 要显示的值或语句m end
分组函数,做统计使用,又称统计函数或聚合函数
①sum()** 求和
②avg() 求平均值
③min() 求最小值
④max() 求最大值
⑤count() 求非空个数
count()/count(常量值) 统计总行数
MYISAM存储引擎下,count(*)效率高,INNODB下差不多。
sum和avg对数值型处理,min和max可对字符型和日期型排序。
所有分组函数都忽略null值,可和distinct搭配使用和分组函数一同查询的字段要求是group by后的字段。
进阶5 :分组查询
语法:
特点:
分组前筛选 数据源为原始表 用where
分组后筛选 数据源为分组后结果集 用having
分组函数做条件肯定放在having子句中
能用分组前筛选的优先考虑分组前筛选group by支持单个字段,多个字段(用,隔开),表达式或函数分组,也可以添加排序(放在最后)。
进阶6 :连接查询
又称多表查询,当查询的字段来自多个表时,会用到连接查询
笛卡尔乘积:查询多个表时没有添加有效的连接条件,导致多个表出现完全连接。如表1有a行,表2有b行,将产生ab行结果。
避免:添加*连接条件**
分类*:
按年代:sql92(仅支持内连)、sql99(支持内连接、左外连接、交叉连接)
按功能:内连接(等值,非等值,自然) 外连接(左,右,全) 交叉连接
1.sql92 等值连接*
例:查询员工名和对应部门名
注意:为表起别名后,不能使用原表名。
2.sql92 非等值连接
where后跟非等值连接条件
3.sql92 自然连接
把一张表通过别名当多表使用
4.sql99语法
语法:
内连接:inner 可以省略
1.等值连接
和sql92的等值连接效果一样
2.非等值连接
3.自然连接
例:查询员工及对应上级名
外连接:
用于查询一个表中有,另一个表中没有的记录
特点:外连接查询的结果为主表中的所有记录,如果从表有和他匹配的则显示匹配的值,若没有则显示null。外连接查询结果=内连接结果+主表有而从表没有的记录。
左外连接中left左边的是主表,右外连接right右边的是主表。左外和右外交换顺序,可实现同样的效果。
左外连接:left 【outer】
例:查询哪个部门没有员工
右外连接:right【outer】
**
交叉连接:cross【outer】
两个表进行笛卡尔乘积
全外连接:full【outer】
等于内连接的结果+表1中有表2中没有的+表2中有但表1中没有的
5.sql92和sql99比较
功能:sql99支持较多可读性:sql99实现连接条件和筛选条件的分离
01
02
进阶7 :子查询
含义*:出现在其他语句中的select语句,称为子查询或内查询,外部的查询语句,称为主查询或外查询。
分类*:
按子查询出现的位置*:
1.select后面* 仅支持标量子查询
案例:查询每个部门的员工个数
2.from后面 支持表子查询
案例:查询每个部门的平均工资的工资等级
将子查询结果充当一张表,要求必须起别名
3.where或having后面 ⭐
特点:子查询都放在小括号内、子查询放在条件右侧、标量子查询搭配单行操作符(>, =, <=, =, <>)、列子查询搭配多行操作符(in/not in,any/some,all)、子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果。
①支持标量子查询(单行)
案例:谁的工资比abel高?
②列子查询(多行)
案例:查询其他部门比it_prog部门任意工资低的员工名,工作类别和工资。
③行子查询(少)
案例:查询员工编号最小并且工资最高的员工信息
4.exists后面(相关子查询)
支持表子查询
结果为1或0,1表示存在结果,0表示不存在。
案例:查询没有女朋友的男人。 SELECT * FROM boys bo WHERE NOT EXISTS(SELECT * FROM beauty b WHERE b.boyfriend_id=bo.id)按功能不同: 标量子查询(结果集只有一行一列) 列子查询(结果集只有一列多行) 行子查询(结果集有一行多列) 表子查询(结果集,一般多行多列)
进阶8 :分页查询
应用场景:当要显示的数据一页显示不全,需要分页提交sql请求。
特点:limit语句放在查询语句的最后。
公式*:要显示的页数page,每页的条目数size
语法:
offset:要显示条目的索引 从0开始。
size:要显示的条目个数。
案例:查询前5条员工信息。SELECT * FROM employees LIMIT 0,5
案例:查询有奖金的员工信息,并显示工资较高的前10名。
查询涉及的关键字 ----------执行顺序
select* 查询列表 ------------------⑦
from* 表 -----------------------------①
连接类型* join 表2-----------------②
on* 连接条件-------------------------③
where* 筛选条件--------------------④
group by* 分组列表----------------⑤
having* 分组后筛选----------------⑥
order by* 排序列表-----------------⑧
limit* 偏移,条目数 ----------------⑨
进阶9 :联合查询
将多条查询语句的结果合并成一个结果
语法:查询语句1 union 查询语句2 ...*
应用场景:当要查询的结果来自多表且多表间无直接连接关系。
特点:
①要求多条查询语句的查询列数一致。
②要求多条查询语句查询的每一列的类型和顺序最好一致。
③默认去重,使用union all可以包含重复项。
④将一条比较复杂的查询语句拆分成多条。
10
DML Data Manipulation Language
插入语句
语法*:
方式一*:insert into 表名(字段...) values (值...)
1.要求插入值得类型必须与列得类型一致或兼容。
2.不为null的列必须插入值,可为null的列可以插入null或同时省略字段和值。
3.省略插入列名默认所有列,而且列的顺序和表的顺序一致。
方式二*:insert into 表名 set 插入列名 = 值...
比较*:方式一支持插入多行、方式一支持子查询
修改语句
修改单表的记录*⭐:update 表名 set 列 = 新值,... where 筛选条件
修改多表的记录*:
删除语句
方式一*:
语法*:
单表的删除*⭐delete from 表名 where 筛选条件
多表的删除*
方式二:
语法:truncate table 表名,整个表全部删除
区别:
①delete 可以加where条件
②truncate效率较高
③如果要删除的表中有自增长列,如果用delete删除后再插入数据,值从断点开始,而truncate删除后再插入数据,值从1开始。
④truncate删除没有返回值,delete有。⑤truncate不能回滚,delete可以。
11
DDL Data Define Language
数据定义语言,涉及库和表的管理
创建:create 修改:alter 删除:drop
1
库的管理
创建:
修改:
删除:
2
表的管理
创建:*
修改:
①修改列名
②修改列的类型或约束
③添加列
④删除列
⑤修改表名
删除:
3
表的复制
仅复制表的结构*
仅复制表的部分结构
复制表的结构+数据
复制表部分数据
4
常见的数据类型
一 . 数值型:整形:默认有符号 设置无符号用unsigned 零填充zerofill(默认无符号);如果插入值超过范围,报警告并插入临界值;长度代表了显示的最大宽度,不够会0填充(需要搭配zerofill)。
小数:m表示整数加小数部位的总长度,d表示小数点后保留位数,超过范围显示临界值,可省略,省略时dec的m默认10,d默认0。
浮点型:float(m,d) double(m,d)
定点型:精度较高,如要求插入数值精度较高如货币运算考虑浮点型。dec(m,d)
二 . 字符型:
较短的文本:用来保存MySQL中较短的字符串 M为最大字符数;char(M) 固定长度字符 M为0-255整数 M可省略,默认1;varchar(M) 可变长度字符 M为0-65535整数 M不可省略。
区别:char比较耗费空间,但效率较高。如存储固定属性时可用char。
其他:binary和var binary用于保存较短二进制;enum 保存枚举,不区分大小写 插入失败为空;set 保存集合,和enum类似,区别为可选多个;较长的文本:text、blob(较长的二进制数据)
三 . 日期型:
date只保存日期
time只保存时间
year只保存年
datetime和timestamp保存日期+时间
datetime和timestamp区别:
1 timestamp支持范围较小。
2 timestamp 和实际时区有关,受MySQL版本和SQLMode影响大。
3 datetime 8字节 范围1000-9999 4 timestamp 4字节 范围 1970-2038。
5
常见约束
含义*:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性。
添加约束的时机:创建表时、修改表时。
添加分类*:
1 列级约束*
直接在字段名和类型后面追加约束类型,只支持默认、非空、主键、唯一,不可起名。
2 表级约束*
在各个字段最下面 [constraint 约束名] 约束类型(字段名),支持主键、唯一、外键,可起名。
分类*:
- 1* NOT NULL 非空约束 保证该字段的值不为空。
- 2* DEFAULT 默认约束 用于保证该字段有默认值。
- 3* PRIMARY KEY 主键约束 用于保证该字段值具有唯一性,并且非空。
- 4* UNIQUE 唯一约束 保证该字段值唯一,但可为空。
主键和唯一键的区别*:
①都可以保证唯一性②主键不允许为空,唯一允许为空(只能插入一个null)③一个表中至多一个主键,唯一键可以有多个④都可以组合使用(不推荐)。
- 5* CHECK 检查约束 MySQL中不支持。
- 6* FOREIGN KEY 外键约束,限制两个表的关系,保证该字段必须来自于主表关联列的值,在从表添加外键约束,用于引用主表中某列的值。
外键的特点*:
①要求在从表设置外键关系②从表的外键列类型和主表的关联列类型要求一致或兼容,名称无要求③主表的关联列必须是一个key(一般是主键)④要求插入数据时,先插入主表,再插入从表,删除数据时,先删除从表,再删除主表。
修改表时添加约束*:
修改表时删除约束:
标识列: 又称自增长列,含义:可以不用手动插入值,系统提供默认的序列值特点:①必须和key搭配②一个表中至多有一个标识列③类型只能是数值型④可通过set auto_increment_increment设置步长。
12
TCL Transaction Control Language
事务:
一条或多条sql语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。
存储引擎:
概念:MySQL中数据用各种不同技术存储在文件(或内存)中。
通过show engines查看mysql支持的存储引擎,在MySQL中用的最多的存储引擎有:innodb、myisam、memory等,innodb支持事务,其余不支持。
事务的属性ACID
①原子性Atomicity
指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
②一致性Consistency
事务必须使事务从一个一致性状态变换到另一个一致性状态。
③隔离性Isolation
指一个事务的执行不能被其他事务干扰,即一个事物内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
④持久性Durability
指一个事务一旦被提交,它对数据库中数据的改变是永久性的。
事务的使用:
隐式事务:事务没有明显的开启和结束的标记,如insert、update、delete语句。
显式事务:事务具有明显的开启和结束的标记,前提:必须先设置自动提交功能为关,set autocommit=0。
delete和truncate在事务使用时的区别:
delete可成功回滚,truncate回滚后表仍删除。
隔离级别:
脏读*:对于两个事务T1和T2,T1读取了已被T2 更新但还没有提交 的字段,之后若T2回滚,T1读取的内容是临时且无效的。
不可重复读*:T1读取了一个字段,T2 更新该字段并提交 ,T1再次读取同一字段,值不同。
幻读*:T1读取了一个字段,T2在该表中插入了一些新行,之后T1再读取同一个表会多出几行。
Oracle支持两个隔离级别:读已提交、可串行化。
MySQL支持四个隔离级别:读未提交(存在脏读、不可重复读、幻读)、读已提交(解决脏读)、可重复读(默认,解决脏读,不可重复读)、可串行化(解决所有并发问题,但效率较低)
13
视图
含义:虚拟表,和普通的表一样使用,MySQL5.0.1出现的新特性,是通过表动态生成的数据,只保存sql逻辑,不保存查询结果。
应用场景:多个地方用到同样的查询结果、该查询结果的sql语句较复杂。
好处:重用sql语句,简化复杂sql操作,保护数据提高安全性。
-创建视图create view 视图名 as 查询语句-修改视图
具备以下特点的视图不允许更改:
①包含:分组函数 distinct group by、having、union、union all、join
②常量视图
③select包含子查询、from后跟不能更新的视图、where字句的子查询引用了from字句中的表
-删除视图drop view 视图名...-查看视图
desc 视图名;
show create view 视图名;
- 视图和表的区别
视图创建用create view,基本不占用实际物理空间,只是保存sql逻辑,一般不能增删改 表创建用create table,占用实际物理空间,保存了具体数据。
14
变量
系统变量
变量由系统提供,不用自定义
查看所有系统变量:show global | [session] variables;
查看满足条件的部分系统变量:show global | [session] variables like 条件;
查看某个指定系统变量:select @@global | [session] .系统变量名
为系统变量赋值:set @@global | [session] .系统变量名 = 值;
不写默认为session
①全局变量
服务器层面,必须拥有super权限才能为系统变量赋值。
作用域:服务器每次启动为所有全局变量赋初始值,针对所有会话有效,不能跨重启。
②会话变量
服务器为每一个连接的客户端都提供了系统变量作用域:仅针对当前会话(连接)有效。
自定义变量
声明
赋值
使用(查看,比较,运算)
①用户变量
作用域:针对当前会话(连接)有效应用在任何地方。
②局部变量
作用域:仅在定义它的begin end中有效,应用在begin end中的第一句话。
15
存储过程和函数
存储过程
含义:一组预先编译好的sql语句的集合
好处:减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率。
创建*
注意:参数列表包括参数模式 参数名 参数类型。
1.参数模式:
IN 代表参数可以作为输入,该参数需要调用方传入值 IN可省略。
OUT 该参数可以作为输出,可以作为返回值。
INOUT 该参数既可以作为输入,又可以作为输出。
2.如果存储过程里仅有一句话,可以省略begin end 。
3.存储过程体的每条语句用;结尾,存储过程的结尾可以使用delimiter重设。
调用
call 存储过程名(实参列表)
删除
一次只能删除一条DROP PROCEDURE 存储过程名;
查看存储过程的信息show create procedure 存储过程名;
函数
含义和存储过程类似,区别为函数必须有且仅有一个返回值。
存储过程适合批量插入。
函数适合处理数据后返回一个结果。
创建*
参数列表包括参数名和参数类型;
函数体必须有return语句,当函数体中仅有一句话时可以省略begin,end;
使用delimiter设置结束标记。
调用
select 函数名(参数列表)
查看show create function 函数名删除drop function 函数名
16
流程控制结构
1
顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条执行
1 if函数* 能实现简单的双分支语法:select if(表达式1,表达式2,表达式3)
如果表达式1成立,则返回表达式2的值,否则返回表达式3的值。应用:任何地方
2 case结构*
3 if结构
实现多重分支
语法:
循环结构:程序在满足一定条件的基础上重复执行一段代码。只能放在begin end中*
分类:while、loop、repeat
循环控制:iterate 类似于continue 结束本次循环,继续下一次;leave 类似于break,结束当前所在循环
三种循环的区别:
1.while 先判断后执行
2.repeat 先执行后判断
3.loop 没有条件的死循环
来源
牛客网
排版:传媒部