MySQL介绍,SQL入门及表结构分析

MySQL是什么:

先简单解释一下数据库是什么,数据库就是数据的仓库,也是一种文件系统,需要使用SQL来进行操作。

MySQL则是关系型数据库(库中的数据存在实体与实体的关系)。

常见的数据库(Java开发中,MySQL和Oracle最为常见):

Oracle:大型的数据库,收费的。
MySQL:小型的数据库,免费开源的。被Oracle收购了(6.x版本后开始收费)。
SQLServer:微软的数据库。
DB2:IBM公司产品,大型的数据库,收费的。


MySQL结构图:

在这里插入图片描述
用文字描述:一个数据库的服务器(如MySQL)中包含多个数据库,一个数据库中有多张表,一个表中包含多个字段(字段和JavaBean的属性对应),表中存放多行数据,一行数据和一个JavaBean实体对象对应。

用Dos窗口操作MySQL相关命令:

mysql install(安装服务)
mysqld --initialize(初始化操作,生成data目录)
net start mysql(启动服务)
mysql -u root -p(登录)
show databases;(查看所有数据库)
use 数据库名称;(使用数据库)
show create database 数据库名称;(查询数据库的创建的信息)
select database(); (查询当前正在使用的数据库 )






MySQL常用数据类型:

字符串型:VACHAR(长度可变)、CHAR)(长度不可变,剩余字符用空格补齐)

数值型:TINYINT 、SMALLINT、INT、BIGINT、FLOAT、DOUBLE

日期型:DATE(包含年月日)、TIME(包含时分秒)、DATATIME(包含年月日时分秒,插入数据时如果为空,字段值则为空)、TIMESTAMP(包含年月日时分秒,插入数据时如果为空,获取当前系统日期,存入字段值)

SQL概述及分类:

SQL(Structured Query Language)意为结构化查询语言,是非过程性的语言(一条语句,就对应一个返回结果),用于操作数据库的通用语言。

DDL(Data Definition Language)数据定义语言:creat(创建)、alter(修改)、drop(删除),主要应用在库和表上。

DML(Data Manipulation Language)数据操作语言:insert(插入)、update(修改)、delete(删除),主要应用在数据上。

DQL(Data QueryLanguage)数据查询语言:select(查询),主要应用在数据上。

DCL(Data Control Language)数据控制语言:crant、revoke,主要应用在数据访问权的控制。(用的相当少了)

SQL基本语法:

有关数据库的创建、修改、删除:

创建:creat database 数据库名称;
修改:alter database 数据库名称;
删除:drop databse 数据库名称;

有关表的创建、修改、删除:

1、表名称后跟的括号,要以分号结束。
2、字段要以逗号结束,最后一个字段不能加逗号。
3、约束可以不写。
4、类型如果为字符数据,必须指定长度。


创建:
creat table 表名称(
		字段名1 类型(长度) 约束,
		字段名2 类型(长度) 约束,
		字段名3 类型(长度) 约束
);

修改:
alter table 表名 add 新列名称 类型(长度) 约束;(添加列)
alter table 表名 drop 列名称;(删除列)
alter table 表名 modify 列名称 类型(长度) 约束;(修改列的类型或约束)
alter table 表名 change 旧名称 新列名 类型(长度) 约束;(修改列的名称)
rename table 表名 to 新表名称;(修改表的名称)

删除:
drop table 表名称; 

有关数据的插入、修改、删除和查询(重点):

插入:
insert into 表名称 values(值1,值2,值3);(为所有字段插入值)
insert into 表名称 (字段1,字段2) values(值1, 值2);(为指定字段插入对应值)

修改:
update 表名称 set 字段1=值1,字段2=值2,... where 条件;(修改条件为...的指定字段,没有where条件则修改字段全部数据)

删除:
delete from 表名称 where 条件;(删除指定条件的数据,没有where则删除表中所有数据)
truncate 表名称;(也可以删除全部数据,但方式是先把表删除,然后创建一种表结构相同的空表,不支持事务操作)

查询(重点):
select * from 表名称;(最基本select语句,查询所有列全部数据)

select 字段1,字段2 from 表名称;(查询指定字段的数据)

select distinct 字段 from 表名称;(查询并去重指定字段数据,必须加字段,用*表示不起作用)

select * from 表名称 where 条件;

其中条件可以是运算符:大于>、小于<、等于=、不等于!=、大于等于>=、小于等于<=
可以是in(数值1,数值2,数值3):表示匹配其中的任意数
可以是like '表达式':进行模糊匹配,'张_'表示开头是张,且必须两个字;'张%'表示开头是张,不限字数;'%张%'表示只要有张即可。
可以是 is ull:判断个字段是否为空
可以再结合and or not进行编写where语句,如:
select * from student where age >= 16 and age < 19;

select * from 表名称 order by 列名 升序asc/降序desc;(对查询的结果进行排序,默认为升序,总是放在select语句最后)

select count(字段) from 表名称;(聚集函数-计数)
select sum(字段) from 表名称;(聚集函数-求和)
select max(字段) from 表名称;(聚集函数-求最大值)
select min(字段) from 表名称;(聚集函数-求最小值)
select avg(字段) from 表名称;(聚集函数-求平均值)

select 字段, 聚集函数 from 表名称 group by 字段 having 过滤条件;(根据字段进行分组,分组一般和聚集函数一起使用,求每组某个字段的总和,having和where均可实现过滤,但在having可以使用聚集函数,where不能使用聚集函数,也不能作用在group后)

select语句固定顺序:
select ... from ... where ... group by ... having ... order by ...

例子(为了好理解,在各个字段后加上别名):
select product 商品名, sum(price) 价格总和 from orders where price > 800 GROUP BY product having 价格总和 > 200 ORDER BY 价格总和 desc;

这句SQL的含义:从orders表中,查询商品名和价格总和(聚集函数sum计算出来的),且prive必须大于800,按商品名分组后,过滤出价格总价大于200的数据,并按价格总和降序排序


数据库表结构设计三种方式:

一对一表结构
在这里插入图片描述

一对多表结构
在这里插入图片描述
多对多表结构
在这里插入图片描述


创建单表时的约束:

primary key(声明字段为主键,唯一、非空、被引用)
auto_increment(声明字段自增长)
unique (声明字段唯一)
not null(声明字段不为空)


创建一对多表结构时,多表的约束:

多表约束其实就是外键约束,为了数据完整性而存在。

上面所说的部门表和员工表,在一对多表结构中,如果不加外键,我们可以删除两个部门的数据,此时部门数据已经不存在了,但是员工表中还是存在部门的外键,显然这是不合理的。

加上外键就可以避免这种情况发生。

creat table order(
	oid int primary key auto_increment,
	oname varchar(50),
	oprice doubble,
	uid int,
	foreign key order(uid) references user(uid)         这行表示声明uid为外键并执行user用户主键	
);

笛卡尔积

当联合查询两张表时,两张表有关联,并通过外键关联,会出现笛卡尔积,如下:
在这里插入图片描述

我们理想的情况,应该是查出6条数据才对,但却查出了24条(相当于两张表相乘了),想要解决笛卡尔积,可以采用内连接或外连接方式进行解决:

普通内连接(参照上图两表):
select * from dept inner(可省略) join emp on dept.did = emp.dno;

隐式内连接:
select * from dept d,emp e where d.did = e.dno;

左外连接:
select * from dept left outer(可省略) join emp on dept.did = emp.dno;

右外连接:
select * from dept right join emp on dept.did = emp.dno;

注意:哪个表先写在from后,默认先展示哪个表的字段。

上面四种连接,在没有多余数据的情况下(都有对应的主外键关联),查询出的是数据完全相同。

当存在多余数据时:
内连接默认不查询,只查询出有两表中有关联的数据;
左连接先把左表所有的数据全部都查询出来,再把两个表中有关联的数据查询出,再将无关联的查询出来;
右连接先把右表所有的数据全部都查询出来,再把两个表中有关联的数据查询出,再将无关联的查询出来;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章