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

一、安装(解压版)

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

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

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

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

copy
[ 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的安装目录下,执行下面命令

copy
# 安装mysql服务 mysqld -install # 提示:Service successfully installed. 为安装成功 # 初始化数据库,生成data目录 mysqld --initialize-insecure #启动mysql服务 net start mysql #停止mysql服务 net stop mysql

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

copy
#登录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

copy
# 将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、创建数据库

copy
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的数据库

copy
create database test_db01;

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

copy
create database test_db02 character set utf8;

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

copy
create database test_db03 character set utf8 collate utf8_general_ci;

注意点:

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

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

2、举例

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

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

之后执行查询语句

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

结果只能查出一条数据

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

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

2、查看、删除数据库

1、显示数据库语句

copy
show databases

2、显示数据库创建语句

copy
show create database db_name

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

copy
drop database [if exists] db_name

3、数据库备份与恢复

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

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

恢复数据库

练习:

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

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

2、恢复数据库

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

copy
# 执行命令 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、创建表

copy
create table table_name( field1 datatype, field2 datatype, field3 datatype, )character set 字符集 collate 校对规则 engine 引擎(存储引擎) filed:指定列明(字段名) datatype:指定列类型(字段类型) character set:如不指定则为所在数据库字符集 collate:如不指定则为所在数据库校对规则 engine:引擎

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

练习:

copy
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 就是有符号的

如何定义一个无符号的

copy
# 定义有符号的,默认时有符号 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
  • 查询时仍然可以按照数来查询
copy
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
copy
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字符

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

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

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

copy
-- 编码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个,按照字符来存放的

copy
-- 不区分英文还是中文,占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

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

5、日期类型的基本使用

1、date类型

2、datetime类型

3、TimeStamp类型(时间戳)

细节说明:

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

copy
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 文本型
copy
-- 建表 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 语句最佳,修改或删除的语法

copy
-- 添加列 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后面)

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

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

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

3、删除sex列

copy
alter table emp drop sex

4、修改表名为employee

copy
rename table emp to employee

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

copy
alter table employee character set utf8

6、列名name修改为user_name

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

7、查看表结构

copy
desc employee

8、删除表

copy
drop table 表名;

五、CRUD语句

基本说明:

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

1、insert语句

语法:

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

示例:

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

copy
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 类型会错误

copy
-- 插入失败,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的列中

copy
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中列出的数据位置必须与被加入到列的排列位置相对应

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

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

copy
-- 字符类型,需要用引号''进行包裹,否则报错 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)

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

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

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

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

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

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

copy
-- 插入成功,因为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语句

语法:

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

示例:

copy
-- 准备测试表 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...

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

3、delete语句

语法:

copy
delete from table_name [where where_definition]

示例:

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

细节:

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

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

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

4、select语句

语法:

copy
-- 基本查询 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可选,指显示结果时,是否去掉重复数据

示例:

copy
-- 准备表和数据 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)

示例:

copy
-- 查询姓名为张三的学生成绩 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 子句的使用

语法:

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

说明:

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

示例:

copy
-- 对数学成绩排序后输出 升序 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 @   花椒蛋炒饭  阅读(368)  评论(0编辑  收藏  举报
相关博文:
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起