-
内容回顾:
- 数据库相关
-
查询所有: show databases;
-
创建: create database db1 charset=utf8/gbk;
-
查看数据库信息: show create database db1;
-
删除数据库: drop database db1;
-
使用数据库: use db1;
- 表相关
-
创建: create table t1(name varchar(20),age int)charset=utf8/gbk;
-
查询所有: show tables;
-
查看表信息: show create table t1;
-
表字段: desc t1;
-
删除表: drop table t1;
-
修改表名: rename table t1 to t2;
-
添加字段: alter table t1 add age int first/ after xxx;
-
删除字段: alter table t1 drop age;
-
修改字段: alter table t1 change 原名 新名 新类型;
- 数据相关
- 插入数据: insert into t1(字段1名,字段2名) values(值1,值2),(值1,值2),(值1,值2);
数据相关SQL
create database day2db charset=utf8;
use day2db;
create table person(name varchar(50),age int)charset=utf8;
insert into person values(“刘德华”,50);
中文问题:
-
错误原因是客户端和MySQL之间编解码字符集不一致导致的
-
解决方案: 修改MySQL的解码字符集为gbk
set names gbk;
- 查询数据
-
格式: select 字段信息 from 表名 where 条件;
-
举例:
insert into person values(‘刘备’,40),(‘关羽’,30),(‘悟空’,20),(‘八戒’,10),(‘张学友’,5);
-
select name from person;
-
select name,age from person;
-
select * from person;
-
select * from person where age=50;
-
select age from person where name=“悟空”;
- 修改数据
-
格式: update 表名 set 字段名=值 where 条件;
-
举例:
-
update person set age=88 where name=‘刘备’;
-
update person set name=‘张飞’,age=18 where name=‘关羽’;
-
update person set name=‘黎明’ where age=5;
- 删除数据
-
格式: delete from 表名 where 条件;
-
举例:
-
delete from person where name=‘张飞’;
-
delete from person where age<30;
-
delete from person;
综合练习题:
-
创建数据库day1db 字符集utf8并使用
-
创建t_hero表, 有name字段 字符集utf8
-
修改表名为hero
-
最后面添加价格字段money, 最前面添加id字段, name后面添加age字段
-
表中添加以下数据: 1,李白,50,6888 2,赵云,30,13888 3,刘备,25,6888
-
查询价格为6888的英雄名
-
修改刘备年龄为52岁
-
修改年龄小于等于50岁的价格为5000
-
删除价格为5000的信息
-
删除表, 删除数据库
drop table hero;
drop database day1db;
主键约束
-
主键: 表示数据唯一性的字段称为主键
-
约束: 创建表时给表字段添加的限制条件
-
主键约束: 限制主键的值 唯一且非空
-
如何使用:
-
use day2db;
-
create table t1 (id int primary key,name varchar(50))charset=utf8;
-
insert into t1 values(1,“aaa”);
-
insert into t1 values(1,“bbb”); //报错 主键值重复
-
insert into t1 values(null,“ccc”);
主键约束+自增
-
自增规则: 从历史最大值基础上+1
-
如何使用: create table t2(id int primary key auto_increment,name varchar(50))charset=utf8;
-
insert into t2 values(null,“aaa”);
-
insert into t2 values(null,“bbb”);
-
insert into t2 values(10,“ccc”);
-
insert into t2 values(null,“ddd”);
-
delete from t2 where id>=10;
-
insert into t2 values(null,“eee”);
SQL语句分类
-
DDL: 数据定义语言,包括数据库相关和表相关的SQL语句
-
DML: 数据操作语言, 包括增删改查
-
DQL: 数据查询语言, 只包含select查询相关的SQL语句
-
TCL: 事务控制语言
-
DCL: 数据控制语言
数据类型
- 整数: int(m)和bigint(m) m代表显示长度, m=5 存18 查询得到00018
create table t3(age int(5) zerofill);
insert into t3 values(18);
select * from t3;
- 浮点数: double(m,d) m代表总长度,d代表小数长度 , 存23.212 m=5 d=3
create table t5(price double(5,3));
insert into t5 values(23.32123);
insert into t5 values(233.32123); //报错
-
字符串:
- char(m), 固定长度, m=10 存abc 占10, 执行效率略高, 当保存数据的长度相对固定时使用, 最大值255
- varchar(m),可变长度,m=10 存abc 占3,更节省空间, 最大值65535 但推荐保存短的数据(255以内)
- text(m),可变长度, 最大值65535,建议保存长度大于255的
-
日期:
- date, 只能保存年月日
- time, 只能保存时分秒
- datetime, 保存年月日时分秒, 默认值为null , 最大值 9999-12-31
- timestamp(时间戳,距离1970年1月1日的毫秒数),保存年月日时分秒,默认值为当前系统时间,最大值 2038-1-19
create table t6(t1 date,t2 time,t3 datetime,t4 timestamp);
insert into t6 values(“2022-5-15”,null,null,null);
insert into t6 values(null,“14:20:25”,“2011-10-22 10:20:30”,null);
导入*.sql批处理文件
-
从老师工程中得到emp.zip 从idea中复制粘贴到 某个磁盘的根目录 ,然后右键解压到当前文件夹, 在根目录下出现emp.sql文件
-
在客户端中 执行 source f:/emp.sql;
-
执行以下SQL语句 检查是否成功
show tables; //检查是否出现了 emp和dept两个表
select * from emp; //检查是否出现了数据, 如果出现乱码 执行set names utf8; 如果格式错乱 正常
去重distinct
- 查询员工表中所有不同的工作
select distinct job from emp;
- 查询员工表中出现了哪几个不同的部门id?
select distinct dept_id from emp;
is null和is not null
- 查询有领导的员工姓名和领导id
select name,manager from emp where manager is not null;
- 查询没有领导的员工姓名
select name from emp where manager is null;
and 和 or
- 查询1号部门工资高于2000的员工信息
select * from emp where dept_id=1 and sal>2000;
- 查询3号部门或工资等于5000的员工信息
select * from emp where dept_id=3 or sal=5000;
- 查询出孙悟空和猪八戒的员工信息
select * from emp where name=“孙悟空” or name=“猪八戒”;
比较运算符 > < >= <= = !=和<>
- 查询工资大于等于3000的员工信息
select * from emp where sal>=3000;
- 查询工作不是程序员的员工信息(两种写法)
select * from emp where job!=“程序员”;
select * from emp where job<>“程序员”;
between x and y 两者之间
- 查询工资在2000到3000之间的员工信息
select * from emp where sal>=2000 and sal<=3000;
select * from emp where sal between 2000 and 3000;
select * from emp where sal not between 2000 and 3000;
in关键字
- 查询工资等于5000,1500,3000的员工信息
select * from emp where sal=5000 or sal=1500 or sal=3000;
select * from emp where sal in(5000,1500,3000);
select * from emp where sal not in(5000,1500,3000);
综合练习题
- 查询1号部门有哪几种不同的工作
select distinct job from emp where dept_id=1;
- 查询1号部门中有上级领导的员工信息
select * from emp where dept_id=1 and manager is not null;
- 查询工作是程序员,销售和人事的员工信息
select * from emp where job in(“程序员”,“销售”,“人事”);
- 查询工资不在1000-2000之间的员工信息
select * from emp where sal not between 1000 and 2000;
- 查询有奖金的员工信息
select * from emp where comm>0;
模糊查询like
-
%: 代表0或多个未知字符
-
_:代表1个未知字符
-
举例:
-
以x开头 x%
-
以x结尾 %x
-
包含x %x%
-
第二个字符是x _x%
-
以x开头以y结尾 x%y
-
第二个是x倒数第三个是y x%y_
- 查询名字姓孙的员工信息
select * from emp where name like “孙%”;
- 查询名字以精结尾的员工姓名
select name from emp where name like “%精”;
- 查询工作第二个字是售的员工姓名和工作
select name,job from emp where job like “_售%”;
- 查询名字中包含僧并且工资大于2000的员工姓名和工资
select name,sal from emp where name like “%僧%” and sal>2000;
排序order by
- 格式: order by 字段名 asc(升序默认)/desc(降序)
description描述
descend 降序
- 查询所有员工姓名和工资并按照工资升序排序
select name,sal from emp order by sal;
select name,sal from emp order by sal asc;
- 查询所有员工姓名和工资并按照工资降序排序
select name,sal from emp order by sal desc;
- 查询所有员工姓名,工资和部门id并且按照部门id升序排序,如果部门id一致则按照工资降序排序
select name,sal,dept_id from emp order by dept_id,sal desc;
分页查询
-
格式: limit 跳过的条数,请求的条数(每页的条数)
-
跳过的条数=(请求的页数-1)*请求的条数(每页条数)
-
举例:
-
查询第1页的5条数据(1-5条) limit 0, 5
-
查询第2页的5条数据(6-10条) limit 5, 5
-
请求第1页的10条数据 limit 0,10
-
请求第3页的10条数据 limit 20,10
-
请求第8页的10条数据 limit 70,10
-
请求第6页的8条数数据 limit 40,8
- 查询工资最低的3个员工信息
查询按照工资升序排序的第一页的3条数据
select * from emp order by sal limit 0,3;
- 按照入职日期(hiredate) 升序排序 查询第3页的3条数据
select * from emp order by hiredate limit 6,3;
- 查询工资最高的员工信息
select * from emp order by sal desc limit 0,1;
- 查询按照工资降序第2页的5条数据
select * from emp order by sal desc limit 5,5;
综合练习题
- 查询员工表中3号部门工资高于1500的员工信息
select * from emp where dept_id=3 and sal>1500;
- 查询2号部门员工或者没有领导的员工信息
select * from emp where dept_id=2 or manager is null;
-
查询有领导的员工姓名,工资按照工资降序排序
-
查询2号和3号部门的员工姓名和入职日期hiredate按照入职日期降序排序
-
查询名字中包含僧和包含精的员工姓名
-
查询工资高于2000的工作有哪几种?
-
查询工资升序第4页的2条数据
select * from emp order by sal limit 6,2;
别名
select name as “姓名” from emp ;
select name “姓名” from emp ;
select name 姓名 from emp ;
聚合函数
- 通过聚合函数可以对查询的多条数据进行统计查询,统计查询的方式包括:求平均值, 求最大值,求最小值,求和,计数
- 平均值avg(字段名)
- 查询1号部门的平均工资
select avg(sal) from emp where dept_id=1;
- 查询销售的平均工资
select avg(sal) from emp where job=“销售”;
- 最大值max(字段名)
- 查询程序员的最高工资
select max(sal) from emp where job=“程序员”;
- 最小值min(字段名)
- 查询3号部门的最低工资
select min(sal) from emp where dept_id=3;
- 求和sum(字段名)
- 查询2号部门的工资总和
select sum(sal) from emp where dept_id=2;
- 计数count(*)
- 查询程序员的数量
select count(*) from emp where job=“程序员”;
数值计算 + - * / %
- 查询每个员工的姓名,工资和年终奖(年终奖=5个月的工资)
select name,sal,sal*5 年终奖 from emp;
- 给3号部门的员工每人涨薪5块钱
update emp set sal=sal+5 where dept_id=3;
晚课练习题:
-
查询工资大于等于3000的员工姓名和工资
-
查询1号部门的员工姓名和工作
-
查询不是程序员的员工姓名和工作(两种写法)
-
查询奖金等于300的员工姓名,工资和工作
-
查询1号部门工资大于2000的员工信息
-
查询3号部门或工资等于5000的员工信息
-
查询出CEO和项目经理的名字
-
查询工资为3000,1500和5000的员工信息
-
查询工资不等于3000,1500和5000的员工信息
-
查询工资在1000到2000之间的员工信息
-
查询工资在1000到2000以外的员工信息
-
查询有领导的员工姓名和领导id
-
查询没有领导的员工姓名和领导id
-
查询员工表中出现了哪几种不同的工作
-
查询员工表中出现了那几个部门的id
-
查询姓孙的员工姓名
-
查询名字最后一个字是精的员工信息
-
查询工作中包含销售的员工信息
-
查询工作中第二个字是售的员工信息
-
查询名字中包含僧的员工并且工资高于2000的员工信息
-
查询1号和2号部门中工作以市开头的员工信息
-
查询所有员工的姓名和工资 按照工资升序排序
-
查询所有员工的姓名和工资 按照工资降序排序
-
查询所有员工姓名 工资和部门id 按照部门id降序排序,如果部门id一致则按照工资升序排序
-
查询员工表中3号部门工资高于1500的员工信息
-
查询2号部门员工或者没有领导的员工信息
-
查询有领导的员工姓名,工资按照工资降序排序
-
查询2号和3号部门的员工姓名和入职日期hiredate 按照入职日期降序排序
-
查询名字中包含僧和包含精的员工姓名
-
查询工资高于2000的工作有哪几种?
-
查询工资最高的前三个员工
-
查询员工表按照id排序, 第2页的5条数据
-
查询员工表按照id排序, 第3页的4条数据
-
查询3号部门工资最低的员工姓名和工资
-
查询工作不是人事的员工中工资降序第二页的3条数据
-
查询每个员工的姓名,工资和年终奖(年终奖=5个月的工资)
-
给3号部门所有员工涨薪5块钱
-
查询没有领导的员工和3号部门的员工,工资降序取前三条
-
查询2号部门的最高工资
-
查询有领导的员工中工资在1000到2000之间的人数
-
查询3号部门的工资总和
-
查询程序员和销售的总人数
-
查询1号部门有领导的员工的平均工资
-
查询1号部门的最低工资和最高工资
-
查询和销售相关的工作人数
-
查询工资不是1500和3000的员工人数
-
查询1号部门出现了哪几种工作