以下是我以前上课时老师传授的部分知识点,今天拿出来分享下,刚好自己再记录一下…如有错误,请提出,一定改正
数据库相关
- 查询所有数据库:
show databases;
- 创建数据库:
create database 数据库名 character set utf8;
- 查询数据库详情:
show create database 数据库名;
- 删除数据库:
drop database 数据库名;
(不推荐使用) - 使用数据库:
use 数据库名;
表相关
- 创建表:
create table 表名(字段名 类型,字段名 类型)charset=utf8/gbk;
注释:字符集可写可不写
举例:create table person(name varchar(4),age int);
注释:4是字符长度 - 查询所有表:
show tables;
- 查询表详情:
show create table 表名;
- 查询表的字断:
desc 表名;
- 删除表:
drop table 表名;
- 修改表名:
rename table 原名 to 新名;
- 添加表字断:
-最后添加:alter table 表名 add 字断名 类型;
-最前添加:alter table 表名 add 字断名 类型 first;
-某个字断后面添加:alter table 表名 add 字断名 类型 after xxx;
- 删除字断:
alter table 表名 drop 字段名
- 修改字段名和类型:
alter table 表名 change 原名 新名 新类型;
数据相关SQL
- 插入数据:
insert into 表名 values(值1,值2,值3);
- 指定字断插入格式:
insert into 表名(字断名1,字段名2) values(值1,值2);
- 批量插入数据:
insert into 表名 values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
insert into 表名(字断名1,字段名2) values(值1,值2),(值1,值2);
- 查询数据:
select 字断信息 from 表名 where 条件;
注释:字断信息为*是所有,没有条件默认选择所有 - 修改数据:
update 表名 set 字段名=值,字断名=值 where 条件;
- 删除数据:
delete from 表名 where 条件;
数据库中常见的数据类型
- 整数: int(m) 和 bigint(等效java中的long)
m代表显示长度 需要结合zerofill使用
create table t_int(id int,age int(10) zerofill);
insert into t_int values(1,18);
select * from t_int; - 浮点数: double(m,d) m代表总长度 d代表小数长度 25.234 m=5 d=3
- decimal(m,d) 超高精度浮点数,涉及超高精度运算时使用decimal
- 字符串
- char(m):不可变长度的字符串 m=5 abc 占5,执行效率略高,最大长度255
- varchar(m):可变长度 m=5 abc 占3 节省内存,最大长度65535 但是超过255建议使用text
- text(m):可变长度 最大长度也是65535
- 日期
- date:保存年月日
- time:保存时分秒
- datetime:年月日时分秒 默认值为null 最大值9999-12-31
- timestamp:年月日时分秒 默认值为当前系统时间2038-1-19
主键约束 primary key
-主键约束的作用:唯一且非空
主键约束+自增 primary key auto_increment
– 自增规则: 从历史最大值+1,自增数值只增不减
导入*.sql文件
- linux系统: 执行以下命令
source /home/soft01/桌面/tables.sql;
- window系统:
source d:/tables.sql;
is null 和 is not null
以下例子查询时不建议写 * 我这边为了方便,直接用了演示
- 查询没有上级领导的员工信息
select * from emp where mgr is null;
- 查询有上级领导的员工信息
select * from emp where mgr is not null;
去重 distinct
- 员工表中有哪些不同的部门编号
select distinct deptno from emp;
- 查询员工从事了哪些不同的工作(job)
select distinct job from emp;
比较运算符 > < >= <= = !=和<>
- 查询工资小于等于3000的员工姓名和工资
select ename,sal from emp where sal<=3000;
- 查询工作不是manager的员工姓名和工作(两种写法)
select ename,job from emp where job!='manager';
select ename,job from emp where job<>'manager';
- 查询奖金大于等于500的员工姓名,工作,工资,奖金
select ename,job,sal,comm from emp where comm>=500;
and 和 or
- and 类似java 中的 &&
- or 类似java 中的 ||
- 查询20号部门中工资大于2000的员工信息
select * from emp where deptno=20 and sal>2000;
- 查询10号部门员工或工资低于1500的员工信息
select * from emp where deptno=10 or sal<1500;
between x and y 包括x和y
- 查询工资在2000到3000之间的员工信息
select * from emp where sal between 2000 and 3000;
in(x,y,z)
- 查询工资等于800,1300,1500的员工信息
select * from emp where sal in(800,1300,1500);
模糊查询 like
- %:代表0或多个未知字符
- _:代表1个未知字符
- 举例:
- 以x开头 x%
- 以y结尾 %y
- 以a开头b结尾 a%b
- 第二个字符是a _a%
- 包含a %a%
- 第二个字符是x 倒数第三个字符是y x%y_
select ename from emp where ename like '%a%';
排序 order by
-格式:在目前关键字的最后面添加order by 字段名 asc(升序,默认)/desc(降序);
例子:select ename,sal from emp order by sal desc;
注释:给员工的工资降序排列
-多字断排序:order by 字断1 asc,字断2 desc;
分页查询
-格式: limit 跳过的条数,请求的条数;
数值的运算 + - * / %
1.查询每个员工的工资以及年终奖:select ename,sal,sal*5 年终奖 from emp;
别名
-给字断起一个别名:select ename 姓名 from emp;
聚合函数
-对多条数据进行统计查询,最大值,最小值,求和,计数
1.平均值:avg(字段名) : select avg(sal) from emp;
2.最大值:max(字段名)
3.最小值:min(字段名)
4.求和 :sum(字段名)
5.计数 :count(字段名)
分组查询 group by
-例子:select deptno,avg(sal) from emp group by deptno;
having 聚合函数条件写在having后面 having要和group by 结合使用
–例子:select xxx from 表名 where .....group by .....having....order by ....limit.....
子查询(嵌套查询)
- 查询工资高于平均工资的员工信息
select avg(sal) from emp;
select * from emp where sal>(select avg(sal) from emp);
- 查询员工表中工资最高的员工信息
select * from emp where sal=(select max(sal) from emp);
- 查询工资高于20号部门平均工资的员工信息
select * from emp where sal>(select avg(sal) from emp where deptno=20);
- 查询和jones相同工作的其他员工的信息
select job from emp where ename='jones';
select * from emp where job=(select job from emp where ename='jones') and ename!='jones';
- 查询工资最低员工的同事们的信息(同事指同一部门)
-得到最低工资
select min(sal) from emp;
-通过最低工资得到员工的部门编号
select deptno from emp where sal=(select min(sal) from emp);
-通过部门编号查询员工信息
select * from emp where deptno=(select deptno from emp where sal=(select min(sal) from emp)) and sal!=(select min(sal) from emp);
关联查询
- 同时查询多张表的查询方式称为关联查询
- 如果关联查询时不写关联关系,会得到两张表结果的乘积,这个乘积称为笛卡尔积,这是一个错误的查询结果,工作中切忌不要出现
关联查询的三种查询方式
等值连接
- 格式:
select * from A,B where A.x=B.x and A.age=18;
内连接
- 等值连接和内连接查询的结果一样,同为两张表的交集数据
- 格式:
select * from A join B on A.x=B.x where A.age=18;
- 查询每个员工的姓名对应的部门名
select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;
- 查询king的部门信息
select d.* from emp e join dept d on e.deptno=d.deptno where e.ename='king';
外连接
- 查询一张表的全部数据和另外一张表的交集数据
- 格式:
select * from A left/right join B on A.x=B.x where A.age=18;
- 查询所有部门名称和对应的员工名称
select d.*,e.ename from emp e right join dept d on e.deptno=d.deptno;
关联查询的总结
- 如果需要同时查询多张表的数据使用关联查询
- 关联查询的查询方式:三种,等值连接、内连接、外连接
- 如果查询的是两张表的交集数据使用等值连接或内连接,建议使用内连接
- 如果查询的是一张表的全部数据和另一张表的交集数据则使用外连接
关联关系
- 关联关系指创建表时两张表之间存在的业务关系
- 外键:用于建立关系的字段称为外键
- 一对一:有AB两张表,A表中一条数据对应B表中的一条数据,同时B表中一条数据也对应A表中的一条数据,称为1对1。
- 应用场景: 商品表和商品详情表,用户表和用户信息扩展表。
- 创建表时如何建立关系: 在从表中添加外键,指向主表的主键
商品表和商品详情表,在商品详情表中添加外键
- 一对多:有AB两张表,A表中一条数据对应B表中的多条数据, 同时B表中一条数据对应A表中的一条数据,称为一对多
- 应用场景:员工表和部门表
- 如何建立关系:在多的表中添加外键指向另外一张表的主键
球队表和球员表 在球员表中添加外键
- 多对多:有AB两张表,A表中一条数据对应B表中的多条数据, 同时B表中一条数据也对应A表中的多条,称为多对多
- 应用场景: 老师和学生
- 如何建立关系: 创建一个单独的关系表,保存另外两张表的主键
曾经有人说,书读得多了,气质自然光彩夺人。
其实不仅仅是读过的书,你走过的路,去过的地方,也会慢慢侵染至你的灵魂,或神圣或唯美的路,在岁月的绕指柔下,一点一点地变成了你最独特的气质。