1.建立数据库
create database (库名);
use (库名);
2.创建表
create tables (表名)(
列名1 +类型+条件,
列名2+类型+条件,
……
);
3.插入数据
insert into 表名(列1, 列2...列n) values (值1,值2... 值n);
4.查询数据
select * from (表名);
select (列名) from (表名);
5.数据类型
整数类型
int -2^31 ~ 2^31-1 四个字节
tinyint 一个字节
smallint 两个字节
bigint 八个字节
小数类型
浮点类型
FLOAT
DOUBLE
定点类型 (小数部分不会丢失精度,占用空间高)
DECIMAL(p, s)
p 有效数字长度
s 小数位数
decimal(10, 2)
12345678.77 ok
123456789.44 存不下
12345678.456 小数部分变为46
字符串类型
char(最大长度) 定长的字符类型
varchar(最大长度) 变长的字符类型
日期类型
datetime 包括年月日,时分秒 时间范围短(1000-1-1 ~ 9999-12-31)
date 只包括年月日
time 只包括时分秒
timestamp 也可以包括年月日时分秒, 时间范围短(1970-1-1 ~ 2038-1-19)
7.修改
update 表 set 列名=新值, 列2=值2 ...; -- 修改表中所有的行
update 表 set 列名=新值, 列2=值2 ... where 列名=条件; -- 仅更新符合条件的记录
update course set cname='java se'; -- 修改表中所有课程名称
update course set cname='spring' where cid=1000; -- 仅修改了cid=1000 这条记录的课程名称
8. 删除
delete from 表名; -- 删除这个表中所有记录,但表的定义不动
delete from 表名 where 列名=条件; -- 仅删除符合条件的记录
drop table 表名; -- 删除这个表,连同里面的数据
9. 导入数据
1) 可以用
mysql > source 路径\sql文件的名称;
2) 在cmd窗口运行
mysql -uroot -p test3 < E:\6.23实训班共享\预习\数据库(详)\scott.sql
其中test3是数据库的名字
10. 导出数据
在cmd窗口运行
mysqldump -uroot -p test3 > a.sql
功能:
1.alter 修改
给老师表添加一列年龄 alter table teacher add age tinyint;
给老师表的姓名列扩展长度 alter table teacher modify tname varchar(30);
2.insert 插入数据
标准语法: insert into 表(多个列...) values (多个值...);
mysql独有的: 一次插入多行数据
insert into 表(多个列...) values
(多个值), (多个值), (多个值) ...;
3.update 修改
update 对已有的数据进行更新
-- 更新所有的员工工资涨100
update emp set sal=sal+100;
-- 修改7369的员工部门为10号部门
update emp set deptno=10 where empno=7369;
-- 修改7000的员工部门为10号部门
update emp set deptno=10 where empno=7000;
如果条件不满足去更新不会报错,但影响行数是0
-- 修改7369的员工工资为9000,职务经理
update emp set sal=9000,job='manager'
where empno=7369;
注意:主键列主要用于查询条件,一般不会更新
4.select 查询
select 列名... from 表名 where 条件;
运算符
5.逻辑运算 and(并且) or(或者) not(取反)
-- 查询工资大于800 并且 部门等于20
where sal>800 and deptno=20
-- 部门=20 或者 等于30的
where deptno=20 or deptno=30;
6.like (模糊查询)
例如查询以 ‘S’字母打头的员工
select * from emp where ename like 'S%';
通配符 % 表示匹配0~多个任意的字符
通配符 _ 表示匹配一个任意字符
7.between ... and ... 范围匹配
求工资大于等于1000, 小于等于2000的员工
select * from emp where sal>=1000 and sal<=2000;
select * from emp where sal between 1000 and 2000;
1) 必须按有小到大顺序
2) between 包含等于条件
8.in
求这一列是否在一个值列表内
求所有销售人员和经理
select * from emp where job='SALESMAN' or job='MANAGER';
select * from emp where job in ('SALESMAN', 'MANAGER');
9.limit (mysql特有的)
用来限制返回的结果数
1) limit n; n表示最多返回几条记录
2) limit m, n; m代表偏移量(下标) 注意偏移量从0开始
10.order by 用来给结果排序
语法: order by 列名 asc|desc, 列名 asc|desc, ...
例如:按工资升序:
select * from emp order by sal asc;(可以省略asc)
按工资降序:
select * from emp order by sal desc;
其中如果不写,默认升序
如果多列排序,如果第一列取值相同,再按照第二列进行排序,例如:
先按工资排序,工资相同的,再按姓名排序:
select * from emp order by sal asc, ename asc; /*如果升序,两个asc都可以省略*/
函数
1. 提取时间的某个部分
extract(时间部分 from 原始时间)
select extract(year from now());
select extract(year_month from now());
返回的结果是一个数字类型
2.拼接字符串
concat(值1, 值2, ... 值n)
select concat('a', 'b', 'c');
select concat('a', 18, 'c'); /*可以把其它类型当做字符串拼接*/
3.求长度的函数
char_length 按字符为单位统计长度
length 按字节为单位统计长度
utf8mb4编码下,汉字一个字符占三个字节,英文一个字符占一个字节
4.组函数
最大值 max(列)
最小值 min(列)
和 sum(列)
个数 count(列) 会排除null值
count(*) 针对这次查询,看看一共有多少行
平均值 avg(列)
5.组语法 (group by 后的列取值相同的会被分为一组)
select ... from 表 group by 列1,列2... having 分组条件
6.去除重复
distinct
select distinct job from emp; /*去除重复后的职位有哪些*/
select count(distinct job) from emp; /*有几种职位*/
分组后 select,order by 的限制
1) select,order by 中的列必须和group by中的列一样
2) 其它没有包含在 group by语句中的列,必须和组函数一起用
7.语法顺序
select ... from ... where ... group by ... having ... order by ... limit;
8.列别名问题
语法: select 列名 别名 ...
语法2: select 列名 as 别名 ..
表别名问题
语法 : select ... from 表 别名
select e.* from emp e;
数据库的表连接:
1.内连接
Select …… from 表1 inner join表2 on 连接条件 ……
Select…… from 表1,表2 where 连接条件
内连接是把两张表中符合连接条件的的数据相结合,不符合的 则不会有结果
如果两张表中有同名列 则需要在列名前加以区分(表名.列名)
2.左
Select …… from 表1 left [outer] join 表2 on连接条件
3.右
Select …… from 表1 right [outer] join 表 2 on 连接条件
4.多表连接
Select…… from 表 1 inner join 表2 on 连接条件
inner join 表3 on 连接条件(连接属性与前一致) ……
等同于:
select * from 表1,表2,表3
where 连接条件 and 连接条件.
5.左外多表连接:
Select* from 表1 left join 表2 on连接属性
left join 表3 on 连接条件.
6.自连接:
一个表和自己连接(自己属性与另一属性相关)
Select …… from 表1 (别名)inner 表2(别名) on 连接条件
7.子查询:
把某个select结果当做一个值,或一张表做进一步查询
例如:(当做值)找具有最高工资的员工信息
Select max(sal) from emp;
Select * from emp where sal=(select max(sal) from emp);
(当做表) 获取每个部门的平均工资和部门的名称(子查询作为表)
(select deptno ,avg(sal) from emp group by deptno)s
select * from (子查询)s inner join dept b on s.deptno=b.deptno;
将子查询当做一个函数
部门编号是一个入参, 最大工资是返回结果
select * from emp e where sal = m(e.deptno);
select * from emp e where sal = (select max(sal) from emp where deptno = e.deptno);