程序员

java笔记--数据库(1)

作者:admin 2021-08-09 我要评论

这里写目录标题 MySQL服务启动 SQL通用语法 SQL分类 DDL DML DQL 查询语句 聚合函数 分组查询 分页查询 约束 主键约束 非空约束 唯一约束 外键约束 DCL 数据库的...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

MySQL服务启动

??cmd–>services.msc //打开服务的窗口
??net stop/start mysql //使用管理员打开cmd,关闭/打开mysql的服务
??mysql -uroot -proot //链接mysql服务器
??exit/quit //mysql的退出
??mysql -h127.0.0.1 -uroot -proot //登录需要链接的目标
??mysql --host=ip --user=root --password=连接目标的密码

SQL通用语法

1.语句可以单行或多行书写,以分号结尾
2.可使用空格和缩进来增强语句的可读性
3.语句不区分大小写,建议使用大写
4.三种注释
(1)单行注释:–(两个横杠一个空格) 注释内容 或 # 注释内容(mysql 特有)
(2)多行注释:/* 注释 */

SQL分类

DDL

用来定义数据库对象:数据库,表,列等。
????关键字:create,drop,alter等
(1)操作数据库:CRU
? ?1)C(Create)创建//CREATE DATABASE 数据库名称//创建数据库
? ?2)R(Retrieve):查询
//SHOW DATABASES//查询所有数据库的名称
//SHOW CREATE DATABASE 数据库名称;//查询某个数据库的创建语句
? ?3)U(Update):修改
修改数据库的字符集
//ALTER DATABASE 数据名称 CHARACTER SET 字符集名称//例如UTF8
? ?4)D(Delete):删除
删除数据库
//DROP DATABASE 数据库名称
? ?5)使用数据库
查询当前正在使用的数据库名称
//SELECT DATABASE();
使用数据库
//USE 数据库名称
(2)操作表
1)C(Create)创建
*1.语法:
CREATE TABLE 表名(
列名1 数据类型1,
列名2 数据类型2,

列名n 数据类型n
);
*2.数据库的类型:
1.int:整数类型
age int
2.double:小数类型
score double(5,2)//一共五位有效数字,保留小数点后两位
3.date:日期,质保函年月日,yyyy-MM-dd
4.datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss
5.datestamp:日期,包含年月日时分秒 yyyy-MM-dd HH:mm:ss//如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
6.varchar:字符串
name varchar(20):姓名最大20个字符
? 复制表:
//CREATE TABLE 表名 LIKE 被复制的表名
2)R(Retrieve)查询
查询某个数据库中所有的表名称
//SHOW TABLES
查询表结构
//DESC 表名
3)U(Update):修改
1.修改表名
ALTER TABLE 表名 RENAME TO 新的表名;
2.修改表的字符集
ALTER TABLE 表名 CHARACTER SET 字符集名称;
3.添加一列
ALTER TABLE 表名 ADD 列名 数据类型;
4.修改列名称 类型
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
ALTER TABLE 表名 MODIFY 列名 新数据类型;
5.删除列
4)D(Delete)删除
//DROP TABLE 表名

DML

用来查询数据库中表的数据进行增删改、查询SELECT * FROM 表名;
关键字:insert,delete,update等
1)添加数据:
*语法:
INSERT INTO 表名(列名1,列名2,…,列名n) VALUES(值1,值2,…,值n);
*注意:
1.列名和值要一一对应
2.如果表名后,不定义列名,则默认给所有添加值
INSERT INTO 表名 VALUES(值1,值2,…,值n);
3.除了数字类型,其他类型需要使用引号(单双都可以)引起来
2)删除数据
*语法:
DELETE FROM 表名 WHERE 条件
*注意:
1.如果不加条件,则删除表中所有记录
2.如果要删除所有的记录,推荐使用//TRUNCATE TABLE 表名;//删除表,然后再创建一个一模一样的空表
3)修改数据
*语法:UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,…[WHERE 条件]
*注意:如果不加任何条件,则会将表中所有记录全部修改

DQL

用来查询数据库中标的记录。
? 关键字:select,where等
1)语法:
SELECT
字段列表
FROM
表明列表
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组之后的条件
ORDER BY
排序
LIMIT
分页限定
2)基础查询
1.多个字段的查询
SELECT 字段名1,字段名2… FROM 表名;
*注意:
如果查询所有字段,则可以使用 * 来替代字段列表
2.去除重复:
DISTINCT
3.计算列:
一般可以使用四则运算计算一些列的值(一般只会进行数值型的计算)
IFNULL(表达式1,表达式2)//NULL参与的运算,结果都为NULL
//表达式1:那个字段需要判断是否为NULL
表达式2:如果该字段为NULL后的替换值
4.起别名:
AS:AS也可以省略
3)条件查询:
1.WHERE趑趄后跟条件
2.运算符
? >、<、>=、<=、=、<>
? BETWEEN…AND
? IN(集合)
? LIKE
*占位符:
? _:单个任意字符
? %:多个任意字符
? IS NULL/IS NOT NULL
? AND 或 &&
? OR或 ||
? NOT 或 !### 查询

查询语句

语法:
ORDER BY 子句
ORDER BY 排序字段1 排序方式1, 排序字段2 排序方式2…
//排序方式:ASC:升序,默认的
DESC:降序
//注意:
如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件

聚合函数

将一列数据作为一个整体,进行纵向的计算
1.COUNT:计算个数
*1一般选择非空的列:主键
*2IFNULL函数
2.MAX:计算最大值
3.MIN:计算最小值
4.SUM:计算和
5.AVG:计算平均值

分组查询

1.语法:GROUP BY 分组字段;
2.注意:
分组之后查询的字段:分组字段、聚合函数
WHERE 和 HAVING 的区别
WHERE在分组之前进行限定,如果不满足条件,则不参与分组;WHERE后不可跟聚合函数
HAVING在分组之后进行限定,如果不满足结果,则不会被查询出来;HAVING可以进行聚合函数的判断

SELECT sex ,AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;

分页查询

1.语法:LIMIT 开始的索引,每页查询的条数;
2.公式:开始的索引=(当前的页码-1)*每页显示的条数
3.LIMIT 是一个MySQL“方言”

约束

1)概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性
2)分类:

主键约束

PRIMARY KEY
*1.注意:
非空且唯一;一张表只能有一个字段为主键,;主键就是表中记录的唯一表示
*2.在创建表示,添加主键约束
CREAT TABLE 表名(
列名 类型 PRIMARY KEY
);
*3.删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
*4.创建完表后,添加主键
ALTER TABLE 表名 MODIFY 列名 类型 PRIMARY KEY;
*5.自动增长:
a.如果某一列是数值类型的,使用AUTO_INCREMENT 可以来完成值的自动增长
b.在创建表时,添加主键约束,并且完成主键自增长
CREAT TABLE 表名(
列名 类型 PRIMARY KEY AUTO_INCREMENT
);
c.删除自动增长
ALTER TABLE 表名 MODIFY 列名 类型;
d.添加自动增长
ALTER TABLE 表名 MODIFY 列名 类型 AUTO_INCREMENT;
*6.联合主键
FOREIGN KEY(主键1,主键2);

非空约束

NOT NULL
*1传建表时添加约束

CREATE TABLE stu(
NAME VARCHAR(20) NOT NULL--name为非空
)

*2创建表完之后,添加非空约束

ALTER TABLE sty MODIFT NAME VARCHAR(20) NOT NULL;

*3删除name的非空约束

ALTER TABLE stu MODIFY NAME VARCHAR(20);

唯一约束

UNIQUE
*1.创建表示,添加唯一约束
CREATE TABLE 表名(
列名 类型 UNIQUE//添加了唯一约束
);
*2.删除唯一约束
ALTER TABLE 表名 DROP INDEX 列名;
*3.在创建表后,添加唯一约束
ALTER TABLE 表名 MODIFY 列名 类型 UNIQUE;

外键约束

FOREIGN KEY
FOREGIN KEY,让表与表产生关系,从而保证数据的正确性
*1.在创建表时,可以添加外键
CREATE TABLE 表名(

外键列
CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES 主表名称(主表列名称)
);
*2.删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
*3.创建表之后,添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
*4.级联操作
a.添加级联操作
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;
b.分类:
①级联更新:ON UPDATE CASCADE
②级联删除:ON DELETE CASCADE

DCL

用来定义数据库的访问权限和安全级别,及创建用户。
?关键字:grant,revoke等

数据库的设计

多表之间的关系

1.一对一://如人和身份证
实现方式:可以在任意一方添加外键指向另一方的主键
2.一对多(多对一)://如部门(一)和员工(多)
实现方式:在多的一方建立外键,指向一的一方的主键
3.多对多://如学生和课程
实现方式:需要借助第三张中间表,中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键

数据库设计的范式

1.概念:设计数据库时,需要遵循的一些规范。要遵循后变得范式要求,必须先遵循前边的所有范式要求
2.分类:
*1.第一范式(1NF):每一列都是不可分割的原子数据项
*2.第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码
??a.函数依赖:如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A
??b.完全函数依赖:如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性值
??c.部分函数依赖:如果A是一个属性组,则B属性值的确定只需要依赖于A属性组中部分的属性值即可
??d.传递函数依赖:如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定为宜C属性的值,则称C传递函数依赖于A
??e.码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码
*3.第三范式(3NF):在2NF的基础上,任何非主属性不依赖与其他非主属性(在2NF的基础上消除传递依赖)

数据库的备份和还原

一、命令行:
MYSQLDUMP -u用户名 -p密码 数据库的名称 > 保存的路径;//保存
SOURCE 文件路径;//执行还原
二、图形化工具:
选中表,邮件备份/导出,备份数据库;右键数据库,执行SQL脚本,选择文件

多表查询

查询语法

SELECT 表 FROM 表名列表 WHERE…

笛卡尔积

有两个集合A,B,取这两个集合的所有组成情况;要完成多表查询,需要消除无用的数据

多表查询的分类

1.内连接查询:
*1.隐式内连接:使用WHERE条件消除无用的数据

SELECT 
	emp.name,
	emp.gender,
	dept.name 
From
 	emp,dept
WHERE 
	emp.dept_id=dept.id;

*2.显式内连接:
a.语法:SELECT 字段列表 FROM 表名1 [INNER] JOIN 表名2 ON 条件
b.

SELECT * FROM emp INNER JOIN dept ON emp.dept_id=dept.id
SELECT * FROM emp INNER JOIN dept ON emp.dept_id=dept.id

*3.内连接查询:
a.从哪些表中查询数据
b.条件是什么
c.查询哪些字段
4.外连接查询:
*1.左外连接:
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;//显示出左边表的全部数据和左边和右边相同的数据
*2.右外连接:
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件; //显示出右边表的全部数据和左边和右边相同的数据
5.子查询
*1.子查询:查询中嵌套查询

SELECT * FROM emp WHERE emp.salary=(SELECT MAX(salary) FROM emp);//单行单列子查询,可以作为条件

*2.子查询不同情况
a.子查询的结果是单行单列的:
该子查询可以作为条件
b.子查询的结果是多行单列的
该子查询可以作为条件使用运算符IN来判断
c.子查询的结果是多行多列的
该子查询可以作为一张虚拟表

SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date > '2011-11-11') t2
WHERE t1.id=t2.dept_id;
;原文链接:https://blog.csdn.net/kanbujianwolue/article/details/115632213

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 十月更新修复了Windows 10的Ping of De

    十月更新修复了Windows 10的Ping of De

  • Windows10 UAC弹窗太烦但又不能关?教

    Windows10 UAC弹窗太烦但又不能关?教

  • 老大手把手教我玩 Git 变基!

    老大手把手教我玩 Git 变基!

  • 在Linux终端中展示幻灯片

    在Linux终端中展示幻灯片

腾讯云代理商
海外云服务器