mysql基础

一、基本语法

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

友情链接更多精彩内容