MySQL入门篇
Posted 小布丁value
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL入门篇相关的知识,希望对你有一定的参考价值。
1.MySQL定义
1.概念:
MySQl是关系型数据库
常见的关系型数据库有微软SQL Server
甲骨文提供的Oracle和MySQL
MySQL分为企业版和社区版,
社区版是完全免费且开源的
MySql和其他关系型数据库的区别是,支持插件式的存储引擎 存储殷勤包括Innodb,myisam等
大量公司使用的MySql作为数据存储层方案:比如:腾讯,Facebook等。
MySql设计成C/S客户端/服务端的模型,用户可以通过MySql的Client向MySql的服务端发送命令。
MySql服务端对命令进行相应,MySql适合做集群化环境处理,方便做主从复制,读写分离等操作
MySql服务端为了提高用户的并发量,采用了是IO复用和线程池的,实现网络高并发的经典模型
2.SQL语句的划分
DDL (Data Definition Language)数据定义语言,该语言定义了不同的数据库,表,列,索引等数据库对象的定义
DML(Data Manipulation Language)数据库操纵语言,主要用于数据库中数据库记录的增删改查
DCL(Data Control Language)数据控制语言,对数据库设置访问权限和安全级别,grant,remove等
关键字都是数据控制SQL
3.MySQL的数据类型
整数类型
浮点数类型和定点。。
日期与时间类型
字符串类型
二进制类型
整数类型
浮点类型
浮点数,和钱相关的计算,推荐使用decimal
日期类型
数据库范式
外键(外码):一个属性,是其他表中的一个属性,当前表可以通过该属性和其他表建立联系
主键:在一个表中一个属性(一个组合属性)可以找到表中的其他的属性(主键具有唯一性)
第一范式(1NF)每一列要保持原子性
列是基本的数据项,列是不可以进行分割,否则设计成一对多的关系
注意:不符合1NF的不能称之为关系型数据库
如:表中存在一个字段地址字段,可以细分为省、市、区,该字段是不满足第一范式的,将表拆分成专门地址信息
用户表(name、age、address);address不满足第一范式,进行拆分
用户表(name、age、addressId)地址表(addressId,prince、city,…)
第二范式(2NF):属性需要完全依赖主键(针对联合主键)
非主属性完全依赖于主键,如果不是依赖主键,应该拆成新的主题,设计成一对多的和关系
示例
选课关系表(学号,姓名,年龄,课程名称,成绩,学分)联合主键(学号,课程名称)
学分只和课程名称有关,学分只部分依赖主键
姓名,年龄和学号相关,姓名,年龄部分依赖于联合主键
成绩是完全依赖于联合主键
不满足第二范式,进行拆分
学生表(学号,姓名,年龄) 主键:学号
课程表(课程名称,学分) 主键:课程名称
选课成绩表(学号,课程名称,成绩)主键:学号+课程名称
第三范式(3NF):属性不依赖于非主属性(消除传递关系)
关系向数据库满足3NF就可以了
示例:
学生表(学号、姓名、年龄、学院、学院电话) 主键:学号
姓名、年龄、学院等都依赖于主键可以直接查询
但学院电话是需要先查询到学院,在查询到学院电话,即学院电话不依赖于主键,存在传递依赖,将表进行拆分,消除传递依赖
学生表(学号、姓名、年龄、学院) 主键:学号
学院表(学院名称、学院电话) 主键:学院名称
BC范式(BCNF):每一个表中只有一个候选键
BC范式在满足前三范式的基础上的一种特殊情况
即每个表中的只有一个候选键(数据库中每一行的值都不相同,则称之为候选键)
第四范式(4NF):消除表中的多值依赖
示例:学生表(学号、姓名、技能)
技能描述:“Java、MySQL” “JAVA、MYSQL”
需要维护数据一致性问题,进行拆分
学生表(学号、姓名)
技能表(技能ID、技能名称)
学生技能表(学号、技能ID)
通过范式可知:范式越高、表越多、表越多带来问题
1、查询时需要连接多表,增加了查询的复杂度
2、表越多,查询过程中会降低数据库的查询性能
2.SQL操作
1.连接数据库
命令:mysql -u XXX -p XXX
退出MySQL:
exit;
2.库操作
1.创建数据库的SQL
create database database_name;
2.查看数据库的SQL
show databases;
3.删除数据库SQL
drop database database_name;
4.选择数据库
use database_name;
5.查看数据库下的表列表SQL语句格式
show tables;
3.表操作
创建表
create table table_name(
属性名 数据类型【完整性约束条件】
属性名 数据类型【完整性约束条件】
。。。
属性名 数据类型【完整性约束条件】
);
在表中给定属性时需要制定合适的类型,并且可以给定完整的约束条件,主键,非空,唯一性等等
插入数据SQL:
insert into table_name(属性1,属性2.。。属性n)values(属性1,属性2,。。。属性3);
查看表
desc table_name;
通过desc命令查看表的字段名称,类型,是否为空,默认值,备注信息
show create table table_name;
通过该形式可以查看创建表的SQL语句,show形式除了展示创建SQL,还能查看存储引擎及字符编码
SQL语句结束可以使用‘;’形式 也可以使用 ‘\\G’,该形式查看的数据更清晰
修改表
修改表名
alter table old_table_name rename new_table_name;
修改字段属性名
alter table table_name change 旧属性名 新属性名 新数据类型;
修改属性类型
alter table table_name modify 属性名 属性类型;
删除字段属性
alter table table_name drop 属性名;
修改字段排列顺序
alter table table_name modify 属性名1 类型 first|after 属性名2;
alter table table_name modify 属性名1 类型 first;//放在第一位置
alter table table_name modify 属性名1 类型 after属性名2;//指定属性名1放在属性名2后面
查询表
SQL的基础结构如下:
select * from table_name
[where 条件表达式】
[group by 属性名]
[having 条件表达式】
[order by 属性名[ASC|DESC]]
带in的子查询
一般放在where条件后,批量查询
not in(元素1,元素2。。。n)
举例SQL:select * from student where SID In(1,2,3,4,5);
带between and 的范围查询
[not] betweeen 元素1 and 元素2
select * from student where SID between 1 and 5;
带like的模糊查询
[not]like '字符串'
like 后模糊匹配针对字符串可以携带通配符
’%’表示0个或者多个字符串
‘-’只能表示单个字符串
eg:select * from student where Sname like ‘%1%’;
空值查询
if[not]null
select * from student where Ssex is not nulll;
带AND的多条件查询
表达式1 and 表达式 2 and条件表达式 n
select * from student where Sname like '%1%' and Ssex='nan';
带OR的多条件查询
select * from student where Sname like '%1%’ or Ssex=‘nan’;
去重处理
select distinct 属性名
select distinct Sage from Student;
Distinct 各Gruoup By都能完成数据去重?有什么区别
select * from student gruop by Ssex having Sage>20;
gruop by 按照指定的属性进行分组,主要用于统计使用
distinct 将查询出来的结果把重复的去掉
性能上group by好于distinct
对结果排序
order by 属性名[ASC|DESC]
order by 属性后不添加默认时升序【asc] desc降序
select * from student order by Sage desc;
分组查询
gruop by 属性名【having 条件表达式】
limit分页查询
Limit len;//limit 带一个参数,表示不指定初始位置的limit,表示重0号位置开始获取len长度数据返回
limit index len;//带两个参数,第一个参数表示起始位置,第二个参数表示每次读取的长度
数据库中数据处理的SQL
插入数据 的SQL
Insert into table_name(属性1,属性2,,)values(元素1,元素2,,,);//单个元素数据的插入
Insert into table_name(属性1,属性2)values(元素1,元素2),(元素1,元素2,,,,元素n);批量插入
修改数据的SQL
update table_name set 属性名=新元素 where 条件表达式
删除数据SQL:
delete from table_name where 条件表达式
多表查询
表与表存在关系:一对一关系,一对多关系和多对多的关系
多表联合查询:
给定学生表:Student和成绩表SC
mysql> select * from Student;
+-----+----------+------+------+
| SID | Sname | Ssex | Sage |
+-----+----------+------+------+
| 1 | test | nan | 23 |
| 2 | qiandian | nan | 20 |
| 3 | sunfen | nan | 21 |
| 4 | wulan | nv | 18 |
| 5 | CJ1210 | 1 | 11 |
| 6 | LG1213 | nan | 2 |
| 7 | CJ1210 | 1 | NULL |
| 8 | GY1803 | NULL | NULL |
| 11 | TL | nan | 11 |
| 12 | TL12 | nan | 12 |
| 13 | 13 | 13 | 13 |
| 17 | 18 | man | 22 |
| 18 | 23 | man | 23 |
| 19 | GYSX | nan | 21 |
+-----+----------+------+------+
14 rows in set (0.00 sec)
mysql> select * from SC;
+------+------+-------+
| SID | CID | score |
+------+------+-------+
| 1 | 1 | 80 |
| 1 | 3 | 87 |
| 2 | 2 | 89 |
| 6 | 1 | 66 |
| 3 | 3 | 88 |
| 2 | 2 | 98 |
| 9 | 2 | 99 |
+------+------+-------+
7 rows in set (0.00 sec)
Student表和SC表存在一对多的关系
笛卡尔积
将表A中数据的行数乘以表B中的数据的行数
假如表A(m行数据),表B(n行数据),笛卡尔积的结果m*n行结果
内连接
内连接是将符合条件的结果集返回,
内连接分为等值连接和自然连接
等值连接:
当条件“=”的连接称为等值连接,其结果是连接表的所有列,包含重复列
select * from Student s ,SC sc where s.SID=sc.SID;
显性连接:[inner] join XXX on XXX
select * from Student s inner join SC sc on s.SID=sc.SID;
自然连接:
自然连接不仅要求连接的两个字段值必须相同,并且要求对结果中重复的属性去重
外连接
内连接,将符合条件的结果返回(两个表中都存在的数据),
而外链接,不仅包含符合条件的结果,还包括左表(左连接)和右表(右连接)中所有数据返回
表1 left/right/inner join 表2 on 表1.XX=表2.XXX
左连接:
left join :左表(a_table)的记录的所有数据全部显示处理,而右表(b_table)只会显示符合条件的记录,右表记录不足的地方均为null
查询所有同学的课程成绩
select * from Student s left join SC sc on s.SID=sc.SID:
右连接
right join :左表(a_table)的记录的显示符合条件的记录,而右表(b_table)显示全部的数据结果,左表表记录不足的地方均为null
需求:查询所有的成绩的学生信息
select * from Student s right join SC sc on s.SID=sc.SID;
基本函数:
count();计数
avg();平均值
max();最大值
min();最小值
以上是关于MySQL入门篇的主要内容,如果未能解决你的问题,请参考以下文章