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 属性名2alter 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入门篇的主要内容,如果未能解决你的问题,请参考以下文章

MySQL--------入门简介篇

MySQL入门篇

MySql入门篇

PHP代码审计入门-DVWA靶场暴力破解篇

入门MySQL——基础语句篇

推荐net开发cad入门阅读代码片段