关于MySQL数据库的一些操作

    科技2022-07-13  121

    写在前面:

    数据库语句,每条语句都要以英文分号作为结尾数据库语句,不区分大小写数据库语句、表名、库名、字段名这些信息不能使用关键字,若非要使用,需要加上反引号(英文模式下 键盘ESC下边的按键)

    库的操作

    查看库:show databases;创建库:create database db_name;删除库:drop database db_name;使用库:use db_name;

    在创建库的时候,如果要创建的库的名字已经存在,就会报错,所以使用语句 create database if not exists db_name; 就不会报错,仅当库不存在的时候,创建库

    常用的数据类型

    数值类型

    数据类型大小说明对应 C 类型BIT[(M)]M指定位数,默认为1二进制数,M范围从 1 到 64 ,存储数值范围从0 到2^M-1char[]TINYINT1 字节signed charSMALLINT2 字节shortINT4字节intBIGINT8字节long longFLOAT(M, D)4字节单精度,M指定长度, D指定小数位数。会发生精度丢失floatDOUBLE(M, D) 8字节doubleDECIMAL(M, D)M/D最大值 + 2双精度,M指定长度,D表示小数点位数。精确数值char[]MUMERIC(M, D)M/D最大值 + 2和DECIMAL一样char[]

    字符串类型

    数据类型大小说明对应的 C 类型VARCHAR(SIZE)0 ~ 65 535 字节可变长度字符串char[]TEXT0 ~ 65 535字节长文本数据char[]MEDIUMTEXT0 ~ 16 777 215 字节中等长度文本数据char[]BLOB0 ~ 65 535字节二进制形式的长文本数据char[]

    日期类型

    数据类型大小说明对应的 C 类型DATETIME8字节范围从 1000 到 9999 年,不会进行时区的检索及转换MYSQL_TIMETIMESTAMP4字节范围从 1970 到 2038 年,自动检索当前时区并进行转换MYSQL_TIME

    数据库中表的操作

    显示库中所有表:show tables;创建表:create table tb_name(fields1 type, fields2 type,……) 示例:create table if not exits tb_stu(id int, name varhcar(3),age int);查看表结构:desc tb_name;删除表:drop table tb_name;

    数据库表中的数据增删改查基础

    添加数据 [insert]

    指定列插入:

    insert [into] tb_name(field1,field2,…)values(val1,val2,…); 插入的值必须与字段顺序一致

    全列插入:

    insert [into] tb_name values(…); 必须给与所有列的数据,并且必须跟表中字段顺序相同

    多行插入:

    insert [into] tb_name values(val1,val2,…),(val1,val2,…),…;

    查询数据

    全列查询:select * from tb_name;

    指定列查询:select fields1, fields2,…from tb_name;

    排序查询:select *from tb_name order by fields_name[asc]/desc 默认 asc 升序排序,desc 为降序排序

    多列排序:在第一列相同的情况下针对第二列进行查询:select * from tb_name order by fields1,fields2;

    分页查询:通常搭配排序一起使用 在所有数据中只要前 n 条:select * from tb_name limit n; 从第 s 条开始查询前 n 条:select *from tb_name limit n offset s;

    数据去重:select distinct age,name from tb_name; 根据第一字段进行数据去重,查看去重后这个字段的数据

    条件查询:关键字 where 比较运算符: 基础的比较运算符:<,>,>=,<=,!=,=,<>,<=>

    NULL值的比较 IS NULL / IS NOT NULL

    IN的使用:判断查询数据是否符合给与的多个数据选项之一 select * from tb_name where name in(“张三”,“李四”); 查询名字等于张三或者李四的数据

    BETWEEN…AND…的使用:查询范围是介于两个值之间则返回 select *from tb_name where math between 50 and 70;

    LIKE模糊匹配的使用: select *from tb_student where name like “张%”;

    逻辑运算符:与-and 或-or 非-not

    修改数据:update 例:update tb_name set fields1=val1,fields2=val2 where condition; 一定不要忘了约束条件,不然就修改了整张表的数据

    删除数据:delete delete from tb_name where condition; 不写条件删除整张表

    数据库表约束

    非空约束 – NOT NULL:描述指定字段必须插入数据 create table if not exists tb_class(id int NOT NULL,name varchar(32)); id 不能为空唯一约束 – UNIQUE:描述指定字段不能出现两个相同的数据(在唯一键约束下,可以重复 NULL 值) create table if not exists tb_course(id is not null,name varchar(32) unique); 名字不能重复主键约束 – PRIMARY KEY:非空且唯一,相比较月非空且唯一之外,一张表中只能有一个主键 create table if not exists tb_classes(id int primary,name varchar(32));组合主键:在组合主键中所有的主键字段数据相同的,数据才算重复。 create table if not exists tb_course(id int,name varchar(32),primary key(id,name));外键约束:当前表中的指定字段的数据受到其他表中指定字段的约束。现在要向学生表中添加一条学生信息,学生信息中有班级,但是添加的这条学生信息的班级,在班级表中查不到,则在外键约束的条件下,插入就不能成功,如果没有设置外键约束,在没有班级的情况下,就成功插入了,这是不合理的。check字句约束: 示例:create table if not exists tb_stu(id int primary key, sex varchar(1),check(sex=‘男’ or sex=’'女));

    分组查询

    以表中某一字段作为分组依据对表中数据进行统计查询 但是分组查询时,查询信息,只能是分组依据字段或者聚合函数 聚合函数:

    COUNT([DISTINCT] expr) 返回查询到的数据的 数量SUM([DISTINCT] expr) 返回查询到的数据的 总和,不是数字没有意义AVG([DISTINCT] expr) 返回查询到的数据的 平均值,不是数字没有意义MAX([DISTINCT] expr) 返回查询到的数据的 最大值,不是数字没有意义MIN([DISTINCT] expr) 返回查询到的数据的 最小值,不是数字没有意义

    举个分组查询的例子

    create table emp( id int primary key auto_increment, name varchar(20) not null, role varchar(20) not null, salary numeric(11,2) ); insert into emp(name, role, salary) values ('张三','服务员', 1000.20), ('李四','游戏陪玩', 2000.99), ('王麻子','游戏角色', 999.11), ('李二狗','游戏角色', 333.5), ('王老五','游戏角色', 700.33), ('陈师傅','董事长', 12000.66);

    查询每个角色的最高工资、最低工资和平均工资 select role,max(salary),min(salary),avg(salary) from emp group by role;

    分组查询时,要进行条件过滤不能使用 where 语句 而是使用 having,例如查询平均信息大于1000的岗位 select role,avg(salary) from emp group by role having avg(salary) > 1000;

    联合查询

    内连接

    语法:

    select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;

    外连接

    外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。

    – 左外连接,表1完全显示 select 字段名 from 表名1 left join 表名2 on 连接条件;– 右外连接,表2完全显示 select 字段 from 表名1 right join 表名2 on 连接条件;

    自连接

    自连接是指在同一张表连接自身进行查询 示例: 显示所有“计算机原理”成绩比“Java”成绩高的成绩信息

    SELECT stu.*, s1.score Java, s2.score 计算机原理 FROM score s1 JOIN score s2 ON s1.student_id = s2.student_id JOIN student stu ON s1.student_id = stu.id JOIN course c1 ON s1.course_id = c1.id JOIN course c2 ON s2.course_id = c2.id AND s1.score < s2.score AND c1.NAME = 'Java' AND c2.NAME = '计算机原理';

    子查询

    单行子查询:返回一行记录的子查询 示例:查询“张三”同学的同班同学 select * from student where classes_id=(select classes_id from student where name=‘张三’);

    多行子查询:返回多行记录的子查询 示例:查询“语文”或“英文”课程的成绩信息 [not]IN关键字 和**[NOT]EXISTS**关键字 – 使用IN select * from score where course_id in (select id from course where name=‘语文’ or name=‘英文’); – 使用 NOT IN select * from score where course_id not in (select id from course where name!='语文’and name!=‘英文’); – 使用 EXISTS select * from score sco where exists (select sco.id from course cou where (name=‘语文’ or name=‘英文’) and cou.id = sco.course_id); – 使用 NOT EXISTS select * from score sco where not exists (select sco.id from course cou where(name!=‘语文’ and name!=‘英文’) and cou.id = sco.course_id);

    合并查询

    为了合并多个select的执行结果,可以使用集合操作符 union,union all

    union 该操作符用于取得两个结果集的并集。当使用该操作符时, 会自动去掉结果集中的重复行。 案例:查询id小于3,或者名字为“英文”的课程: select * from course where id<3 union select * from course where name='英文'; -- 或者使用or来实现 select * from course where id<3 or name='英文'; union all 该操作符用于取得两个结果集的并集。当使用该操作符时,不会去掉结果集中的重复行。 案例:查询id小于3,或者名字为“Java”的课程 -- 可以看到结果集中出现重复数据Java select * from course where id<3 union all select * from course where name='英文';
    Processed: 0.019, SQL: 8