数据库 II
1.中文问题:
错误原因是客户端和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;
2.主键约束
主键: 表示数据唯一性的字段称为主键
约束: 创建表时给表字段添加的限制条件
主键约束: 限制主键的值 唯一且非空
如何使用:
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”);
3.主键约束+自增
自增规则: 从历史最大值基础上+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”);
4.SQL语句分类
DDL: 数据定义语言,包括数据库相关和表相关的SQL语句
DML: 数据操作语言, 包括增删改查
DQL: 数据查询语言, 只包含select查询相关的SQL语句
TCL: 事务控制语言
DCL: 数据控制语言
5.数据类型
-
整数: 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); //报错 -
字符串:
a. char(m), 固定长度, m=10 存abc 占10, 执行效率略高, 当保存数据的长度相对固定时使用, 最大值255
b. varchar(m),可变长度,m=10 存abc 占3,更节省空间, 最大值65535 但推荐保存短的数据(255以内)
c. text(m),可变长度, 最大值65535,建议保存长度大于255的 -
日期:
a. date, 只能保存年月日
b. time, 只能保存时分秒
c. datetime, 保存年月日时分秒, 默认值为null , 最大值 9999-12-31
d. 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);
6.导入*.sql批处理文件
- 在某一个目录下放置XXX.sql文件
- 在客户端中 执行 source 目录路径/XXX.sql;
- 执行以下SQL语句 检查是否成功
7.去重distinct
- 查询员工表中所有不同的工作
select distinct job from emp; - 查询员工表中出现了哪几个不同的部门id?
select distinct dept_id from emp;
8.is null和is not null
- 查询有领导的员工姓名和领导id
select name,manager from emp where manager is not null; - 查询没有领导的员工姓名
select name from emp where manager is null;
9.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=“猪八戒”;
10.比较运算符 > < >= <= = !=和<>
- 查询工资大于等于3000的员工信息
select * from emp where sal**>=**3000; - 查询工作不是程序员的员工信息(两种写法)
select * from emp where job**!=**“程序员”;
select * from emp where job<>“程序员”;
11.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;
12.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);
13.模糊查询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;
14.排序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;
15.分页查询
格式: 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;
16.别名
select name as “姓名” from emp ;
select name “姓名” from emp ;
select name 姓名 from emp ;
17.聚合函数
通过聚合函数可以对查询的多条数据进行统计查询,统计查询的方式包括:求平均值, 求最大值,求最小值,求和,计数
-
平均值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=“程序员”;
18.数值计算 + - * / %
- 查询每个员工的姓名,工资和年终奖(年终奖=5个月的工资)
select name,sal,sal*5 年终奖 from emp; - 给3号部门的员工每人涨薪5块钱
update emp set sal=sal+5 where dept_id=3;