你好呀~
这里是水母,一位希望学有所成,不断地进步的编程小白
1.数据库概述
1)库和表的概念与关系
库类似文件夹,一库中可以有多个表,表中存储数据。
mysql中有很多不同的库,库中存在不同的表。
表中定义不同的字段,根据结构存储数据。
2)MySQL数据类型
数据类型是定义列中可以存储什么类型的数据以及该数据实际怎样存储的基本规则
数据类型限制存储在数据列列中的数据。例如,数值数据类型列只能接受数值类型的的数据
在设计表时,应该特别重视所用的数据类型。使用错误的数据类型可能会严重地影响应用程序的功能和性能。
更改包含数据的列不是一件小事(而且这样做可能会导致数据丢失)。
字符串数据类型
最常用的数据类型是串数据类型。它们存储串,如名字、地址、电 话号码、邮政编码等。
不管使用何种形式的串数据类型,串值都必须括在引号内
有两种基本的串类型,分别为定长串和变长串
-
定长串:char
1. 接受长度固定的字符串,其长度是在创建表时指定的。 定长列不允许存储多于指定长度字符的数据。
2. 指定长度后,就会分配固定的存储空间用于存放数据
char(7) 不管实际插入多少个字符,都会占用7个字符位置,插入的数据不允许超出最大长度范围
-
变长串:varchar
存储可变长度的字符串 varchar(7) 如果实际插入4个字符, 那么它只占4个字符位置,插入的数据不允许超出最大长度范围。
✨虽然变长串较为灵活,更倾向于采用定长数据类型,因为MySQL处理定长列速度远高于处理变长列。
- Text 变长文本类型存
数值类型
数值数据类型存储数值。MySQL支持多种数值数据类型,每种存储的数值具有不同的取值范围。支持的取值范围越 大,所需存储空间越多
与字符串不一样,数值不应该括在引号内。
decimal(5, 2) 表示数值总共5位, 小数占2位
tinyint 1字节(8位) 0-255。-128,127
int 4字节。 -21亿,21亿。0-42亿
float.
MySQL中没有专门存储货币的数据类型,一般情况下使用DECIMAL(8, 2)
- 有符号或无符号
所有数值数据类型(除BIT和BOOLEAN外)都可以有符号或无符号
有符号数值列可以存储正或负的数值
无符号数值列只能存储正数
默认情况为有符号,但如果你知道自己不需要存储负值,可以使用UNSIGNED关键字
✨ 若将邮政编码类似于01234存储为数值类型,则保存的将是数值1234,此时需要使用字符串类型
日期和时间类型
MySQL使用专门的数据类型来存储日期和时间值
二进制数据类型
二进制数据类型可存储任何数据(甚至包括二进制信息),如图像、多媒体、字处理文档等
3)表的字段约束
- unsigned 无符号(给数值类型使用,表示为正数,不写可以表示正负数都可以) 。
- 字段类型后面加括号限制宽度 。
char(5). varchar(7) 在字符类型后面加限制 表示 字符串的长度
int(4) 没有意义,默认无符号的int为int(11),有符号的int(10)
int(4) unsigned zerofill只有当给int类型设置有前导零时,设置int的宽度才有意义。 - not null 不能为空,在操作数据库时如果输入该字段的数据为NULL ,就会报错
- default 设置默认值
- primary key 主键不能为空,且唯一.一般和自动递增一起配合使用。
- auto_increment 定义列为自增属性,一般用于主键,数值会自动加1
- unique 唯一索引(数据不能重复:用户名)可以增加查询速度,但是会降低插入和更新速度
4)MySQL运算符
算术运算符: +、 -、 *、 /、 %
比较运算符: =、 >、 <、 >=、 <=、!=
数据库特有的比较: in、not in、is null、is not null、like、between、and
逻辑运算符: and、or、not
like: 支持特殊符号%和_ (其中%表示任意数量的任意字符,_表示任意一位字符)
5)主键
表中每一行都应该有可以唯一标识自己的一列,用于记录两条记录不能重复,任意两行都不具有相同的主键值
应该总是定义主键 虽然并不总是都需要主键,但大多数数据库设计人员都应保证他们创建的每个表具有一个主 键,以便于以后的数据操纵和管理。
要求:
记录一旦插入到表中,主键最好不要再修改
不允许NULL
不在主键列中使用可能会更改的值。
自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键 重复,也不用自己预先生成主键
可以使用多个列作为联合主键,但联合主键并不常用。使用多列作为主键时,所有列值的组合必须是唯一的
2.数据库基本操作
1)使用方法
方式一:命令行执行操作
方式二:通过图型界面工具,如 Navicat 等
方式三:通过编程语言(python,php,java,go…)执行mysql命令
2)语法特点
语句可以换行,以英文; 结束
不区分大小写,关键字和函数建议使用大写
如果提示符为 '> 那么需要输入一个’回车
命令打错换行后不能修改, 可以用 \c 取消
3)SQL ( Structure query language ) 结构化查询语言
分为4个部分:
DDL(定义)
DML(操作)
DQL(查询)添加,修改,删除
DCL(控制)
4)快捷键
\G 格式化输出(文本式,竖立显示)
\s 查看服务器端信息
\c 结束命令输入操作
\q 退出当前sql命令行模式
\h 查看帮助
5)数据库操作
终端登录数据库
mysql -u root -p
查看当前mysql中的所有库
show databases;
选择要操作的库,打开数据库
use mysql;
查看当前库中所有数据表
show tables;
建库
create database 库名 default charset=utf8;
退出数据库
exit;
或者 quit;
删除数据库
drop database 库名;
3.数据表操作
1)数据表基本操作
查看表
show tables;
删除表
drop table 表名;
查看表结构
desc 表名;
建表
create table if not exists 表名(字段1 类型,字段2 类型);
查看建表语句
show create table users;
建表规则
- 表明和字段名 尽可能的符合命名规范,做到‘见名知意’
- 表中数据必须有唯一标示,即主键(primary key)定义。
- 无特殊情况,主键都为数字并自增(auto_increment)即可
- 表中字段所对应的类型设置合理,并限制合理长度
- 表引擎推荐使用innodb,并无特殊情况都要求为utf8或者utf8mb4的字符编码
如果表不存在,创建表
create table if not exits 表名(
字段名 类型 字段约束,
字段名 类型 字段约束,
......
字段名 类型 字段约束
)engine=innodb default charset=utf8;
-- e.g.创建用户表
create table if not exits user(
-- 创建ID字段,为正整数,不允许为空 主键,自动递增
id int unsigned not null primary key auto_increment,
-- 创建 存储 名字的字段,为字符串类型,最大长度 5个字符,不允许为空
username varchar(5) not null,
-- 创建存储 密码 的字段,固定长度 32位字符, 不允许为空
password char(32) not null,
-- 创建 年龄 字段,不允许为空,默认值为 20
age tinyint not null default 20
)engine=innodb default charset=utf8;
2)修改建表结构
alter table 表名 action (更改的选项)
添加字段
在表中追加一个a字段
alter table 表名 add a字段名 字段类型 字段约束;
在指定字段后面追加新字段,
alter table 表名 add 新字段名 字段类型 after 指定字段;
在表的最前面添加一个新字段
alter table 表名 add 新字段名 字段类型 first;
删除字段
alter table 表名 drop 被删除的字段名 ;
修改字段
一般情况下,无特殊要求,不要轻易修改表结构
alter table 表名 change|modify 被修改的字段信息
change: 可以修改字段名,
modify: 不能修改字段名。
# 修改表中的 num 字段 类型,使用 modify 不修改表名
alter table users modify num tinyint not null default 12;
# 修改表中的 num 字段 为 int 并且字段名为 nn
alter table users change num mm int;
3)修改表名
alter table 原表名 rename as 新表名;
4)更改表中自增的值
常规情况下,默认从1开始自增
alter table users auto_increment = 1000;
5)更改表引擎
# 推荐在定义表时,表引擎为 innodb。
# 通过查看建表语句获取当前的表引擎
mysql> show create table users\G;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8 1 row in set (0.00 sec)
#直接查看当前表状态信息
mysql> show table status from tlxy where name = 'users'\G;
*************************** 1. row ***************************
Name: users
Engine: InnoDB
#修改表引擎语句
alter table users engine = 'myisam';
4.数据操作
1) 增删改查基本操作
增
添加数据
标准添加(指定所有字段,给定所有的值)
insert into 表名[(字段列表)] values(值列表...);
指定部分字段添加值
insert into 表名(字段名1,字段名2,字段名3) values(字段值1,字段值2,字段值3);
insert into user(name,age,sex) values('张三',22,'女');
添加数据时,若是字段值和表中字段名顺序一一对应,可以省略字段名;
insert into 表名 values(字段值1,字段值2,字段值3);
批量添加值
# 批量添加值 e.g.
insert into 表名 values
(null,'zhaoliu',25,'w','lamp94'),
(null,'uu01',26,'m','lamp94'),
(null,'uu02',28,'w','lamp92'),
(null,'qq02',24,'m','lamp92'),
(null,'uu03',32,'m','lamp138'),
(null,'qq03',23,'w','lamp94'),
(null,'aa',19,'m','lamp138');
查
查询表中所有数据
select * from 表名;
数据量大时使用此命令可能会引起宕机
查看表中所有列的数据
select * from 表名;
指定字段列表查询
select 列名1,列名2 from 表名;
改
update 表名 set 字段1=值1,字段2=值2,字段n=值n... where 条件
update 表名 set 字段=字段+值 where 条件;
# 将id为11的age改为35,sex改为m值
update stu set age=35,sex='m' where id=11;
# 将id值为12和14的数据值sex改为m,classid改为lamp92
update stu set sex='m',classid='lamp92' where id=12 or id=14
# 等价于下面
update stu set sex='m',classid='lamp92' where id in(12,14);
删
delete from 表名 [where 条件];
2) DQL-MySQL数据查询
语法格式
select 字段列表|* from 表名
[where 搜索条件]
[group by 分组字段 [having 分组条件] ]
[order by 排序字段 排序规则]
[limit 分页参数]
where条件查询
where 子句中可以指定任何条件
可以使用 and 或者 or 指定一个或多个条件
where 条件可以在update和delete语句的后面运用
where 子句类似程序语言中的if条件,根据MySQL表中字段值进行数据过滤
select gradeid 阶段名称,avg(learnsum) from subject group by gradeid;
一张表中分组统计性别总人数
select gradeid,count(*),sex from student group by sex,gradeid;
and 和 or
注意甄别判断条件,运用括号实现查询
select * from users where age=22 or age = 25 and sex = '女'; +------+--------+------+-------+-------+------+------+
| id | name | age | phone | email | sex | mm |
+------+--------+------+-------+-------+------+------+
| 1 | 章三 | 22 | | NULL | 男 | 0 |
| 1002 | cc | 25 | 123 | NULL | 女 | NULL |
+------+--------+------+-------+-------+------+------+
2 rows in set (0.00 sec)
上面的查询结果并不符合 查询条件的要求。
问题出在 sql 计算的顺序上,sql会优先处理and条件,所以上面的sql语句就变成了
查询变成了为年龄22的不管性别,或者年龄为 25的女生
使用小括号来关联相同的条件可解决此问题
select * from users where (age=22 or age = 25) and sex = '女'; +------+------+------+-------+-------+------+------+
| id | name | age | phone | email | sex | mm |
+------+------+------+-------+-------+------+------+
| 1002 | cc | 25 | 123 | NULL | 女 | NULL |
+------+------+------+-------+-------+------+------+
1 row in set (0.00 sec)
Like子句
在where条件中使用=,<,> 等符合进行条件的过滤,
想查询某个字段是否包含时 可以使用like语句进行某个字段的模糊搜索
✨where子句中的like在使用%或者_进行模糊搜索时,效率不高
- 尽可能的不去使用%或者
- 如果需要使用,也尽可能不要把通配符放在开头处
例】使用 % 模糊搜索。%代表任意个任意字符
# 查询name字段中包含五的
select * from users where name like '%五%';
# 查询name字段中最后一个字符 为 五的
select * from users where name like '%五';
# 查询name字段中第一个字符 为 王 的
select * from users where name like '王%';
# 使用 _ 单个的下划线。表示一个任意字符,使用和%类似
# 查询表中 name 字段为两个字符的数据
select * from users where name like '__';
# 查询 name 字段最后为五,的两个字符的数据
select * from users where name like '_五';
聚合函数(MySQL统计函数)
max(),min(),count(),sum(),avg()
例】统计users表中的数据量
select count(*) from users;
select count(id) from users;
group by
根据一个或多个列对结果集进行分组,常和聚合函数组合使用
Having 子句
having时在分组聚合计算后,对结果再一次进行过滤,类似于where, where过滤的是行数据,having过滤的是分组数据。
Order by 排序
mysql中使用select的语句查询的数据结果是根据数据在底层文件的结构来排序的,首先不要依赖默认的排序,另外在需要排序时要使用orderby对返回的结果进行排序
- asc 升序,默认
- desc 降序
Limit 数据分页
limit n 提取n条数据
limit m,n 跳过m跳数据,提取n条数据