一.前提知识(准备)
MySQL数据库的优点:
1.开放源代码
2.可跨平台
3.轻量级,能够更快速的、更高效的处理数据
4.成本低
▲注意:
①[ ]号中的是可选项,并非一定要写的
②字段就是表格中的列。
③MySQL不区分 ' 和 " 。
1.必知数据类型:
拓展:
文本文件类型:
类型 范围 说明 BLOB binary large object 二进制形式的长文本数据 TEXT 长文本数据 时间类型:(中间连接符:- / . 这三种都行,就是不能写中文)
DATE ('1000-01-01','9999-12-31') 'YYYY-MM-DD' DATETIME ('1000-01-01 00:00.00','9999-12-31 23:59:59')
'YYYY-MM-DD HH:MM:SS' TIMESTAMP
时间戳
('1970-01-01 00:00:01'UTC,'2038-01-19 03:14:07'UTC) 'YYYY-MM-DD HH:MM:SS'
2.表的完整性约束:
约束条件 | 描述 |
PRIMARY KEY | 主键约束,约束字段的值可唯一地标识对应的记录 |
NOT NULL | 非空约束,约束字段的值不能为空 |
UNIQUE | 唯一约束,约束字段的值是唯一的 |
CHECK | 检查约束,限制某个字段的取值范围 |
DEFAULT | 默认值约束,约束字段的默认值 |
AUTO INCREMENT | 自动增加约束,约束字段的值自动递增 |
FOREIGN KEY | 外键约束,约束表与表之间的关系 |
▲重点讲一下外键约束:
外键约束的作用:
1.参照完整性:从表要插入一个主表中有对应主键值的数据行
2.避免数据冗余:避免主表中某些数据重复存储
3.避免意外删除数据:外键约束默认无法对正在使用的主键的行进行删除或修改
外键约束的条件:
主表:主表的外键字段必须引用从表的主键或唯一键。
从表:必须有一个主键。
引用完整性检查:主表中的外键字段必须引用从表中唯一存在的,不能填其他的值。
性能影响:在设计数据库时,需要考虑外键约束对性能的影响,尤其是在大型数据库中,频繁的外键检查可能会对性能产生负面影响。
在创建表的时候加:
constraint FK_从表_主表 foreign key (从表字段,唯一性) references 主表 (字段)
在创建表后
alter table 从表 add constraint FK_从表_主表 foreign key (从表字段,唯一性) references 主表 (字段)
FK_从表_主表 是一个描述性的约束名,它清晰地表明了这个约束是一个从表到主表的外键约束。
问题解答:
问题1:为什么设置主外键后,主表的数据不能随意删除和修改,但是从表中的数据时可以删除和修改?
如果你尝试删除主表中的数据,而该数据在从表(即引用主表的表)中被引用,那么数据库管理系统(DBMS)会阻止这个删除操作,以防止数据不一致。这是因为删除主表中的数据会导致从表中的相关外键失去引用,违反了外键约束。
要正确删除主表中的数据时可以这样做:
- 先删除从表中的主键或者置空主键:这种比较常用。
- 级联删除:在定义外键约束时,可以指定级联删除,这样当主表中的数据被删除时,从表中的相关数据也会自动被删除。(谨慎使用,因为可能会删除大量数据)
- 关闭外键,删除相关信息后再重新启用:有一点不好就是前后数据可能不统一。
*其实在navicat的表的外键设置中有一个“删除时”和“更新时”的选项:其中CASCADE是级联
SET NULL是置空,RESTRICT是默认的阻止删除或更新操作,NO ACTION和RESTRICT差不多但有些细微差别。
二.语言操作(预热)
1.SQL(Structured Query Language)结构化查询语言分类:
DDL | 数据定义语言 | 用来定义数据库对象:数据库、表、字段 |
DML | 数据操作语言 | 对数据库中的数据进行增删改查 |
DQL | 数据查询语言 | 查询数据库中表的信息 |
DCL | 数据控制语言 | 用来创建数据库用户,控制数据库的访问权限 |
2.DDL操作:
<1>数据库:
/*创建数据库*/
CREATE DATABASE [IF NOT EXISTS] 数据库名称 [DEFAULT CHARSET 编码格式] [COLLATE 排序规则];
SHOW DATABASES;--查看所有数据库
DROP DATABASE [IF EXISTS] 数据库名称;--删除数据库
USE 数据库名称;--切换使用数据库
<2>表:
--创建表
CREATE TABLE 表名(
列名1 类型 [comment '注释'],
列名2 类型,
列名3 类型,
......
);
SHOW TABLES;--查询当前数据库的所有表
DESC 表名;--查询表结构
SHOW CREATE TABLE 表名;--查询指定表的建表语句
/*拓展内容*/
--快速创建表 复制表结构+数据(只有这些被复制过来了)
CREATE TABLE 表2
AS
SELECT 字段1,字段2... FORM 表1
<3>修改表结构:(有例子)
----添加新列
ALTER TABLE 表名 ADD 字段 类型 [FIRST/AFTER 某字段];
----删除列
ALTER TABLE 表名 DROP 字段;
----修改列属性(类型->另一种类型)
ALTER TABLE 表名 MODIFY 字段 类型;
----修改列名和其属性
ALTER TABLE 表名 CHANGE 字段名(修改前) 字段名(修改后) 类型;
----删除表
DROP TABLE 表名;
----修改表名
ALTER TABLE 表名(前) RENAME 表名(后);--MySQL等
ALTER TABLE 表名(前) RENAME TO 表名(后);--SQLite等
3.DML操作:
----插入数据
INSERT INTO 表名 (字段1,字段2...) VALUES (数据1,数据2...);
----删除数据行
DELETE FROM 表名 WHERE 字段 = ?;
DELETE FROM 表名;--清空表数据
----更新数据行(就是修改某确定行的部分数据)
UPDATE 表名 SET 字段1 = ?,字段2 = ? WHERE 字段3 = ?;
----查看当前数据库
SELECT DATABASE();
/*拓展内容*/
--批量添加
INSERT INTO 表名 VALUES (1,'xxx'),(2,'xxx'),(3,'xxx');
问题解答:
问题2:DELETE 和 TRUNCATE 的区别是什么?
答:两者都可以删除表的全部数据,但是还是有很多区别:
①DELETE 作为数据操作语言DML;TRUNCATE作为数据定义语言DDL
②DELETE FROM 表名;是一条条删数据,直到删完;TRUNCATE保留了表结构,直接删除表后再重建这个表,所有状态相当于新表(这里要是全删TRUNCATE更高效)
③DELETE可以回滚,TRUNCATE隐式提交不能回滚。
④DELETE的表中要是有自增字段,它会从删除的表中的最大值直接往后自增;TRUNCATE删除表后则不会。
拓展:
回滚与删除复原的区别
回滚:通常指的是撤销整个事务或到特定回滚点的所有操作,包括删除、插入、更新等。
删除复原:通常指的是特定于删除操作的数据恢复。这可能涉及到备份、日志或其他数据恢复技术。
总结:虽然TRUNCATE删除也有一些优点,但是它特殊的不能回滚的特性使得操作的代价较大,通常还是以DELETE优先。
4.DQL操作:
<1>基本操作:
--单表查询
select * from 表名;
--查询指定列数据
SELECT 字段1,字段2... FROM 表名;
--用算数运算符查询(不改数据,只查看,适用于已知部分求整体)
SELECT 字段1+数值,字段2-数值,字段3*数值,字段4/数值,字段5%数值... FROM 表名;
--AS取别名,两种形式都可以(别名一般是直观的中文名或英语名,最好加上'')
SELECT 字段1 AS '别名1',字段2 AS '别名2' FROM 表名;
SELECT 字段1 '别名1',字段2 '别名2' FROM 表名;
--DISTINCT去掉重复(去重)
SELECT DISTINCT 字段1... FROM 表名;
--WHERE筛选(<,>,=,<>,!=)
select * from 表名 WHERE 字段1 > 100;
--AND 和 OR 逻辑运算符(AND==&&,OR==||,这里两种皆可,但有的地方不可替代,就像下面的BRTWEEN中)
select * from 表名 WHERE 字段1 > 100 AND 字段2 >100;
select * from 表名 WHERE 字段1 > 100 OR 字段2 >100;
select * from 表名 WHERE 字段1 > 100 && 字段2 >100;
select * from 表名 WHERE 字段1 > 100 || 字段2 >100;
--BRTWEEN区间筛选(大小不要写反,会出错)
select * from 表名 WHERE 字段1 BETWEEN 1 AND 100;
select * from 表名 WHERE 字段1 NOT BETWEEN 1 AND 100;
--IN包含(查询字段中在IN里面出现的值)(以下两个语句等价)
select * from 表名 WHERE 字段1 IN(1,2...);
select * from 表名 WHERE 字段1 = 1 OR 字段1 = 2 OR...;
--LIKE模糊查询(假设查询有'你好!世界'这段话的列,以下为开头,所有,结尾模糊查询)
SELECT * FROM 表名 WHERE 字段1 LIKE '你%';
SELECT * FROM 表名 WHERE 字段1 LIKE '%好%';
SELECT * FROM 表名 WHERE 字段1 LIKE '%界';
拓展.要是想要查询指定位置是否有特定字的列,可以以下这样,用_代替表示前面个数:
SELECT * FROM 表名 WHERE 字段1 LIKE '_好%'; --查第二个字为'好'
SELECT * FROM 表名 WHERE 字段1 LIKE '__!%'; --第三个个字为'!'
--判断是否为空(NULL)(NULL不等于0,注意区分)
SELECT * FROM 表名 WHERE 字段1 IS NULL;
SELECT * FROM 表名 WHERE 字段1 IS NOT NULL;
--小括号()(确定查询优先级,避免意思模糊导致查询错误)
SELECT * FROM 表名 WHERE (字段1=? OR 字段2=?) AND 字段3=?;
SELECT * FROM 表名 WHERE 字段1=? OR (字段2=? AND 字段3=?);
这种就是意思模糊,但是执行的结果是第二种,因为AND优先级比OR高,不推荐使用
SELECT * FROM 表名 WHERE 字段1=? OR 字段2=? AND 字段3=?;
<2>函数使用:(这里选一些常用的函数)
----单行函数 (执行后会出现多行结果)
--大小写转换(会将其中的英文全部转换)
SELECT UPPER(字段),LOWER(字段) FROM 表名;
--REPLACE字符串替换(不会改变原表数据,只是修改了表的查询,最好只用来转字符,转其他的易报错,str都是字符串)
SELECT REPLACE(字段,str1,str2) FROM 表名;
--SUBSTRING字符串截取(begin和len是数字,begin表示开始位置,len表示截取长度)
SELECT SUBSTRING(字段,begin,len) FROM 表名;
--数值函数(abs绝对值,ceil向上取整,floor向下取整,round四舍五入(可留小数),mod取模,pi圆周率,pow次方,sqrt开方)
SELECT abs(-1),ceil(3.2),floor(3.7),round(3.5), mod(10,3),pi(),pow(2,5),sqrt(25) FROM 表名;
SELECT abs(-1),ceil(3.2),floor(3.7),round(3.5), mod(10,3),pi(),pow(2,5),sqrt(25) FROM DUAL;--DUAL是一个虚表,查看专用
SELECT abs(-1),ceil(3.2),floor(3.7),round(3.5), mod(10,3),pi(),pow(2,5),sqrt(25)
查看模拟数据时以上三种都行
--日期函数(CURDATE只有日期,CURTIME只有时间,NOW日期时间,SYSDATE日期时间)
SELECT CURDATE(),CURTIME(),NOW(),SYSDATE() from 表名;
SELECT CURDATE(),CURTIME(),NOW(),SYSDATE() from dual;
--流程函数
--IF区间判断(条件满足时执行1,不满足时执行2)
SELECT *,IF(字段>10,执行1,执行2) FROM 表名;
--IFNULL为空判断(一般是判断字段是否为空,不为空就是字段原先的值,为空就填自定义的某个值)
SELECT *,IFNULL(字段,某个值) FROM 表名;
--WHEN条件语句(用来分组或分类的,比如按工资分为'高','中','低'收入)
SELECT *,
CASE
WHEN id1>=值1 THEN '类1'
WHEN id1>=值2 THEN '类2'
ELSE '类3'
END [AS 别名]
FROM 表名;
--NULLIF特定值置空(这里当字段值为1时,直接将其置空,其他情况为字段原先的值)
SELECT *,NULLIF(字段,1) FROM 表名;
----多行函数 (执行后会只有一行结果)
--最大值
SELECT MAX(字段) FROM 表名;
--最小值
SELECT MIN(字段) FROM 表名;
--求和
SELECT SUM(字段) FROM 表名;
--平均数
SELECT AVG(字段) FROM 表名;
--总数(这里返回行数)
SELECT COUNT(字段) FROM 表名;
三.简单实操(动手)
1.创建数据库和表
1.使用文档创建(*第三部分有解释)
首先我们先在笔记本中创建一个没有使用过的表,名字叫my_database
CREATE DATABASE IF NOT EXISTS my_database;
USE my_database;
CREATE TABLE user (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) DEFAULT NULL,
password VARCHAR(50) DEFAULT NULL
);
2.在命令行中打开mysql直接创建(--单行注释,/**/多行注释)
mysql -u root -p
password:******
mysql> CREATE DATABASE IF NOT EXISTS my_database;
Query OK, 1 row affected (0.01 sec)--表示成功
SHOW DATABASES;--查看添加的数据库
mysql> use my_database;
Database changed--数据库已经更换
mysql> CREATE TABLE user(
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> username VARCHAR(50) DEFAULT NULL,
-> password VARCHAR(50) DEFAULT NULL
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> SELECT * FROM user;--查看存的数据
Empty set (0.01 sec)--现在为空
2.查看表的基本信息(DOS)
要查看新创建的表,可以使用以下命令在命令行窗口中查看:
-
首先登录到 MySQL 命令行
这里将绝对路径放下面是直接执行文档中的sql指令(对应上面):mysql -u root -p <C:\Users\muyuan\Desktop\text.sql
-
输入密码后,选择创建表的数据库(如果不是默认选择的数据库):
USE my_database;
-
使用以下命令查看数据库中的表:
SHOW TABLES;
这将列出选定数据库中的所有表。如果看到了创建的
user
表,则表明该表已成功创建。 -
要查看表的结构(列和其属性),可以使用以下命令:
DESCRIBE user;
这将显示
user
表的列及其相关属性,如数据类型、是否允许为空等,并不是查看表中的数据(标题三有提到) -
查看如下:
3.对表的操作:(SQL)
1.插入数据:
当我们执行了上面的USE my_database;后,我们可以对这个表中的数据进行操作了,下面我们向表中插入一行数据
INSERT INTO user (id, username, password) VALUES (123, 'xiaoli', '456');
2.查看数据:
插入完成后,我们可以查看一下是否有这个人
SELECT * FROM user;
执行后:
这里验证了插入操作是可行的!
然后我们再次往里面添加元素,添加后:
3.排序:
首先我们可以先试着对id进行排序,这里我们添加的时候是顺序添加的,所以排序来个逆序吧
SELECT * FROM user ORDER BY id DESC;//DESC表示逆序,大->小
排序如下:
说明:这种排序是不会将原始的表中数据打乱重新按id顺序排列的,只不过是我们使用了一个排序条件让表中的数据按顺序排列出来了,让我们更好的观察和分析数据而已。
NO.49
持续更新中......
以上文章内容仅代表个人观点,请自行参考,如有错误敬请斧正!