文章目录
mySql数据库学习笔记
- 非专业的,如果有啥错误欢迎支出
常用脚本命令
- 连接数据库
- mysql -uroot;
- 退出连接
- quit;
- 查询当前服务器下所有的数据库
- show databases;
- 进入某个数据库
- use 数据库名称
- 查询数据库下的所有数据表
- show tables;
- 查看表的的所有列字段信息
- desc 表名;
- 脚本模式导入sql
- mysql -uroot< 脚本文件路径
mysql数据类型和约束
- 数值类型—可加可不加引号(插值时)
- Tinyint 微整形 占一个字节 8位 范围 -128~127
- Smallint 小整形 占2个字节 范围 -32768~32767
- Int 整形 占4个字节 范围 -2147483648~2147483647
- Bigint 大整形 占8位
- 浮点型
- Float 单精度浮点型 占4位
- Double 双精度浮点型 占8位
- Decimal 定点小数
- 布尔型–不能加引号(插值时)
- Boolean 布尔型 只有两个值 只有true(真)和false(假) 这两个字不能加引号,使用的时候会自动转为tinyint, 通常用来存储两个结果的值
- 日期型—必须加引号(插值时)
- Date 日期 2020-12-25
- Time 时间 16:20:59
- Datetime 日期时间型 2020-12-25 16:20:59
- 字符串型 —必须加引号(插值时)
- VARCHAR(长度) 变长字符串 65535
- CHAR(长度) 定长字符串 操作数度比较快 255 固定长度的可以用
- TEXT 大型字符串 最大值2G
- 列约束
- PRIMARY KEY 主键约束,声明了主键约束上不允许插入重复值防止数据重复,一个表里只能有一个主键约束,特点是不能为空值通常加在编号上 会自动排序 加快查找数度,主键约束不能为NULL,NULL 表示无法确定的值 为空。
- UNIQUE 唯一约束,声明了唯一约束的列上不能插入重复的值,但是会影响排序 值可以为为 null
- NOT NULL 非空约束,值不能为null
- DEFAULT 默认约束 DEFAULT 123
- CHECK 检查约束,price DECIMAL(5.2) check(price>0) MYSQL不支持这个约束。
- KEY(当前表要关联的字段) REFERENCES 要关联的表名(关联的字段) 外键约束,他的取值范围必须到另一个主键去找,并且两个必须是一个类型
- Auto_increment 自增长列,自动获取当前的最大值,然后加一插入,这个必须和主键约束一起用,如果设置自增列,必须赋值为null 再次应许使用nill,只合适使用在整数型上,赋值null才能实现自增效果 (eid INT PRIMARY KEY Auto_increment)
创建表的通用逻辑
-
设置编码集和判断数据库存在丢弃。
SET NAMES UTF8; #设置编码 DROP DATABASE IF EXISTS basesName; # 如果数据库存在就先删除 CREATE DATABASE basesName CHARSET=UTF8; # 创建数据库并设置编码 USE basesName; # 进入数据库
-
创建数据库
SET NAMES UTF8; #设置编码 DROP DATABASE IF EXISTS kv; # 如果数据库存在就先删除 CREATE DATABASE kv CHARSET=UTF8; # 创建数据库并设置编码 USE kv; # 进入数据库 # 部门表 CREATE TABLE dept( cid INT PRIMARY KEY Auto_increment, bname VARCHAR(5) UNIQUE # 部门名称 ); INSERT INTO dept VALUES(1,'研发部'); INSERT INTO dept VALUES(2,'销售部'); INSERT INTO dept VALUES(3,'财务部'); # 员工表 CREATE TABLE user( did INT PRIMARY KEY Auto_increment, #INT类型并设置主键约束并且自增长 dname VARCHAR(5) UNIQUE NOT NULL, #姓名 设置唯一约束和非空约束 sex CHAR(2) DEFAULT '保密', #性别 birthday DATE, #生日 salary DECIMAL(6.2), #工资 deptid INT, Foreign KEY(deptid) REFERENCES dept(cid) #部门编号 ); INSERT INTO user VALUES(1,'张好好','男','1996-4-16','5999',1); INSERT INTO user VALUES(null,'小明','男','1926-4-16','6999',2); INSERT INTO user VALUES(null,'小红','女','1926-2-16','3999',3);
添加数据
# 全量添加
INSERT INTO user VALUES(1,'张好好','男','1996-4-16','5999',1);
# 指定添加那些字段的值
INSERT INTO user (dname,sex,birthday,salary,deptid) VALUES ('小a','男','2023-09-22',10000,1);
简单查询
不带任何条件查询
# SELECT 字段1,字段2 FROM 表名;
SELECT dname,sex FROM user;
# 查全部字段
SELECT * FROM user;
AS关键字
-
给列字段取别名
SELECT dname AS 姓名, sex AS 性别 FROM USER; # 不用AS关键字也可以取别名 SELECT dname 姓名, sex 性别 FROM USER; SELECT dname A, sex B FROM USER;
DISTINCT关键字
-
查询某个列如果如果有相同时,只是显示一个
SELECT DISTINCT sex FROM USER;
查询时执行计算
-
查询时进行计算,不影响原数据
SELECT 1+5+87+6+5; # 查询时对工资字段进行+-*/计算,查询的数据是计算后的结果,该计算不会影响表中的原数据。 SELECT dname,salary*12 FROM user; # 计算年薪
ORDER BY 关键字
-
查询排序 ORDER BY 按那一列排 ASC 升序 DESC 降序
# 按工资升序查询 SELECT dname,sex,salary FROM user ORDER BY salary ASC; # 降序 SELECT dname,sex,salary FROM user ORDER BY salary DESC;
WHERE 关键字
-
按条件查询
SELECT * FROM user WHERE salary=5999; SELECT * FROM user WHERE salary>5999; SELECT * FROM user WHERE salary!=5999; SELECT * FROM user WHERE salary>=5999; SELECT * FROM user WHERE salary<=5999;
IS关键字
-
IS 是什么的意思,好像只能匹配null,关键字 需要配合WHERE使用
# 查询salary是null的数据 SELECT * FROM user WHERE salary IS null;
IS NOT 关键字
-
IS NOT 不是什么的意思
# 查询salary不是null的数据 SELECT * FROM user WHERE salary IS NOT null;
AND关键字
-
AND 并且的意思
SELECT * FROM user WHERE salary>5000 AND salary>6000; SELECT * FROM user WHERE salary>5000 AND sex='男';
OR关键字
-
OR 或者的意思
SELECT * FROM user WHERE salary=5999 OR salary=6999;
BETWEEN 关键字
-
BETWEEN 两个之间
SELECT * FROM user WHERE salary BETWEEN 4000 AND 7000;
NOT BETWEEN 关键字
-
NOT BETWEEN 不存在的意思
# 查询工资不在4000 && 7000之间的 SELECT * FROM user WHERE salary NOT BETWEEN 4000 AND 7000;
IN和NOT IN 关键字
-
IN和NOT IN
# 查询deptid=1和2的数据 SELECT * FROM user WHERE deptid IN(1,2); # 查询deptid不等于1和2的数据 SELECT * FROM user WHERE deptid NOT IN(1,2); SELECT * FROM user WHERE salary NOT IN(5999,3999);
模糊查询
-
LIKE 关键字包含的意思, 加%号进行匹配
# 匹配已什么开头 SELECT * FROM user WHERE dname LIKE '好%'; # 前后都匹配,全量匹配 SELECT * FROM user WHERE dname LIKE '%好%';
分页查询
-
LIMIT 关键字 限制,开始位置,结束位置
# 第一条从0开始, SELECT * FROM user LIMIT 0,5;
聚合函数
-
函数是一个功能体
# COUNT() 计算个数的函数 # SUM() 求和 # AVG() 求平均 # MAX() 求最大 # MIN() 求最小 # YEAR() 获取日期中年份 # 查询员工总数 SELECT COUNT(did) FROM user; # 求工资总和 SELECT SUM(salary) FROM user; # 求员工的平均工资 SELECT AVG(salary) FROM user; # 查询最高工资并同时查询其他字段 SELECT MAX(salary),dname,sex,birthday FROM user WHERE sex='男'; # 查询工资最低 SELECT MIN(salary) FROM user; # 查询日期中的年 SELECT YEAR(birthday) FROM user;
分组查询
-
GROUP BY 按什么分组
# 按部门id分组 SELECT MAX(salary),MIN(salary),AVG(salary),deptid FROM user GROUP BY deptid; # 按性别分组 SELECT MAX(salary),MIN(salary),AVG(salary),sex,deptid FROM user GROUP BY sex;
复杂查询
子查询
# 查询研发部有那么员工--先查询研发部的cid,在根据cid作为条件去员工表查询员工的deptid的cid的员工
SELECT * FROM user WHERE deptid=(SELECT cid FROM dept WHERE bname='研发部');
# 查询出比张好好工资高的人--先查询张好好的工资,在把这个工资作为条件去查询
SELECT * FROM user WHERE salary>(SELECT salary FROM user WHERE dname='张好好');
# 查询和张好好同一年出生的人--YEAR(日期) 提取出日期中的年,查询出张好好的生日,提取出年份,作为条件去查询在同一年的出生的员工,并排除掉张好好本人
SELECT * FROM user WHERE YEAR(birthday)=(SELECT YEAR(birthday) FROM user WHERE dname='张好好') AND dname!='张好好';
多表查询
#查询所有的员工姓名,和部门名称 条件 deptid的值要等于cid的值--问题:无法查询没有部门的员工 也无法查询没有员工的部门,
SELECT * FROM user,dept WHERE deptid=cid;
SELECT dname,sex,bname FROM user,dept WHERE deptid=cid;
内连接
- INNER JOIN ON也是写条件的意思
#内连接 INNER JOIN ON 也是写条件的意思 和上面的多表查询意思是一样的
SELECT dname AS 姓名,bname AS 部门 FROM user INNER JOIN dept ON deptid=cid;
SELECT * FROM user INNER JOIN dept ON deptid=cid;
左外连接
- LEFT OUTER JOIN
# 先写那个表,那个表就是左 里面会显示所有的记录,即使没有对应的数据 left outer join
SELECT dname,bname FROM user LEFT OUTER JOIN dept ON deptid=did;
SELECT dname,bname FROM dept LEFT OUTER JOIN user ON did=deptid;
右外连接
- RIGHT OUTER JOIN
先写那个表,那个表就是右
SELECT dname,bname FROM user RIGHT OUTER JOIN dept ON deptid=did;
全连接
- FULL JOIN 但是mysql并不支持这种连接
删除数据
DELETE FROM user WHERE did='6';
# 可结合AND 或者 OR 等关键字进行组合条件使用
修改数据
UPDATE user SET dname='111',birthday='1911-12-12' WHERE did='1';
# 可结合AND 或者 OR 等关键字进行组合条件使用
其它SQL语句
修改表的某列的信息
# 修改dept表的现有dname字段,改名为bname,以及其它信息
ALTER TABLE `dept` CHANGE `dname` `bname` VARCHAR(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
往已存在的数据表中添加一个列字段
# 往user表的sex字段后面添加一个phone字段
ALTER TABLE `user` ADD `phone` VARCHAR(11) NULL DEFAULT NULL AFTER `sex`;