Mysql基础(一)安装与基本使用

一、安装(解压版)

官网下载地址:https://dev.mysql.com/downloads/mysql/

1、解压到英文路径下的目录

2、配置环境变量:mysql的解压路径(安装路径) + \bin

3、在mysql的安装路径下创建my.ini文件

[ client ]
port=3306
default-character-set=utf8
[ mysqld ]
# 设置mysql安装目录
basedir=mysql的安装目录
# 设置mysql的数据目录,系统会创建,不需要自己手动创建
datadir=mysql的安装目录\data\
port=3306
character_set_server=utf8
# 跳过安全检查
skip-grant-tables

4、以管理员的方式打开cmd,切换到mysql的安装目录下,执行下面命令

# 安装mysql服务
mysqld -install
# 提示:Service successfully installed. 为安装成功

# 初始化数据库,生成data目录
mysqld --initialize-insecure

#启动mysql服务
net start mysql

#停止mysql服务
net stop mysql

5、进入mysql服务端以及修改密码

#登录mysql客户端
mysql -u root -p

# 使用mysql这个数据库
use mysql;

#修改密码
update user set authentication_string=password('123456') where user='root' and Host='localhost';

#修改完成后刷新权限
flush privileges;

#退出mysql终端
quit;

6、注销my.ini文件中的skip-grant-tables

# 将my.ini文件的skip-grant-tables注销
# skip-grant-tables

# 重启mysql服务
net stop mysql
net start mysql

# 使用密码进行登录
# 第一种方式,直接在后面写上密码
 mysql -u root -p123456
# 第二种方式,先执行下面这条语句,回车后再写密码
 mysql -u root -p

提醒:使用命令连接Mysql服务

mysql -h 主机IP -P 端口 -u 用户名 -p密码

1、-p密码后面不能有空格

2、-p后面没有写密码,回车会要求输入密码

3、如果没有写-h 主机ip,默认就是本机ip

4、如果没有写 -P端口,默认就是3306端口,实际工作中,3306端口是会进行修改的

二、数据库三层结构

1、所谓安装Mysql数据库,就是在主机安装一个数据库管理系统(DBMS),这个管理程序可以管理多个数库。DBMS(database manage system)

2、一个数据库中可以创建多个表,以保存数据(信息)。

3、数据库管理系统(DBMS)、数据库和表的关系

SQL语句分类

  • DDL:数据定义语句 [创建表(create 表),库]
  • DML:数据操作语句 [增加,修改,删除]
  • DQL:数据查询语句 [select]
  • DCL:数据控制语句 [管理数据库:比如用户权限 grant(赋予) revoke(撤回)]

三、数据库的基本操作

1、创建数据库

create database [if not exists] db_name
	[create_specification[,create_specification]...]
create_specification;
[default]character set charset_name | default collate collation_name

1、character set:指定数据库采用的字符集,如不指定字符集,默认采用utf8

2、collate:指定数据库字符集的校对规则(常用的utf8_bin [区分大小写]、utf8_general_ci [不区分大小写] 注意默认的是 utf8_general_ci)

举例:

1、创建一个名为 test_db01的数据库

create database test_db01;

2、创建一个使用utf8字符集的test_db02数据库

create database test_db02 character set utf8;

3、创建一个使用utf8字符集,并带校对规则的test_db03数据库

create database test_db03 character set utf8 collate utf8_general_ci;

注意点:

utf8_bin [区分大小写] 与 utf8_general_ci [不区分大小写] 的区别

1、如果创建表时没有指定字符集和校对规则,那么这个表就以当前的数据库的字符集和校对规则为准

2、举例

在使用 utf8_bin 的表中添加两条数据

insert into `user` values(1,'tom'),(2,'Tom')

之后执行查询语句

select * from `user` where name = 'tom'

结果只能查出一条数据

在使用 utf8_general_ci 后,以同样的方式添加两条数据,查询出的结果时两条数据

3、在创建数据库时,为了避免关键字,可以使用反引号解决 ``

2、查看、删除数据库

1、显示数据库语句

show databases

2、显示数据库创建语句

show create database db_name

3、数据库删除语句(一定要慎用)

drop database [if exists] db_name

3、数据库备份与恢复

备份数据库(注意:DOS执行)命令行

mysqldump -u 用户名 -p -B 数据库1 数据库2 数据库n > 文件名.sql

恢复数据库

练习:

1、备份数据库 test_db02 和 test_db03,在mysql安装目录的bin目录下打开cmd,执行命令

# 该命令的意思就是将数据库 test_db02 test_db03 备份到d盘下的back.sql文件中
mysqldump -u root -p -B test_db02 test_db03 > d:\\back.sql

2、恢复数据库

使用dos命令,通过cmd登录mysql客户端

# 执行命令
source d:\\back.sql

四、数据表的基本操作

1、常用数据类型

分类 数据类型 说明
数值类型 bit(M) 位类型。M指定位数,默认值1,范围1-64
数值类型 tinyint [unsigend] 占1个字节 带符号的范围时-128到127,无符号0到255。默认时有符号
数值类型 smallint [unsigend] 占2个字节 带符号时负的2^15 到 215-1,无符号0到216-1
数值类型 mediumint [unsigend] 占3个字节 带符号时负的2^23 到 223-1,无符号0到224-1
数值类型 int [unsigend] 占4个字节 带符号时负的2^31 到 231-1,无符号0到232-1
数值类型 bigint [unsigend] 占8个字节 带符号时负的2^63 到 263-1,无符号0到264-1
数值类型 float [unsigend] 占用空间4个字节
数值类型 double [unsigend] 表示比float精度更大的小数,占用空间8个字节
数值类型 decimal(M,D) [unsigend] 定点数M指定长度,D表示小数点位数
文本、二进制类型 char(size) char(20) 固定长度字符串,最大255
文本、二进制类型 varchar(size) varchar(20) 可变长度字符串 0~65535 即:2^16-1
文本、二进制类型 blob longblob 二进制数据blob长度为[ 0 ~ 2^16-1] longblob [ 0 ~ 2^32-1]
文本、二进制类型 text longtext 文本 text 0~2^16 longtext 0~2^32
时间日期类型 date/datetime/TimeStamp 日期类型(YYYY-MM-DD)/(YYYY-MM-DD HH:MM:SS)/TimeStamp表示时间戳,它可以用于自动记录insert、update操作的时间

2、创建表

create table table_name(
	field1 datatype,
    field2 datatype,
    field3 datatype,
)character set 字符集 collate 校对规则 engine 引擎(存储引擎)

filed:指定列明(字段名)
datatype:指定列类型(字段类型)
character set:如不指定则为所在数据库字符集
collate:如不指定则为所在数据库校对规则
engine:引擎

注意:创建表时,要根据需保存的数据创建相应的列,并根据数据类型定义相应的列类型

练习:

create table user_info(
	id int,
	`name` varchar(255),
	`password` varchar(255),
	`birthday` date
)character set utf8 collate utf8_general_ci engine innodb;

3、数据类型建表

1、tinyint类型

  • 有符号的范围 -128 ~ 127 ,没有符号的 0 ~ 255

  • 如果没有指定 unsinged ,则 tinyint 就是有符号的

如何定义一个无符号的

# 定义有符号的,默认时有符号
create table t3(
	id tinyint
);
# 定义无符号字段
create table t4(
	id tinyint unsigned
);

2、bit类型

细节说明:

  • bit字段显示时,按照位的方式显示
  • 查询的时候仍然可以使用添加的数值
  • 如果一个值只有0,1可以考虑使用 bit(1),可以节约空间
  • 位类型。M指定位数,默认值为 1,范围 1- 64
  • 使用不多
  • 添加的数据按照给定的位数比如 M = 8,表示一个字节 0~255
  • 查询时仍然可以按照数来查询
create table t5(
	num bit(8)
);

insert into t5 values(255);

select * from t5;

3、数值型(小数)的基本使用

1、float单精度 [UNSIGNED]

2、double双精度 [UNSIGNED]

3、decimal[M,D] [UNSIGNED]

  • 可以支持更加精确的小数位。M是小数位数(精度的总数),D是小数点(标度)后面的位数
  • 如果D是0,则值没有小数点或分数部分,M最大65,D最大是30。如果D被省略,默认是0,如果M被省略,默认是10
  • 建议:如果希望小数精度高,推荐使用decimal
create table t6 (
	num1 float,
	num2 double,
	num3 decimal(30,20)
)

insert into t6 values(88.135345236456436534,88.135345236456436534,88.135345236456436534)

select * from t6

4、字符串的基本使用

1、char(size)

固定长度字符串,最大255字符

create table t9(
	`name` char(255)
);

2、varchar(size) 如果用utf8编码时,size的最大能写到21844,如果编码发生变化,size的大小也会发生变化

可变长度字符串,最大65532字节 ,utf8编码最大21844字符 1-3个字节用于记录大小,也就是要预留出1-3个字节

-- 编码utf8,varchar的size大小计算  size = (65535-3) / 3 = 21844
create table t10(
	`name` varchar(21844)
)
-- 编码gbk,varchar的size大小计算  size = (65535-3) / 2 = 32766
create table t11(
	`name` varchar(32766) 
)character set gbk;

使用细节:

1、char(4) 这个4表示字符数(最大255),不是字节数,不管是中文还是字母都是放四个,按照字符计算

2、varchar(4) 这个4表示字符数,不管是字母还是中文都以定义好的表的编码来存放数据,如果是utf8的编码,那就按照utf8的编码格式进行存放,如果是gbk,那就按照gbk的编码存放,字符占用多少个字节由编码决定

3、不管是中文还是英文字母,都是最多存放4个,按照字符来存放的

-- 不区分英文还是中文,占4个字符
create table t12(
	`name` char(4)
);
-- 成功
insert into t12 values('abcd')
insert into t12 values('你好世界')
-- 失败,超过长度
insert into t12 values('abcde')
insert into t12 values('你好啊世界')
select * from t12


-- 不区分英文还是中文,占4个字符
create table t13(
	`name` varchar(4)
)
-- 成功
insert into t13 values('abcd')
insert into t13 values('你好世界')
-- 失败,超过长度
insert into t13 values('abcde')
insert into t13 values('你好啊世界')

select * from t13

4、char(4) 是定长(固定大小),就是说,即使插入 ‘aa’ 两个字符,也会占用分配的4个字符

5、varchar(4) 是变长(变化大小),就是说,如果插入 ‘aa’,实际占用空间大小并不是4个字符,而是按照实际占用空间来分配,varchar本身还需要占用1-3个字节来记录存放内容长度 L(实际数据大小) + (1到3个字节)

6、char 和 varchar 的使用场景

  • 如果数据定长,推荐使用char,比如md5的密码、邮箱、手机号、身份证号码等 char(32)
  • 如果一个字段的长度不确定,那就使用varchar,比如留言,文章等
  • 查询速度:char 大于 varchar

7、在存放文本时,也可以使用text数据类型,可以将text列视为varchar列,注意text不能有默认值,大小 0-2^16 字节,如果希望存放更多细节,可以选择 mediumtext 0-2^24 或者 longtext 0-2^32

create table t14 (
	content text,
	content1 mediumtext,
	content2 longtext
)

5、日期类型的基本使用

1、date类型

2、datetime类型

3、TimeStamp类型(时间戳)

细节说明:

TimeStamp类型(时间戳)在insert和update时,自动更新

create table t15(
	birthday date, -- 年月日
	jobtime datetime, -- 年月日 时分秒
	login_time timestamp not null default current_timestamp on update current_timestamp -- 配置需要自动更新
	
);

select * from t15

insert into t15(birthday,jobtime) values('2022-11-11','2022-11-11 10:10:10')

6、练习

创建一张员工表,要求如下

字段 属性
id 整形
name 字符型
sex 字符型
birthday 日期型(date)
entry_date 日期型(date)
job 字符型
salary 小数型
resume 文本型
-- 建表
create table emp(
	id int,
	`name` varchar(32),
	sex char(1),
	birthday date,
	entry_date datetime,
	job varchar(32),
	salary double,
	resume text
)charset utf8 collate utf8_bin engine innodb;

-- 插入数据
insert into emp values(100,'您好','男','2022-11-11','2022-11-11 10:10:10','java开发',1200.67,'大家好,我是个开发工程师')

-- 查询
select * from emp

4、修改表

基本介绍

使用 alter table 语句最佳,修改或删除的语法

-- 添加列
alter table tablename add (column datatype [default expr] [,column datatype]...)

-- 修改列
alter table tablename modify (column datatype [default expr] [,column datatype]...)

-- 删除列
alter table tablename drop (column datatype [default expr] [,column datatype]...)

-- 查看表结构
desc 表名;

-- 修改表名
rename table 表名 to 新表名;

--修改字符集
alter table 表名  character set 字符集;

练习:

1、在员工表emp上增加一个新的image列,varchar类型(要求在resume后面)

alter table emp add image varchar(32) not null default '' after `resume`

2、修改job列,使其长度为60

alter table emp modify job varchar(60) not null default ''

3、删除sex列

alter table emp drop sex

4、修改表名为employee

rename table emp to employee

5、修改表的字符集为utf-8

alter table employee character set utf8

6、列名name修改为user_name

alter table employee change `name` user_name varchar(32) not null default ''

7、查看表结构

desc employee

8、删除表

drop table 表名;

五、CRUD语句

基本说明:

C [create]、R [read]、U[update]、D[delete]

1、insert语句

语法:

insert into table_name [(column [, column])] values(value [, value...])

示例:

创建一个商品表 goods(id,goods_name,price),向其中加入两条数据

create table `goods`(
	id int,
	goods_name varchar(10),
	price double
)

insert into `goods`(id,goods_name,price) 
values(10,'华为手机',12.7);

insert into `goods`(id,goods_name,price)
values(12,'苹果手机',12);

select * from `goods`

细节:

1、插入的数据应与字段的数据类型相同。比如把字符串 'abc' 添加到 int 类型会错误

-- 插入失败,mysql底层无法将 'abc' 转型为 int 类型数据
insert into `goods`(id,goods_name,price)
values('abc','小米手机',13)

-- 插入成功,mysql底层可以将 '30' 转型为 int 类型数据
insert into `goods`(id,goods_name,price)
values('30','小米手机',13)

2、数据的长度应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中

insert into `goods`(id,goods_name,price)
values(40,'vivo手机vivo手机vivo手机vivo手机vivo手机vivo手机vivo手机vivo手机vivo手机vivo手机vivo手机',15)

--报错,因为goods_name的长度小于插入数据的长度
Data too long for column 'goods_name' at row 1

3、在values中列出的数据位置必须与被加入到列的排列位置相对应

-- 插入的数据顺序与字段顺序不一致,插入失败
insert into `goods`(id,goods_name,price)
values('联想手机',50,15.4)

-- 插入成功
insert into `goods`(id,goods_name,price)
values(50,'联想手机',15.4)

4、字符和日期类型数据应包含在单引号中

-- 字符类型,需要用引号''进行包裹,否则报错 Unknown column '红米手机' in 'field list',插入失败
insert into `goods`(id,goods_name,price)
values(60,红米手机,10)

--插入成功
insert into `goods`(id,goods_name,price)
values(60,'红米手机',10)

5、列可以插入空值,前提是该字段允许为空,insert into table value(null)

-- 允许插入null值,但是前提是创建表时该字段允许为null的情况下
insert into `goods`(id,goods_name,price)
values(70,'锤子手机',null)

6、insert into tab_name(列名.....) values(),(),()形式添加多条数据

-- 添加多条数据
insert into `goods`(id,goods_name,price)
values(1,'三星手机',12),(2,'四星手机',12),(3,'五星手机',12)

7、如果是给表中的所有字段添加数据,可以不写前面的字段名称

-- 插入失败,因为表的字段为3个,但只插入两个,没有对应
insert into `goods` values(21,'海尔手机')

-- 插入成功
insert into `goods` values(21,'海尔手机',10)

8、默认值的使用,当不给某个字段的值时,如果有默认值就会添加,否则就会报错

-- 插入成功,因为price字段默认为null,插入时只需要指定插入的字段,就会给没有指定的字段插入默认值
insert into `goods`(id,goods_name)
values(24,'海尔手机')

-- 修改字段的默认值
alter table `goods` modify goods_name varchar(12) not null default '默认手机'

-- 执行插入字段,goods_name没有传入,就会赋值默认值
insert into `goods`(id,price)
values(25,100)

2、update语句

语法:

update table_name set col_name1=expr1 [,col_name1=expr1...]
[where where_definition]

示例:

-- 准备测试表
create table emp(
 id int,
 emp_name varchar(32),
 salary double
)

insert into emp(id,emp_name,salary)
values(1,'小王',4500),(2,'小红',3500),(3,'小李',4600)

-- 将所有员工的薪资修改为5000,没有带上限定条件 where,会修改表中所有数据
update emp set salary = 5000

-- 修改小王薪水为3000,添加限定条件,进行限定修改
update emp set salary = 3000 where emp_name = '小王'

-- 将小李的薪水在原来的基础上增加1000,在实际开发中可能不会知道salary旧的值,所以salary + 1000会获得新的值
update emp set salary = salary + 1000 where emp_name = '小李'

细节:

1、update语法可以用新值更新原有表行中的各个列

2、set子句表示要修改哪些列和要赋予哪些值

3、where字句指定应更新哪些,没有where字句,更新所有的行,在使用update更新时,一定要小新,加上where条件限定语句,除非需要修改的是表中的所有值

4,、如果需要修改多个字段的值,可以通过set 字段1 = 值1,字段2 = 值2...

-- 将小王的名字改为小黄,薪水在原来的基础上加上1000
update emp set emp_name = '小黄',salary = salary + 1000 where emp_name = '小王'

3、delete语句

语法:

delete from table_name
[where where_definition]

示例:

-- 删除表中小黄的记录
delete from emp where emp_name = '小黄'

-- 删除表中所有的记录
delete from emp

细节:

1、如果不适用where子句,将删除表中所有数据

2、delete语句不能删除某一列的值(可以使用update设为null或者 '')

3、使用delete语句仅删除记录,不能删除表本身。如果删除表,使用drop table 语句。drop table 表名

4、select语句

语法:

-- 基本查询
select [distinct] * | {column1,colunm2,colunm2...} from table_name

-- 使用表达式对查询的列进行运算
select * | {column1 | expression,column1 | expression...} from table_name

-- 在select语句中可以使用as语句
select columnname as 别名 from 表名

注意事项:

  • select 指定查询哪些数据列
  • column 指定列名
  • *号代表查询所有列
  • from指定查询哪张表
  • distinct可选,指显示结果时,是否去掉重复数据

示例:

-- 准备表和数据
create table `student`(
	id int not null default 1,
	`name` varchar(32) not null default '',
	chinese float not null default 0.0,
	english float not null default 0.0,
	math float not null default 0.0
)

insert into `student` 
values(1,'张三',89,88,90),
(2,'李四',67,98,56),
(3,'王五',59,60,77),
(4,'赵六',89,88,87),
(5,'孙奇',55,90,73),
(6,'王飞',98,84,71),
(7,'谢安',90,58,66)

-- 查询表中所有的记录
select * from `student`

-- 查询表中所有学生的名字和语文成绩
select `name`,chinese from `student`

-- 去重,distinct 条件是查出来的这一行数据必须全部相同,才会进行去重
select distinct chinese from `student` --会去重
select distinct `name`,chinese from `student` --不会去重

-- 统计每个学生的总分
select `name`,(chinese+english+math) from `student`

-- 在每个学生的总分上加10分
select `name`,(chinese+english+math+10) from `student`

-- 别名,别名可以是英文也可以是中文
select `name` as 名字,(chinese+english+math) as total_score from `student`


select语句中的运算符

运算符类型 运算符 说明
比较运算符 > < <= >= = <> != 大于,小于,大于(小于)等于,不等于
比较运算符 between....and... 显示在某一区间的值
比较运算符 in(set) 显示在in列表中的值,例如:in(100,200)
比较运算符 like 张pattern、not like '' 模糊查询
比较运算符 is null 判断是否为空
逻辑运算符 and 对个条件同时成立
逻辑运算符 or 多个条件任一条件成立
逻辑运算符 not 不成立,例:where not (salary > 100)

示例:

-- 查询姓名为张三的学生成绩
select * from `student` where `name` = '张三'

-- 查询英语成绩大于90分的同学
select * from `student` where english > 90

-- 查询总分大于260分的同学
select * from `student` where (chinese+english+math) > 260

-- 查询math大于60并且id大于4的学生成绩
select * from `student` 
where math > 60 and id > 4

-- 查询英语成绩大于语文成绩的学生
select * from `student`
where english > chinese

-- 查询总分大于200分并且数学成绩小于语文成绩并且姓张的的学生
-- 这里的%号代表的是0到多,通配符
select * from `student` where (chinese+english+math) > 200 and math < chinese and `name` like '张%'

-- 查询英语成绩 80-90 之间的学生   两种写法
select * from `student`
where english >= 80 and english <= 90

select * from `student`
where english between 80 and 90

-- 查询数学分数为89,90,91的同学   两种写法
select * from `student`
where math = 89 or math = 90 or math = 91

select * from `student`
where math in(89,90,91)

-- 查询所有姓张的学生  模糊查询
select * from `student` 
where `name` like '张%'

-- 查询数学分数>80,语文分数>80的同学
select * from `student`
where math > 80 and chinese > 80

-- 练习
-- 查询语文分数在 60-80 之间的同学   两种写法
select * from `student`
where chinese >= 60 and chinese <= 80

select * from `student` 
where chinese between 60 and 80

-- 查询总分为250,260,270的同学  两种写法
select * from `student`
where (math+chinese+english) = 250 or (math+chinese+english) = 260 or (math+chinese+english) = 270

select * from `student`
where (math+chinese+english) in(250,260,270)

-- 查询所有姓李 或者 姓张的学生
select * from `student`
where `name` like '李%' or `name` like '张%'

-- 查询数学比语文多30分的同学
select * from `student` 
where chinese+30 < math

order by 子句的使用

语法:

select column1,column1,column1... from table_name order by column asc|desc

说明:

  • order by 指定排序的列,排序的列既可以是表中的列名,也可以是select语句后指定的列名
  • asc 升序[默认]、desc降序
  • order by 子句应位于select语句的结尾

示例:

-- 对数学成绩排序后输出 升序
select * from `student` order by math

-- 对总分按从高到低的顺序输出 降序  可以使用别名进行排序
select `name`,(chinese+math+english) as total_score from `student` order by total_score desc

-- 对姓李的学生成绩排序输出 升序
select `name`,(chinese+math+english) as total_score from `student` where `name` like '李%' order by total_score asc
posted @ 2022-08-24 15:10  花椒蛋炒饭  阅读(352)  评论(0编辑  收藏  举报