mysql基础查询语句

mysql基本语句

创建

create table 表名(
    字段名1 数据类型,
    字段名2 数据类型,
    字段名3 数据类型,
    ....
);

常见的:

int :整数型(java中的int)
bigint:长整型(java中的long)
float :浮点型(java中的float double)
char :定长字符串(String)
varchar: 可变长字符串(StringBuffer/StringBuilder)
Decimal :对应 java.math.BigDecimal
time:对应java.util.Time 基本类,年、月、日域设为 1970 年 1 月 1 日。这是 Java 纪元的“零”日期,对应java.sql.Time
date :对应Java中的java.sql.Date类型,java.util.Date 基本类中的小时、分钟和秒都设为 0
timestamp:添加了纳秒域,对应java.sql.Timestamp,该类扩展了 java.util.Date
BLOB:二进制大对象(存储图片、视频等流媒体信息) Binary Large OBject (对应java中的Object)
CLOB:字符大对象(存储较大文本,比如,可以存储4G的字符串。) Character Large OBject(对应java中的Object)

CREATE TABLE EMP(
	EMPNO int(4)  not null ,
	ENAME VARCHAR(10),
	JOB VARCHAR(9),
	MGR INT(4),
	HIREDATE DATE  DEFAULT NULL,
	SAL DOUBLE(7,2),
	COMM DOUBLE(7,2),
	primary key (EMPNO),
	DEPTNO INT(2) 
);

INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) 
VALUES ( 10, 'ACCOUNTING', 'NEW YORK'); 

// 一次插入多行数据
insert into t_student
	(no,name,sex,classno,birth) 
values
	(3,'rose','1','gaosi2ban','1952-12-14'),		
	(4,'laotie','1','gaosi2ban','1955-12-14');

表的复制

将查询结果当做表创建出来:
​create table 表名 as select语句;

将查询结果插入到一张表中:
insert into dept1 select * from dept;

更新、删除

更新 update + where

语法格式:
update 表名 set 字段名1=值1,字段名2=值2... where 条件;

没有条件整张表数据全部更新。

案例:将部门10的LOC修改为SHANGHAI,将部门名称修改为RENSHIBU
update dept1 set loc = 'SHANGHAI', dname = 'RENSHIBU' where deptno = 10;

更新所有记录
update dept1 set loc = 'x', dname = 'y';

删除 delete + where

语法格式:
		delete from 表名 where 条件;
注意:没有条件全部删除。

删除10部门数据?
delete from dept1 where deptno = 10;

删除所有记录?
delete from dept1;

怎么删除大表?
truncate table 表名; // 表被截断,不可回滚。永久丢失。

增删改查有一个术语:CRUD操作
Create(增) Retrieve(检索) Update(修改) Delete(删除)

查询

语法格式:

select *
from ()
where (条件)
group by (分组)
having (对分组进行条件筛选)
order by (排序)
limit (取出的行数)

select

可用 distinct,去除重复数据,聚合函数 count、sum、avg、max、min

select取出来的东西是一个临时表,可以用as给临时表取名。

from

表的连接操作:Mysql支持内连接、左连接、右连接。不支持全连接,可以用左连接+右连接实现。

默认内连接,不显式给连接类型,给出所有满足条件的笛卡尔积

select d.*, e.*
from dept as d, emp as e
where d.deptno=e.deptno;

内连接条件筛选,可以用where代替on,左右连接不能。

select d.*,e.*
from dept as d inner join emp as e
on d.deptno = e.deptno;

左连接 left join会读取左边全部,即使右边没有对应数据。
(如果两个表中数据有相同的部分,只显示一个),本例只返回dept表中所有数据。

select *
from dept as d left join emp as e
on d.deptno = e.deptno;

mysql基础查询语句_第1张图片

右连接,right join,读取右边数据表的全部数据。

select *
from dept as d right join emp as e
on d.deptno = e.deptno

总结:from 说明了数据的来源 是哪些表,默认内连接。

where

适用于:操作有条件限制的数据。
where子句规定条件,条件筛选。

注意:where语句不能和聚合函数一起,因为where只对表中有的列值操作,而聚合函数在原始的表中没有的。

运算符 说明
= 等于
!= 不等于,某些数据库系统也写作 <>
< 小于
>= 大于或等于
> 大于
<= 小于或等于
BETWEEN … AND … 介于某个范围之内,例:WHERE age BETWEEN 20 AND 30
NOT BETWEEN …AND … 不在某个范围之内
IN(项1,项2,…) 在指定项内,例:WHERE city IN(‘beijing’,‘shanghai’)
NOT IN(项1,项2,…) 不在指定项内
LIKE 搜索匹配,常与模式匹配符配合使用
NOT LIKE LIKE的反义
IS NULL 空值判断符
IS NOT NULL 非空判断符
NOT、AND、OR 逻辑运算符,分别表示否、并且、或,用于多个逻辑连接。
优先级:NOT > AND > OR
% 模式匹配符,表示任意字串,例:WHERE username LIKE ‘%user’

group by和having

对数据进行汇总,group by 指明按照那几个字段分组,
记录分组后,用having进行过滤,having的条件是聚合函数。

select avg(sal) as avg
from emp
group by deptno
having agv>16000;

order by

对某一列进行排序输出,默认升序,降序desc

select agv(sql) as avg
from emp
group by deptno
having avg > 16000
order by avg desc;

limit

mysql 没有sqlServer返回前几条的top,但是有limit,可以返回前几条或者中间某几行的数据。

limit接受一个或两个数字参数,参数必须是一个整数常量。
如果给定两个参数,
第一个参数:返回记录行的偏移量;
第二个参数:返回记录行的最大数目。

初始记录行的偏移量是0(而不是1)

select job, sum(sal) as total
from emp
group by job
having total >50000
order by total desc
limit 5,5;

此时返回第6-10条的数据,因为初始偏移量是从0开始。

执行顺序

	select		5
		...
	from			1
		...		
	where			2
		...	
	group by		3
		...
	having		4
		...
	order by		6
		...
	limit			7
		...;

其他

ifnull

只要有NULL参与的运算结果一定是NULL。

使用ifnull函数:
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;

ifnull() 空处理函数:
ifnull(可能为NULL的数据,被当做什么处理) : 属于单行处理函数。

select ename,ifnull(comm,0) as comm from emp;

分组函数

分组函数自动忽略NULL,但是sum的结果可能是null

select count(comm) from emp;

select sum(comm) from emp where comm is not null; 
// 不需要额外添加这个过滤条件。sum函数自动忽略NULL。

between… and

between and在使用的时候必须左小右大
适用:数字、字符串

select ename,sal from emp where sal between 1100 and 3000; // between...and...是闭区间 [1100 ~ 3000]

select ename from emp where ename between 'A' and 'D'; // 左闭右开。

子查询

select语句当中嵌套select语句,被嵌套的select语句是子查询。
子查询可以出现在哪里?

select
	..(select).
from
	..(select).
where
	..(select).

where中子查询

案例:找出高于平均薪资的员工信息。
select * from emp where sal > avg(sal);
//错误的写法,where后面不能直接使用分组函数。

正确写法:
select * from emp where sal > (select avg(sal) from emp);

from后子查询

案例:找出每个部门平均薪水的等级。

第一步:找出每个部门平均薪水(按照部门编号分组,求sal的平均值)
select deptno,avg(sal) as avgsal from emp group by deptno;

第二步:将以上的查询结果当做临时表t,让t表和salgrade s表连接,条件是:t.avgsal between s.losal and s.hisal

整体语句:
select 
	t.*,s.grade
from
	(select deptno,avg(sal) as avgsal 
     from emp 
     group by deptno)
     t
join
	salgrade s
on
	t.avgsal between s.losal and s.hisal;

结果

+--------+-------------+-------+
| deptno | avgsal      | grade |
+--------+-------------+-------+
|     30 | 1566.666667 |     3 |
|     10 | 2916.666667 |     4 |
|     20 | 2175.000000 |     4 |
+--------+-------------+-------+

案例:找出每个部门平均的薪水等级。

第一步:找出每个员工的薪水等级。
select e.ename,e.sal,e.deptno,s.grade 
from emp e 
join salgrade s 
on e.sal between s.losal and s.hisal;

第二步:基于以上结果,继续按照deptno分组,求grade平均值。
select 
	e.deptno,avg(s.grade)
from 
	emp e 
join 
	salgrade s 
on 
	e.sal between s.losal and s.hisal
group by
	e.deptno;

select后子查询

案例:找出每个员工所在的部门名称,要求显示员工名和部门名。

select e.ename,
(select d.dname from dept d where e.deptno = d.deptno) as dname 

from 
	emp e;

union

多张表必须对应,将查询结果集相加

案例:找出工作岗位是SALESMAN和MANAGER的员工?
第一种:select ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';

第二种:select ename,job from emp where job in('MANAGER','SALESMAN');

第三种:union
select ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job = 'SALESMAN';

两张不相干的表中的数据拼接在一起显示?
select ename from emp
union
select dname from dept;

select ename,sal from emp
 union
select dname from dept;  //拼接的数据必须两两相对应。不能一张表是一个数据,另一张表是两个数据,这样无法拼接!

你可能感兴趣的:(数据库,mysql,java,数据库)