写在前面:
数据库语句,每条语句都要以英文分号作为结尾数据库语句,不区分大小写数据库语句、表名、库名、字段名这些信息不能使用关键字,若非要使用,需要加上反引号(英文模式下 键盘ESC下边的按键)在创建库的时候,如果要创建的库的名字已经存在,就会报错,所以使用语句 create database if not exists db_name; 就不会报错,仅当库不存在的时候,创建库
指定列插入:
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; 不写条件删除整张表
以表中某一字段作为分组依据对表中数据进行统计查询 但是分组查询时,查询信息,只能是分组依据字段或者聚合函数 聚合函数:
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='英文';