Mysql基本操作
< 返回列表时间: 2020-01-19来源:OSCHINA
【围观】麒麟芯片遭打压成绝版,华为亿元投入又砸向了哪里?>>> 查看 mysql 中已经有的数据库


二、删除已经有的数据库 school


三、创建新数据库 myschool


四、进入到 myschool 中


五、查看 myschool 库中所有的表


六、新建一张 student 表


七、查看 student 表结构


八、插入两个学生的信息


九、再次查询表中数据


十、给 student 表添加两列 :age 和 sex,age 默认值为 0,sex 默认值为 ’m’


十一、给 student 表插入 zhangsan 这个学生信息,性别与 age 都使用默认值


十二、给 student 表插入 zhansan 这个学生信息,性别与 age 不使用默认值


十三、修改 sex 列的类型由 char(4) 改为 char(8)


十四、修改 sex 列名为 gender


十五、修改表名由 student 变为 stu


十六、新建表 score


十七。给 score 设置联合主键 (stuId,subject)


十八、给 score 设置外健列 stuId, 使它引用 stu 表的 id


十九、给 score 表添加四行数据,分别是 tome,jim,zhangsan 的 C++ 和 Java 考试成绩


二十、再添加一条 10 号学生的 java 成绩(其实这个学生在 stu 表中根本不存在,我们用此操作引发的错误来验证联合主键与外键)


二十一、修改所有学生 C++ 考试成绩都为 100


二十一、为了不重名,我们修改 score 表中的 score 列名为 exam_score


二十二 . 修改 1 号学生 C++,Java 考试成绩都为 89


二十二 . 只修改 1 号学生 Java 考试成绩都为 30



二十三,删除学号为 2 的学生的 Java 成绩


二十三,删除学号为 3 的学生的所有成绩


二十四、为了测试的需要,再给学生表添加 5 条数据


二十五、修改 tom 的 age 为 21 , jim 为 22 岁


二十六、查询 5 号学生的全部信息(共 4 列)


二十七、查询 5 号学生的学号和姓名信息( 2 列)


二十八、查询小于 5 号(不包括 5 号)学生的学号和姓名信息( 2 列)


二十九、查询小于 5 号(包括 5 号)学生的学号和姓名信息( 2 列)


三十、查询大于 5 号(不包括 5 号)学生的学号和姓名信息( 2 列)


三十一查询大于 5 号(包括 5 号)学生的学号和姓名信息( 2 列)


三十一查询大于 3 号(包括 3 号)且小于 7 (包含 7 号)学生的学号和姓名信息( 2 列)


三十一查询大于 3 号(包括 3 号)且小于 7 (包含 7 号)学生的学号和姓名信息( 2 列)用 between....and


三十二、查询 3 , 5 , 7 , 9 号学生学号和姓名信息( 2 列)


三十二、查询 3 , 5 , 7 , 9 号学生学号和姓名信息( 2 列)
用 in 运算符



三十三、查询不是 3 , 5 , 7 , 9 号学生学号和姓名信息( 2 列)
用 not in 运算符




34. 若某一列可以为 null, 如果输入 null 值呢?
当你插入一行新数据的时候,忽略想输入 null 值的列,则它的值自然就是 null. 也可以赋值时给个 NULL, 但 NULL 绝不能加双引号,比如 ”NULL”, 那成了字符串,是有数据的,只不过内容是 NULL.


可以通过如下方式验证:


查询学生表中性别不为 null 的信息


查询姓名是以 ”s” 开头的学生信息


查询姓名中第 2 个字母是 s 的学生信息


查询姓名由 5 个字母构成的学生记录


查询姓名由 5 个字母构成,并且第 5 个字母为“ i ”的学生记录




查询姓名中包含“ a ”字母的学生记录




创建部门表 dept


创建员工表 emp





查询出部门编号为 30 的所有员工




只查询 emp 表中的 job 列


发现有大量的重复结果
去除重复记录
想去除重复记录,需要使用 DISTINCT :



查看雇员的月薪与佣金之和


发现了问题,如 smith 的月薪和佣金之和是 null
comm 列有很多记录的值为 NULL ,因为任何东西与 NULL 相加结果还是 NULL ,所以结算结果可能会出现 NULL 。下面使用了把 NULL 转换成数值 0 的函数 IFNULL :
SELECT *,sal+IFNULL(comm,0) FROM emp;




可以给查询结果列起列名(别名)


给列起别名

给表起别名


起别名时,可以加 as, 也可以省略不写


查询所有员工记录,按 sal 升序排序


若是升序排列, asc 可以不写


查询所有员工记录,按 sal 降序排序


查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序


查询某列 (sal 列 ) 的工资和(纵向运算)


查询某列 (sal 列 ) 的工资平均值


查询某列 (sal 列 ) 的工资最高值


查询某列 (sal 列 ) 的工资最低值


统计有工资的员工总数


统计有奖金的员工总数


统计共有员工数量


在一个 sql 语句中同时使用多个聚合函数


在一个 sql 语句中同时使用多个聚合函数






我想查询一下每个部门共几个员工? ( 分组 + 聚合函数 )
分组要用到一个关键字 (group by)
先分组后统计


我想统计一下每个部门工资总数和平均数? ( 分组 + 聚合函数 )


我想查询一下 10 号部门共几个员工? ( 分组 + 聚合函数 )
分组后若要再加条件(过滤),就不能使用 where, 而要使用 having( 即 group by 后面不能出现 where, 只能出现 having)


统计一下 10 号部门工资总数和平均数



查询所有员工的员工编号,姓名,所在部门的部门名称,及部门所在城市



两张表连接查询还可以细节分出两大类:
外连接
左外连接:以左表作为基准(左表中的数据必须全部显示,右表中和左边有关的数据才显示,无关的数据不显示)



右外边接 : 以右表作为基准(右表中的数据必须全部显示,左表中和右边有关的数据才显示,无关的数据不显示)



内连接:既不以左表为基准,也不以右表为基准,而是把两张表相关的数据配合显示


分页查询
Limit
LIMIT 用来限定查询结果的起始行,以及总行数。








查询出部门编号为 30 的所有员工


所有销售员的姓名、编号和部门编号。


找出奖金高于工资的员工。


找出奖金高于工资 12% 的员工。


找出部门编号为 10 的所有经理,和部门编号为 20 的所有销售员的详细资料。


找出部门编号为 10 的所有经理,和部门编号为 20 的所有办事员的详细资料。



找出部门编号为 10 中所有经理,部门编号为 20 中所有办事员,还有既不是经理又不是办事员但其工资大或等于 2000 的所有员工详细资料


无奖金或奖金低于 1000 的员工。


查询名字由四个字组成的员工。


查询 1981 年入职的员工。


查询所有员工详细信息,用编号升序排序


查询所有员工详细信息,用工资降序排序,如果工资相同使用入职日期升序排序


查询每个部门的平均工资


查询每个部门的雇员数量。


查询每个工种的最高工资、最低工资、人数


从事同一工作雇员的月工资的总和


显示非销售人员工作名称以及从事同一工作雇员的月工资的总和


子查询
对于某些复杂的查询,我们可以先查询出一个结果集,然后将此结果集当做一张虚拟表,然后再从这张虚拟表中进行更进一步查询。获得最终要的结果。
那么能查询出虚拟表的那条查询 sql 就称为子查询 .
例如:查询出部门编号为 30 的所有员工



经验:通过子查询你可以实现层层过滤
查询 20 部门所有员工详细信息,用工资降序排序。




查询 20 号部门中没有奖金但工资大于 2000 的员工



显示非销售人员工作名称以及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于 5000 ,输出结果按月工资的合计降序排列


有奖金的工种。


查出至少有 4 个员工的部门。显示部门编号、部门名称、部门位置、部门人数。


列出所有员工的姓名及其直接上级的姓名。


列出入职日期早于直接上级的所有员工的编号、姓名、部门名称。


列出部门名称和这些部门的员工编号和员工姓名,同时列出那些没有员工的部门。


列出最低薪金大于 3000 的各种工作及从事此工作的员工人数。


列出在销售部工作的员工的姓名,假定不知道销售部的部门编号。


列出薪金高于公司平均薪金的所有员工信息,所在部门名称,上级领导。



显示员工的编号,姓名,职位,所在部门的名称


创建一个视图,将上面查询出来的虚拟表“固化”到数据库,可以永久保持。


在已有视图上定义新视图



删除视图


创建视图时可以指定视图中出现的列的列名(相当于物理列的别名)


创建一个视图,用来展示每个部门员工人数


下面先改一下 mysql 的分隔符


创建一个存储过程,用来查询 stu 表


调用上面的存储过程


删除存储过程


存储过程也可以像 java 一样定义局部变量
create procedure pro2()
begin
declare v_id int;
set v_id=12;
select * from stu where id=v_id;
end;


存储过程也可以像 java 一样具有条件分支(流程控制)



存储过程也可以像 java 一样具有循环



存储过程也可以像 java 一样定义形参,不过,它的形参分两种,有输入形式,有输出形参,用 in 和 out 关键字区分


形参可以定义多个


定义有输出参数和输入参数的存储过程


调用存储过程,传入 7788, 定义系统变量 @sal , 用来存储返回值,然后用 select 打印出来


mysql 存储过程很像 java 中无返回值的方法
mysql 函数很像 java 中有返回值的方法
因为存储过程可以不返回,但函数必须有返回值,必须返回


注意:在 begin 上面的 return 必须加 s









热门排行