sql 总结

简介: 一对多:在多的表中添加建立关系的字段(外键)指向另外一张表。如果需要查询一张表的全部和另外一张表的交集时,使用外连接,连表查询(左外连接)(显示左表的全部信息和右表相关联的信。连表查询(右外连接)(显示右表的全部信息和左表相关联的信。等值连接和内连接查询的是两个表的交集数据,推荐使用内连接。:选择插入必须选择需要插入的字段,选择对应字段的值,批量。查询所有部门的名称,地点和对应的员工姓名和工资。等值连接和内连接查询到的都是两张表的交集数据。外连接查询的是一张表的全部和另外一张表的交集。

对数据库表的操作

1.创建数据库

create database database-name

2.删除数据库

drop database dbname

3.选择数据库

use 数据库名

4.创建新表

create table tabname

字段名1 类型,

字段名2 类型,

字段名3 类型,…;

例:CREATE TABLE student(

stu_id INT,

stu_name VARCHAR(10),

stu_sex VARCHAR(1),

stu_age INT,

stu_class VARCHAR(20));

5.根据已有的表创建新表

DDL(数据定义语言):createalterdrop

DQL(数据查询语言):select

DML(数据操纵语言):insertdeleteupdate

TCL(事务操纵语言):commitrollback

DCL(数据控制语言):grantrevokeAcreate table 新表名 like 旧表名(使用旧表创建新表)

Bcreate table 新表名 as select 列名1,列名2… from 旧表名

definition only

6.删除表

drop table tabname

7.显示表的属性信息

desc 表名

8.增加一个列名

alter table 表名 add 列名 类型

指定列名后面添加列名

alter table 表名 add 已有列名 after 列名 类型

first:第一个,before:前一个,end:最后

9.删除一个列名

alter table 表名 drop 列名

10.修改一个列名

alter table 表名 change 旧列名 新列名 类型

11.修改类型

alter table 表名 modify 列名(已有) 新的类型

12.添加主键

Alter table 表名 add primary key(列名)

删除主键:Alter table 表名 drop primary key(列名)

13.添加外键

alter table 表名 add foreign key(列名) references 表名(主

键)

删除外键:需要找到外键特有的名称

14.约束类型not null:非空约束

unique:唯一约束

primary key:主键

foreign key:外键

auto_increment:自增长

default:设置默认值 例:default ‘

查询语句

关键字:

1.or:或

2.and:和

3.having:分组后的附加条件

4.group by:分组

5.order by:排序:asc:正序,desc:倒序

6.in:存在于某个值中

7.not in:不存在与某个值中

8.inner join … on链接多表

9.left join … on:左外连接

10.right join … on:右外连接

11.leftrightinner out join … on:去重

12.count:计数

13.AVG:平均值

14.sum:求和

15.max:最大值

16.min:最小值

17.like ‘%关键字%’:取含有关键字的值

18.distinct:去重

19.round:四舍五入

20.where 1=1:全选

21.where 1=2:全不选

22.limit 1,5:从第二行开始显示5条数据23.top 10select top 10 * from 表名:显示前十条数据

24.newid():随机

1.选择查询:

select * from 表名 where 范围

2.完全查询:

select * from 表名

3.模糊查询:

select * from 表名 where 列名 like ‘%value%’(查询包含value

值)

4.排序查询(倒序,默认为正序):

select * from 表名 order by 列名 desc

5.计数查询:

select count as 别名 from 表名

6.求和查询:

select sumfield as 别名 from 表名

7.平均值查询:

select avgfiled as 别名 from 表名

8.最大值查询:

select maxfiled as 别名 from 表名

9.最小值查询:

select minfiled as 别名 from 表名

10.四舍五入查询:select roundminfiled),要保留的小数位数) as 别名 from

表名

11.去重查询:

select distinct 列名 from 表名

12.分组查询:

select * from 表名 group by 列名

13.多条件查询:

select * from 表名 where 列名=‘范围’ and 列名=‘范围

14.不确定条件查询:

select * from 表名 where 列名=‘范围’ or 列名=‘范围

15.多条件分组求值查询:

select 列名,minfiledfrom 表名 where 列名=‘范围’ group by

列名 having sum(列名)

16.子查询(子查询的结果作为主查询的条件):

select * from 表名 where=select id from 表名 where 列名=‘

17.连表查询(内连接):

select * from 表名 inner join 表名 on 主键=外键(必须有主外键)

18.连表查询(内连接)(去重):

select * from 表名 inner out join 表名 on 主键=外键(必须有主外

键)

注:内连接只显示相关联的数据

19.连表查询(左外连接)(显示左表的全部信息和右表相关联的信

息):

select * from 表名 left join 表名 on 主键=外键(必须有主外键)

20.连表查询(右外连接)(显示右表的全部信息和左表相关联的信

息):select * from 表名 right join 表名 on 主键=外键(必须有主外键)

21.连表查询(全外连接)(显示两个表中的所有记录):

select * from 表名 full/cross join 表名 on 主键=外键(必须有主外

键)

条件查询

从员工表中查询出所有的部门编号

select bianhao from employee

所有员工的信息

select*from employee

查询员工表中不同的工作

select distinct job from emp; //DISTINCT 用于返回唯一不同

的值

查询员工表出现了几个不同id

select distinct dept_id from emp;

查询有领导的员工姓名和领导id

select name,manager from emp where manager is not null;

查询没有领导的员工姓名;

select name from emp where manager is null;

--查询出没有奖金的员工信息

select *from employee where jiangjin=null;

多条件查询

查询名字姓孙且工资大于100的员工的id和密码select id,password from employee where name='%' and

gongzi>100

--薪资大于等于1000并且小于等于2000的员工信息

select*from employee where xinzi>=1000 and xinzi<=2000;

select*from employee where xinzi between 1000 and 2000;

不确定条件查询

查询三号部门或者工资大于2000的员工信息

select*from employee where gongzi>2000 or bumen=3;

查询孙悟空和猪八戒的员工信息

select * from employee where name='孙悟空' or name='猪八戒';

in 关键字

查询工资 为1000 1500 2000 的员工信息

select* from employee where gongzi in (1000,1500,2000)

select*from employee where gongzi=1000 or gongzi=1500 or

gongzi=2000;

查询工资不为1000 1500 2000 的员工信息

select * from emp where sal not in(5000,1500,3000);

模糊查询

关键字:like

%:代表0或多个未知字符

_:代表1个未知字符

举例:x开头 x%

x结尾 %x

包含 %x%

第二个字符是x _x%

x开头以y结尾 x%y

第二个是x,倒数第三个是y x%y _

查询名字姓孙的员工信息

select* form employee where name like '%'

--查询名字姓孙的员工的id 和密码

select id,password from employee where name like '%'

--查询出名字以A开头的员工的信息 (模糊查询)

select * from employee where name like 'A%'

--查询出名字第二个字母是L的员工信息*(模糊查询)

select * from emp where name like'%L%'

比较运算符

1、查询工资大于等于3000的员工信息

select * from emp where sal>=3000;

2、查询工作不是程序员的员工信息(两种写法)

select * from emp where job!=”程序员”;

排序查询 order by

asc 升序 desc 降序 默认就是asc 升序查询所有员工姓名和工资并按照升序排序

select name,gongzi from employee order by gongzi asc

select name,gongzi from employee order by gongzi

2、查询所有员工姓名和工资,并按照工资降序排序

select name,gongzi from employee order by desc;

3、查询所有员工姓名,工资和部门id并且按照部门id升序排序,如

果部门id一致则按照工资降序排序

select name,gongzi,id from emp order by id ,gongzi desc;

分页查询

格式:limit 跳过的条数,请求的条数(每页的条数)

跳过的条数=(请求的页数-1*请求的条数(每页条数)

举例:

1、查询工资最低的3个员工信息(排序和分页结合一起)

select * from emp order by gongzi limit 0,3;

2、按照入职日期(hiredate)升序排序 查询第三页的3条数据

select * from emp order by hiredate limit 6,3;

3、查询工资最高的员工信息

查询1-5条数据 limit 0,5 第一页

查询6-10条数据 limit 5,5 第二页

请求第一页的10条数据 limit 0,10

请求第三页的10条数据 limit 20,10

请求第八页的10条数据 limit 70,10

请求第六页的8条数据 limit 40,8select * from emp order by gongzi desc limi 1

4、查询按照工资降序第二页的5条数据

select* from emp order by gongzi desc limit 5,5;

查询的别名

select name as “姓名” from emp;

select name “姓名” from emp;

select name 姓名 from emp;

聚合函数

过聚合函数可以对查询的多条数据进行统计查询,统计查询的方式包

:求平均值, 求最大值,求最小值,求和,计数

1、平均值avg(字段名)

2、最大值max(字段名) 最小值min(字段名)

查询1号部门的平均工资

select avg(gongzi) from emp where bumen_id=1;

查询销售的平均工资

select avg(gongzi) from emp where job=”销售”;3、求和sum(字段名)

5、计数count(*或字段名) null不能统计

数值计算

1、查询每个员工的姓名,工资和年终奖(年终奖=5个月工资)

select name,gongzi,gongzi* 5 as 年终奖 from emp;

2、给3号部门的员工每人涨薪5块钱

update emp set gongzi= gongzi+ 5 where bumen_id = 3;

四舍五入查询

select roundminfiled),要保留的小数位数) as 别名 from

表名

去重查询

select distinct 列名 from 表名

查询程序员的最高工资

select max(gongzi) from emp where job = “程序员”;

查询3号部门的最低工资

select min(gongzi) from emp where bumen_id = 3;

查询2号部门的工资总和

select sum(gongzi) from emp where bumen_id = 2;

查询程序员的数量

select count(*) from emp where job = “程序员”;分组查询

格式:group by 分组的字段名

1、查询每个部门的平均工资

select bumen_id,avg(gongzi) from emp group by bumen_id;

2、查询每个部门的最高工资

select dept_id,max(sal) from emp group by bumen_id;

3、查询每种工作的最高工资

select job,max(sal) from emp group by job;

4、查询每种工作的人数

select job,count(*) from emp group by job;

5、查询每个部门工资高于2000的人数

select bumen_id,count(*) from emp where sal > 2000 group by

bumen_id;

6、查询每个部门有领导的员工的人数

select bumen_id,count(*) from emp where manager is not null

group by bumen_id;

having关键字

where 后面只能写普通字段的条件,不能包含聚合函数

having后面可以包含聚合函数的条件,且having需要和group by

合使用,写在group by的后面

举例:

1、查询每个部门的平均工资,要求平均工资高于2000select bumen_id,avg(gongzi) from emp group by

bumen_idhaving avg(gongzi) > 2000;

2、查询每种工作的人数,只查询人数大于1

select job,count() from emp group by job having count() > 1;

select job,count(*) from emp group by job having c > 1;

3、查询每个部门的工资总和,只查询有领导的员工,并且要求工资

总和大于5400

select bumen_id,sum(gongzi) from emp where manager is not

null group by bumen_idhaving sum(gongzi) > 5400;

4、查询每个部门的平均工资,只查询工资在10003000之间的,

并且过滤掉平均工资低于2000

select bumen_id,avg(gongzi) from emp where gongzi between

1000 and 3000 group by bumen_id having avg(gongzi) >= 2000;

子查询

1. 查询工资大于2号部门平均工资的员工信息

select * from emp where gongzi > (select avg(gongzi ) from

emp where bumen_id= 2);

2. 查询工资高于程序员最高工资的员工信息

select * from emp where gongzi > (select avg(gongzi ) from emp

where job = “程序员”);

3. 查询工资最高的员工信息

select * from emp where gongzi = (select max(gongzi ) from

emp);

4. 查询和孙悟空相同工作的员工信息 select job from emp where name=“孙悟空”;

select * from emp where job=(select job from emp where

name=“孙悟空”) and name!=”孙悟空";

5. 查询拿最低工资员工的同事们的信息(同事指同一部门)

select * from emp where bumen_id= (select bumen_id from

emp where gongzi= (select min(gongzi) from emp)) and name

!= (select name from emp where gongzi= (select min(gongzi)

from emp));

关联关系

指创建的表和表之间存在的业务关系

有哪几种关系

 一对一:有AB两张表,A表中的一条数据对应B表中的一条数据,B

表中的一条数据也对应A表中的一条数据

 一对多:有AB两张表,A表中的一条数据对应B表中的多条数据,

B表中的一条数据对应A表中的一条数据

 多对多:有AB两张表,A表中的一条数据对应B表中的多条数据,

B表中的一条数据也对应A表中的多条数据

表和表之间如何建立关系(通过外键字段建立关系,注意:外键不能添

加多个值)

 一对一:在任意表中添加一个建立关系的字段指向另外一张表的主

 一对多:在多的表中添加建立关系的字段(外键)指向另外一张表

的主键

 多对多:需要建立单独的关系表,里面至少包含两个字段,分别指

向另外两个表的主键关联查询

同时查询多张表数据的查询方式称为关联查询

关联查询包含:等值连接,内连接和外连接

关联查询之等值连接:

 格式:select * from A,B where 关联关系

 举例:

 查询工资高于2000的员工的姓名和对应的部门名

 select e.name,d.name from emp e,dept d where

e.dept_id = d.id and e.sal > 2000;

关联查询之内连接

 格式:select * from A join B on 关联关系

 举例:

 查询每个员工的姓名和对应的部门名

 select e.name,d.name,sal from emp e join dept d

on e.dept_id=d.id;

关联查询之外连接

 等值连接和内连接查询到的都是两张表的交集数据

 外连接查询的是一张表的全部和另外一张表的交集

 格式:select * from A left/right join B on 关联关

系;leftright选一个,表示左边或右边的表为全部

 举例:

 查询所有员工姓名和对应的部门名

 insert into emp(name,sal) values(“灭霸”,5);   select e.name,d.name from emp e left join dept d

on e.dept_id = d.id;

 查询所有部门的名称,地点和对应的员工姓名和工资

 select d.name,d.loc,e.name,e.sal from dept d

left join emp e on d.id=e.dept_id;

关联查询总结

 如果需要同时查询多张表的数据使用关联查询

 关联查询包括:等值连接,内连接和外连接

 等值连接和内连接查询的是两个表的交集数据,推荐使用内连接

 如果需要查询一张表的全部和另外一张表的交集时,使用外连接,

只需要掌握左外即可,因为表的位置可以交换

如何查询多对多的数据(多张表连接)

 创建表:

 create table student(id int primary key

auto_increment, name varchar(50))charset=utf8;

 create table teacher(id int primary key

auto_increment, name varchar(50))charset=utf8;

 create table t_s(tid int, sid int);

 插入数据

 insert into teacher values(null,”苍老师”),(null,”

传奇哥”);

 insert into student values(null,”小明”),(null,”

”),(null,”小绿”),(null,”小狗”),(null,”小黄”);数据库操作语句

1.数据插入

完全插入:insert into 表名 values(值1,2,3,…

选择插入:insert into 表名(列名1,列名2,列名,3… values(值1,

2,3,…

批量插入:insert into 表名 values(值1,2,3,…,(值1,2,

3,…,(值1,2,3,…

1:完全插入可以省略列名,但是值必须包含所有字段,批量插入

类同

2:选择插入必须选择需要插入的字段,选择对应字段的值,批量

 insert into t_s values(1,1),(1,5),(1,4),(2,2),

(2,3),(2,1),(2,5);

 查询每个老师对应的学生

 select t.name,s.name from teacher t join t_s ts

on t.id=ts.tid join student s on s.id=ts.sid;

 查询苍老师的学生都有谁

 select t.name,s.name from teacher t join t_s ts

on t.id=ts.tid join student s on s.id=ts.sid where

t.name= “苍老师”;

 查询小明的老师是谁

 select t.name,s.name from teacher t join t_s ts

on t.id=ts.tid join student s on s.id=ts.sid where

s.name= “小明”;插入类同

2.修改语句

update 表名 set 列名=‘’ where 列名=‘范围

where 1=1(全选)

where 1=2(全不选)

注:不加where条件为修改所有指定列的值

3.删除语句

delete from 表名 where 列名=‘范围

注:不加where条件为删除所有的值

相关文章
|
3月前
|
SQL 存储 关系型数据库
sql日常总结
sql日常总结
|
4月前
|
SQL 数据库 索引
八、SQL-Limite
八、SQL-Limite
24 0
|
SQL 存储 缓存
或许你不知道的12条SQL技巧
或许你不知道的12条SQL技巧
xttstartupnomount.sql
connect / as sysdba; startup force nomount; exit;
702 0
|
SQL
xttcnvrtbkupdest.sql
---- Convert the incremental backup (target convert) -- Inputs: cross-plaform backups set serveroutput on;set termout on;set verify off; DE...
814 0
|
SQL
SQL|你用过NOT BETWEEN吗?
image.png 如需显示不在上面实例范围内的网站,请使用 NOT BETWEEN: SELECT * FROM Websites WHERE alexa NOT BETWEEN 1 AND 20; 结果 image.png BETWEEN 操作符 选取介于两个值之间的数据范围内的值。
951 0
|
SQL 数据库 数据库管理
|
存储 安全 算法