一、基本语法
1、常用的类型
int :整型;
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值:999.99
decimal:浮点型,不会出现精度缺失问题,比如金钱
char:固定长度字符串类型,最大长度:char(255)
varchar:可变长度字符串类型,最大长度:varchar(65535)
text(clob):字符串类型,存储超大文本
blob:字节类型,最大4G
date:日期类型;格式:yyyy-MM-dd
time:时间类型;格式:hh:mm:ss
timestamp:时间戳
datetime:
2、约束
默认值:default
非空约束:not null
唯一约束:unique
主键约束:primary key
外键约束:foreign key
3、创建数据表
CREATE TABLE [IF NOT EXISTS]表名(
列名 列类型(长度) 约束 默认值,
列名 列类型(长度) 约束 默认值,
);
4、显示检表语句
show create table users;
5、修改数据表结构
mysql> alter table users add(age int(4),birthday date);//添加字段
mysql> alter table users modify age float(4,1);//修改已有字段的数据类型
mysql> alter table users change pwd password varchar(30);//修改列的名字
mysql> alter table users drop birthday;//删除某列
//表重命名
mysql> alter table users rename to user2;
mysql> rename table user2 to user3;
mysql> drop table user3;//删除表
alter table stu drop primary key;//删除主键
alter table stu add primary key(sid);//添加主键
6、插入数据
insert into 表名(列1,列2,列3.。。) values(值1,值2,值3.。。)
insert into 表名(列1,列2,列3.。。) values(值1,值2,值3.。。),(值1,值2,值3.。。),....;//同时插入多行
7、修改数据
update 表名 set 列1=值1,列2=值2...[where 条件];
8、删除数据
delete from 表名[where 条件]
二、查询
1、条件查询
比较运算符:=,!=,<>,>,<,>=,<=
逻辑运算符:and ,or, not
范围:between and,in,not in
null:is null,is not null
2、查询顺序
select {columns}
from {table|view|other select}
[where 条件]
[group by 分组条件]
[having 分组后再限定]
[order by 排序]
3、查询语句
select 列1,列2,列3.。。 from 表名;//查询指定的列
select 列1 as 别名 from 表名;//起别名,as可以省略不写
select ename,(sal+comm) as 月入工资 from emp;//列运算
select ename,(sal+ifnull(comm,0)) from emp;//使用ifnull(a,b),如果a列为空,取b值
select concat('我的名字是',ename,',喔喔') from emp;//字符串类型做连续运算
select distinct job,deptno from emp;//去重distinct
4、模糊查询:like
not like 取反;
%:匹配0-多个任意的字符
_:匹配1个任意字符
like '_a';只有两个字符
like '%a%';包含a
like 'a%';以a 字母开头的
5、排序
asc:升序,默认
desc:降序
select查询完后,排序要写在整个sql语句的最后。
select * from emp order by sal;
select * from emp order by sal desc;
6、统计函数
也叫聚合函数,通常用于求整个表中某列的数据的:总和,平均值,最大值,最小值。通常不搭配表中的字段一起查询。
sum(), avg(), max(),min(), count(*/主键)
//求部门编号20中员工的平均工资,工资总和,工资最大值,最小值,人数。
select ename,sum(sal),avg(sal),max(sal),min(sal) ,count(empno),count(comm)from emp where deptno=20;
7、分组
group by 列名,按照指定的列进行分组,值相同的会分在一组。
select 列名1,列名2 from 表名 group by 列名1,列名2
7.2、分组后使用聚合函数
select sex,count(*) from stu group by sex;
7.3、二次筛选 having
就是分组后再对数据进行筛选,需要having子句来完成。
select 列名 from 表名 group by 列名 having 条件
//例子:查询部门人数超过5人的部门。
select deptno,count(*) from emp group by deptno having count(*) >5;
8、分页
limit是mysql特有的。方言。
limit用于限定查询结果的起始行,以及总行数
select * from 表名 limit start,count;
//例:查询起始行为第5行,一共查询3行
select * from stu limit 4,3;
三、多表联查
1、笛卡尔积
两张表在连接查询的时候,如果没有连接条件,那么会产生笛卡尔积(冗余数据)
select emp.*,dept.* from emp,dept
、内连接
方言:select * from 表1 别名1,表2 别名2 where 别名1.xx=别名2.xx
标准:select * from 表1 别名1 inner join 表2 别名2 on 别名1.xx=别名2.xx
//例:
select e.*,d.* from emp e inner join dept d on e.deptno=d.deptno;
3、左外链接
select * from 表1 别名1 left [outer] join 表2 别名2 on 别名1.xx=别名2.xx
4、右外链接
select * from 表1 别名1 right [outer] join 表2 别名2 on 别名1.xx=别名2.xx
例1:查询在部门在纽约的员工信息,部门名称,工资等级。
select
e.*,d.dname,d.LOC,s.grade
FROM emp e
left join dept d
on e.deptno = d.deptno
LEFT JOIN salgrade s
on e.sal BETWEEN s.LOSAL and s.hisal
where d.LOC = 'NEW YORK';
例2:查询每个部门的人数,部门名称,部门编号。
SELECT e.DEPTNO,d.DNAME,count(*) from emp e
LEFT JOIN dept d ON e.DEPTNO = d.DEPTNO
group by e.DEPTNO,d.DNAME;
select t.*,d.DNAME
from (
SELECT e.DEPTNO,count(*) from emp e group by e.DEPTNO
) t
left join dept d
on t.DEPTNO = d.DEPTNO;
5、自连接
查询员工的姓名和上级的姓名:
select e.empno,e.ename,e.mgr,m.empno,m.ename from emp e,emp m where e.mgr=m.empno;
四、子查询
子查询:是指sql语句中包含另外一个select 语句。
子查询出现的位置:
from 后,作为表
where 后,作为条件
注意事项:
1,子查询必须在()里
2,在子查询中不能使用order by子句
3,子查询可以再嵌套子查询,最多不能超过255层
例1:查询比allen工资高的员工信息。
select * from emp where sal > (select sal from emp where ename='allen');
例2:查询员工信息,工资大于30部门的所有人
select * from emp where sal >(select max(sal) from emp where deptno=30);
例3:查询本公司工资最高的员工详细信息
select max(sal) from emp;
select * from emp e,dept d
where sal=(select max(sa) from emp) and e.deptno=d.deptno;
例子:
学生表:student(sno,sname,sage,ssex)
sno:学号,sname学生姓名,sage学生年龄,ssex学生性别
课程表:course(cno,cname,tno)
cno:课程编号,cname:课程名称,tno:教师编号
成绩表:sc(sno,cno,score)
sno:学号,cno:课程编号,score:课程成绩
教师表:teacher(tno,tname)
tno:教师编号,tname:教师姓名
1、查询姓“张”的教师的个数
SELECT count(*) FROM teacher where teacher.tname like'张%';
2、查询平均成绩大于60分的同学的学号和平均成绩
SELECT sno,avg(score) avg from sc group by sno having avg(score)>60;
3、查询同时学过课程编号为1和课程编号为2的同学的学号,学生姓名
select stu.sname,stu.sno from student stu
INNER JOIN sc s on stu.sno =s.sno
where s.cno in(1,2)
GROUP BY stu.sname
HAVING count(stu.sno)=2;
4、查询学过“李四”教师所教所有课程的所有同学的学号,学生姓名
SELECT stu.sno,stu.sname from teacher tea
INNER JOIN course cou on tea.tno=cou.tno
INNER JOIN sc s on s.cno=cou.cno
INNER JOIN student stu on s.sno=stu.sno
where tea.tname='李四';
5、查询至少有一门课程与学号为(sno)1的同学所学课程相同的同学的学号、姓名
SELECT stu.sno,stu.sname from sc s
INNER JOIN student stu on stu.sno=s.sno
WHERE s.cno in(SELECT cno from sc where sno=1)