MySQL基础知识
一、MySQL安装
MySQL的下载
http://dev.mysql.com/downloads/mysql/
MySQL版本选择
MySQL功能自定义选择安装
1.功能自定义选择
2.路径自定义选择
3.设置root用户密码
4.安装完成,点击MySQL Workbench 6.3 CE进入MySQL客户端
二、SQL基础
SQL语句分类
1.DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括create/drop/alter
2.DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性。常用的语句关键字主要包括 insert/delete/update/select等
3.DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant/revoke等
DDL语句(涉及表的定义、结构的修改)
一、create语句
- Query Ok代表语句执行成功
- 1 row affected代表数据库一行收到影响
- 0.01 sec代表操作执行的时间
create table student(
SID int not null auto_increment,
sNo int ,
sName varchar(50) not null,
primary key(SID)
);
1.查看系统中都存在哪些数据库(show databases;)
2.在查看系统中已有的数据库后,可以用(use dbname)选择对应的数据库
3.在选择对应的数据库后,查询该数据库下面的所有的表(show tables)
二、删除数据库
删除数据库的语法:drop databse dbname;
三、创建表
语法:create table tablename(column_name_1 column_type_1 constraints,column_name_2 column_type2 constrationts)
- mysql的表名是以目录形式存储在磁盘上,表名的字符可以是任何目录名允许的字符。
- column_name是列名
- column_type是列的数据类型
- constrationts是列的约束条件
- 查看表定义:desc tablename
- 查看创建表的SQL语句:show create table tablename
四、删除表
删除表的语法:drop table tablename;
五、修改表
aleter 语法 | 说明 |
---|---|
alter table tablename modify columnname newColumnType | 修改表字段的类型(modify 不能更改字段名称) |
alter table tablename add newColumnname newColumnType | 增加表字段 |
alter table tablename drop oldCloumnname | 删除表字段 |
alter table tablename change oldColumname newColumnname newColumntype | 修改字段的名称及类型 |
alter table tablename rename (to) newtablename | 修改表名称 |
- 修改字段的排列顺序
在alter的语法后面都有[first\after columnname]可选项
alter table user add address varchar(20) first ;
alter table user add age int after name ;
DML(对数据库表记录进行操作,增(insert)删(delete)改(update)查(select))
1.insert语句
语法:
插入一条:insert into tablename(columnname1,columnname2...)values(val1,val2...);
插入多条:insert into tablename(columnname1,columnname2...)values(val1,val2...),(val1,val2...);
2.update语句
语法:update tablename set columnname=value [where condition]
如果使用MySQL Workbench,update语句不加where条件的会执行错误,需要如下图设置取消设置:
3.delete语句
语法:**delete from ** tablename where condition
4.select语句
语法:select * from tablename [where condition]
select 查询相关的 | 说明 |
---|---|
select distinct name from user; | 查询不重复记录 |
select * from user where id=1; | 条件查询 |
select * from user order by id desc | 排序(desc倒序、asc正序) |
select * from user order by id desc limit 0,2 | 根据id进行倒序,0代表从第一个开始,2代表查询出来的个数 select ...[limit offset_start,row_count] |
select count(1) from user | 聚合函数count(),其他的还有sum()/max()/min() |
group by | 表示要进行分类聚合select name,count(1) from user group by name |
having | 表示对分类后的结果再进行条件过滤 select name,count(1) from user group by name having count(1)>2 |
5.表连接
1.内连接(仅选出两张表中互相匹配的数据)
select cno,cname,sname from student inner join course on cno=sno;
select cno,cname,sname from student,course where cno=sno;
2.外连接
外连接又区分:
左连接(left join):包含左边表的所有记录,右边没有的为Null
右连接(right join):包含右边表的所有记录,左边没有的为null
6.子查询
子查询关键字 | 说明 |
---|---|
in | 存在 |
not in | 不存在 |
= | 等于 |
!= | 不等于 |
exists | 存在 |
not exists | 不存在 |
7.记录联合
语法:
1.select * from t1 union all select * from t2;
2.select * from t1 union select * from t2;
union all与union的区别:
union all是把结果集直接合并在一起,而union是将union all后的结果进行一次distinct,去除重复后的结果
DCL语句(DCL语句主要是dba用来管理系统中的对象权限)
grant与revoke
三、MySQL支持的数据类型
数值类型
常用的数值类型 | 字节 | 说明 |
---|---|---|
int | 4 | 有个额外的额属性Auto_Increment |
bigint | 8 | |
float | 4 | |
double | 8 | |
decimal(M,D) | M+2 | M代表精度,D代表标度 |
MySQL支持类型后面的小括号指定显示宽度,例如:int(5)表示当数值宽度小于5的时候在数字前面填满宽度,如果不显示指定宽度则默认为int(11)。如果插入的数据大于这个数值宽度,对实际的插入值是没有影响的,是按照int类型的实际大小进行的。
create table valuetype(
age int,
age1 int
)
insert into valuetype(age,age1)values(1,2);//这时候数据库就显示1
alter table valuetype modify age int zerofill;//这时候数据库就显示'0000000001'
位类型 | 说明 |
---|---|
bit(M) | 位类型最小1,最大64 |
create table test(pwd bit(64))
数据插入bit类型字段时,首先转换为二进制,如果位数允许,将插入成功,如果位数小于实际的位置,则插入失败。
日期时间类型
日期类型 | 说明 |
---|---|
date | 表示年月日 |
datetime | 表示年月日时分秒 |
time | 表示时分秒 |
timestamp | 时间戳(1970-2038) |
year | 年份(1901-2155) |
mysql里面获取当前时间为now().mssql获取当前时间为getdate()
timestamp,支持的范围非常小,从1970-2038年,timestamp受时区的影响
create table timestamptest(
tp timestamp)
系统会自动给tp赋予默认值current_timestamp(系统日期),但是mysql只给第一个timestamp设置默认值,如果有第二个timestamp类型,则默认值设置为0
字符串类型
常用字符串类型 | 说明 |
---|---|
char(M) | M为0-255之间的整数 |
varchar(M) | M为0-65535之间的整数,值长度+1个字节 |
text | 允许0-65535字节,值长度+2字节 |
char与varchar类型的区别:
char列最后的空格已经删除,而varchar保留空格
四、MySQL中运算符
算术运算符
运算符 | 说明 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/,DIV | 除法,返回商 |
%,MOD | 除法, |
比较运算符,满足返回1,否则返回0
运算符 | 说明 |
---|---|
= | 等于 |
<>,!= | 不等于 |
<=> | null安全的等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between | 存在于指定范围 |
in | 存在于指定集合 |
is null | 为null |
is not null | 不为null |
like | 通配符匹配 |
regexp,rlike | 正则表达式 |
逻辑运算符(布尔运算符)
运算符 | 说明 |
---|---|
NOT,! | 逻辑非 |
AND,&& | 逻辑与 |
OR | 逻辑或 |
XOR | 逻辑异或 |
位运算符
运算符 | 说明 |
---|---|
& | 位与 |
位或 | |
^ | 位异或 |
~ | 位取反 |
>> | 位右移 |
<< | 位左移 |
运算符优先级
大多情况下使用()进行操作
五、常用函数
字符串函数
函数 | 说明 |
---|---|
concat(s1,s2,...,sn) | 连接s1,s2,...sn为一个字符串 |
insert(str,x,y,instr) | 将字符串str从第x位置,y个字符串长的子串替换为字符串instr |
lower(str) | 将字符串str中所有字符变为小写 |
upper(str) | 将字符串str中所有字符变为大写 |
left(str,x) | 返回字符串str最左边的x个字符 |
right(str,x) | 返回字符串str最右边的x个字符 |
lpad(str,n,pad) | 用字符串pad对str最左边进行填充,直到长度为n个字符长度 |
rpad(str,n,pad) | 用字符串pad对str最右边进行填充,直到长度为n个字符长度 |
ltrim(str) | 去掉字符串str左侧的空格 |
rtrim(str) | 去掉字符串str行尾的空格 |
repeat(str,x) | 返回str重复x次的结果 |
replace(str,a,b) | 用字符串b替换字符串str中所有出现的字符串a |
strcmp(s1,s2) | 比较字符串s1,s2 |
trim(str) | 去掉字符串行尾和行头的空格 |
substring(str,x,y) | 返回字符串str x位置起y个字符串长度的字符串 |
数值函数
函数 | 说明 |
---|---|
ABS(x) | 返回x的绝对值 |
ceil(x) | 返回大于x的最小整数值。MSSQL则为ceiling。ceil(1.2)返回2 |
floor(x) | 返回小于x的最大整数值。floor(1.2)则返回1 |
mod(x,y) | 返回x/y的模,取余 |
rand() | 返回0~1内的随机数 |
round(x,y) | 返回参数x的四舍五入的有y为小数的值,select round(1.211,2),返回1.21;select round(1.25,1) 返回1.3 |
truncate(x,y) | 返回数字x截断为y位小数的结果.select round(1.25,1)返回1.2 |
日期和时间函数
函数 | 说明 |
---|---|
curdate() | 返回当前日期。select curdate().2016-08-13 |
curtime() | 返回当前时间 |
now() | 返回当前的日期和时间 |
week(date) | 返回date为一年中的第几周 |
year(date) | 返回日期date的年份 |
date_format(date,fmt) | 返回按字符串fmt格式化日期的date值.fmt的格式化有%M(月),%D(日),%Y(年) |
datediff(date1,date2) | 返回起始时间和结束时间之间的天数 |
data_add(date,interval expr type) | 返回与所给日期相差interval时间段的日期 |
流程函数
函数 | 说明 |
---|---|
if(value,t,f) | 如果value为真,返回t,否则返回f |
ifnull(value1,value2) | 如果value1不为空,返回value1,否则返回value2.select ifnull(2,'woc'),返回2 |
case when value1 then result1 ..else default end | 如果value1是真,则返回result1,返回返回default |
case expr when value1 then result1.. else default end | 如果表达式expr等于value1,则返回result,否则返回default |
其他函数
函数 | 说明 |
---|---|
database() | 返回当前数据库名称 |
password(str) | 返回字符串str的加密版本 |
md5(str) | 返回字符串str的md5值 |
六、选择合适的数据类型
char与varchar
在Innodb存储引擎中,建议使用varchar类型。对于Innodb数据表,内部的行存储格式没有区分固定长度和可变长度列,因此固定长度列的性能不一定比不可变长度的性能好。
Text与blob
一般在保存少量字符串的时候,我们会选择char或者varchar,而在保存较大文本的时候,通常会选择使用text或者blob。两者的区别:text只能保存字符数据,比如日志。blob能保存二进制数据,比如照片。
浮点数与定点数
在MySQL中,decimal或者(numberic)用来表示定点数
日期类型的选择
date/time/datetime/timestamp
七、索引的设计和使用
索引概述
索引是数据库中用来提高性能的最常用工具。在MySQL中,MyISAM与Innodb存储引擎的表默认创建的都是Btree索引。
1.索引的创建
create table indexTest(
id int not null auto_increment,
memberid int not null,
createtime datetime not null default current_timestamp,
primary key (id)
)
alter table indextest add orderserial varchar(50) not null;
create unique index IX_orderserial on indexTest(orderserial);
insert into indextest (memberid,createtime,orderserial)values(112123,'2016-08-14','sz121213')
说明:上面创建一个表,其中定义orderserial为唯一索引。
语法:create [unique\fulltext\spatial] index index_name on tablename(columname)
2.设计索引的原则
- 最合适的索引列是出现在where子句中列,或连接子句中指定的列,而不是出现在select关键字后面的选择列表的列
- 使用唯一索引,需要考虑列中某个值得分布,如果索引列种的基数越大,则索引的效果越好。举个例子:订单号就可以设置唯一索引,因为订单号的不一样。而对于rowstatus就无须了,因为rowstatus要么是有效要么是无效。这样的筛选出的范围还是很多,没有意义
- 不要过度索引。因为所有也要占用额外的磁盘空间,如果一个索引很少使用,那么会不必要的减缓表的修改速度
显示MySQL的执行计划:explain 后面加mysql语句
八、视图
视图(View)
定义:视图是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的,视图并不是在数据库中实际存在。
优势:
- 简单,用户完全不需要关心后面对应的表的结构/关联条件和筛选条件。对用户来说已经是过滤好的符合条件的结果集
- 安全,使用视图的用户只能访问他们被允许查询的结果集
- 数据独立,一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响。
语法:
create or replace view index_view as
select * from indextest
- 创建create [or replace] **view **viewName as select ...
- 查询 select * from 视图名称
- 展示视图 show tables;
- 删除视图 drop view viewname
九、存储过程和函数
存储过程(store procedure)和函数
存储过程和函数是事先经过编译并存在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的
语法:
create database finance;//创建finance数据库
use finance;
create table orders(
orderId bigint not null auto_increment,
memberId int not null default 0,
serialNumber varchar(50) not null default '',
amount decimal(18,2) not null default 0,
createTime datetime not null default current_timestamp,
primary key (orderid)
)//创建orders订单表
insert into orders (memberId,serialNumber,amount) values(6561121,'sz12234222',5),(233444,'ys1652233',10)//插入测试数据
delimiter &
create procedure orders_serial(in serial varchar(50))
reads sql data
begin
select * from orders
where serialNumber=serial;
end &
注释:delimiter $$命令就是将语句的结束符从分号;修改成其他符号,这里指的是$$为结尾。这样在number后面的分号就不会认为结束。
调用存储过程
call orders_serial('sz12234222')
存储过程的好处
逻辑封装在数据库端,调用者不需要了解中间的处理逻辑,一旦调用逻辑发生变化,只需要修改存储过程即可,而对调用者的程序完全没有影响。
删除存储过程
drop procedure if exists orders_serial
//if exists可选
查看存储过程状态
show procedure status like 'orders_serial'
查询存储过程的定义
show create procedure orders_serial
存储过程变量的使用
存储过程可以使用变量,并且在MySQL5.1版本后,不区分大小写
变量的定义
declare currentTime date;
变量的作用域只能在begin...end块中,可以嵌套在块中
变量的赋值
set currentTime=now();//直接赋值
select x into currentTime from x;//也可以通过sql语句进行赋值
定义条件和处理
declare handler_type handler for contidtion_value
handler_type:
- continue
- exit
- undo
contidtion_value:
- sqlstate
- sqlwarning
- not found
- sqlexception
declare continue handler for sqlstate '2' set @x=1
光标的使用
在存储过程和函数中,可以使用光标对结果集进行循环处理,光标的使用包含光标的声明: open、fetch、close
定义
declare cur_id cursor for select * from orders;
open cur_id;
fetch cur_id;
close cur_id;
事件调度器
事件调度器是MySQL5.1后面新增的功能,可以将数据库按照自定义时间周期触发某种操作。数据库默认操作是关闭的。需要打开
create event x
on schedule
every 5 second
do
insert into orders (memberId,serialNumber,amount) values(6561121,'222',5)
set global event_scheduler =1//打开调度器
alter event x disable;//禁用事件调度器
drop event x;//删除事件调度器
十、触发器
触发器
触发器是在5.02版本后支持的,触发器是与表有关的数据库对象,在满足条件时触发,并执行触发器中定义的语句集合。可以协助应用在数据库端确保数据的完整性
drop trigger orderlog
delimiter $
create trigger orderlog
after insert on orders for each row
begin
insert into orderslog (content) values(new.serialNumber);
end $
insert into orders (memberId,serialNumber,amount) values(6561121,'sz12234222',5)
解释:上面描述的是创建一个触发器,当往订单表中插入数据之后,在订单日志表插入一条记录。使用old和new来引用触发器发生变化的记录内容,目前只支出行级触发,不支持语句级触发
触发器执行的顺序
before insert\before update\after update
十一、事务控制和锁定语句
MySQL存储引擎的事务说明
存储引擎 | 说明 |
---|---|
InnoDB | 支持行级锁定 |
MyISAM | 支持表级锁定 |
Memory | 支持表级锁定 |
BDB | 支持页级锁定 |
Lock Table与Unlock Table
use finance;
lock table orders read;
unlock table;
如果某个进程(session1)lock定了表,那么其他的进程(session2)可以查询,但是不能进行更新操作,直到第一个进程释放了锁
事务控制
事务关键字 | 说明 |
---|---|
start transaction | 开启一个新事务 |
commit | 提交事务 |
rollback | 回滚事务 |
十二、总结
很高兴您能阅读到这里,可能在三十分钟很难吸收这么多的知识,这篇文章也是我之前学习MySQL笔记整合的,但请容许我以这个词为标题。这篇文章也是理论偏多,对于其中比较比较难理解知识点写些Demo,权当个人理解,如有不足的地方,请您指出。如果对您有所帮助,请点个赞!
MySQL基础知识的更多相关文章
- mysql基础知识大全
前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里作简单概括性的介绍,具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续会慢慢补充完善. 数据库和数据库软件 数据库是 ...
- mysql基础知识语法汇总整理(二)
mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...
- mysql基础知识语法汇总整理(一)
mysql基础知识语法汇总整理(二) 连接数据库操作 /*连接mysql*/ mysql -h 地址 -P 端口 -u 用户名 -p 密码 例如: mysql -u root -p **** /* ...
- MySQL 基础知识梳理
MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...
- MySQL基础知识:启动管理和账号管理
整理.记录常用的MySQL基础知识:时间久了,很多就忘记了. 操作系统环境为MacOS Catalina, MySQL版本为: 8.0.13 MySQL Community Server - GPL. ...
- MySQL基础知识:创建MySQL数据库和表
虚构一个微型在线书店的数据库和数据,作为后续MySQL脚本的执行源,方便后续MySQL和SQL的练习. 在虚构这个库的过程中,主要涉及的是如何使用命令行管理 MySQL数据库对象:数据库.表.索引.外 ...
- MySQL基础知识:Character Set和Collation
A character set is a set of symbols and encodings. A collation is a set of rules for comparing chara ...
- mysql基础知识详解
分享一些mysql数据库的基础知识. 1.每个客户端连接都会从服务器进程中分到一个属于它的线程.而该连接的相应查询都都会通过该线程处理.2.服务器会缓存线程.因此并不会为每个新连接创建或者销毁线程.3 ...
- Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结 ...
- 一、MySQL基础知识
一.背景介绍 我们每天都在访问各种网站.APP,如微信.QQ.抖音,今日头条等,这些东西上面都存在大量的信息,这些信息都需要有地方存储,存储在哪里呢?数据库. 所有我们需要开发一个网站.APP,数据库 ...
随机推荐
- JSON.parse()和JSON.stringify()
1.parse 用于从一个字符串中解析出json 对象.例如 var str='{"name":"cpf","age":"23&q ...
- Redis数据库
Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...
- .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...
- 算法与数据结构(十六) 快速排序(Swift 3.0版)
上篇博客我们主要聊了比较高效的归并排序算法,本篇博客我们就来介绍另一种高效的排序算法:快速排序.快速排序的思想与归并排序类似,都是采用分而治之的方式进行排序的.快速排序的思想主要是取出无序序列中第一个 ...
- html5的web存储
在html5标准之前,web存储信息需要cookie来完成,但是cookie不适合大量数据存储.因为需要等待服务器响应,所以速度慢/效率低. 本地存储的特点: localstorage是仅存储在用户的 ...
- angular 源码分析 1 - angularInit()
angularjs 是个神奇的框架,由于我的好奇,想了解她的内部工作原理,只能一步一步的走进她,靠近她,和她深入的交流. angularjs 的入口是什么样子的呢?一起掀起她的盖头吧. 在这里我只讲方 ...
- 微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别
假设网站A有以下功能需求:1,pc端微信扫码登录:2,微信浏览器中的静默登录功能需求,这两种需求就需要用到用户的unionID,这样才能在多个登录点(终端)识别用户.那么这两种需求下用户的unionI ...
- jQuery幻灯片插件autoPic
原文地址:Jquery自定义幻灯片插件 插件效果图: 演示地址:autoPic项目地址:autoPic 欢迎批评指正!
- 深入学习HBase架构原理
HBase定义 HBase 是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtabl ...
- Oracle:一个用户操作多个表空间中表的问题(转)
原文地址:http://blog.csdn.net/shmiloy001/article/details/6287317 首先,授权给指定用户. 一个用户的默认表空间只能有一个,但是你可以试下用下面的 ...