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 表名 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 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 (取出的行数)
可用 distinct,去除重复数据,聚合函数 count、sum、avg、max、min
select取出来的东西是一个临时表,可以用as给临时表取名。
表的连接操作: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;
右连接,right join,读取右边数据表的全部数据。
select *
from dept as d right join emp as e
on d.deptno = e.deptno
总结:from 说明了数据的来源 是哪些表,默认内连接。
适用于:操作有条件限制的数据。
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进行过滤,having的条件是聚合函数。
select avg(sal) as avg
from emp
group by deptno
having agv>16000;
对某一列进行排序输出,默认升序,降序desc
select agv(sql) as avg
from emp
group by deptno
having avg > 16000
order by avg desc;
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
...;
只要有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在使用的时候必须左小右大
适用:数字、字符串
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).
案例:找出高于平均薪资的员工信息。
select * from emp where sal > avg(sal);
//错误的写法,where后面不能直接使用分组函数。
正确写法:
select * from emp where sal > (select avg(sal) from emp);
案例:找出每个部门平均薪水的等级。
第一步:找出每个部门平均薪水(按照部门编号分组,求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 e.ename,
(select d.dname from dept d where e.deptno = d.deptno) as dname
from
emp e;
多张表必须对应,将查询结果集相加
案例:找出工作岗位是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; //拼接的数据必须两两相对应。不能一张表是一个数据,另一张表是两个数据,这样无法拼接!