MySQL学习笔记

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`;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值