Mysql

Mysql

数据类型

1数值型:bit(基本不是0就是1),tinyint,int,bigint

2字符型:char(定长),varchar(变长),longtext

3日期型:date(年月日),datetime(年月日时分秒),timestamp(精确到毫秒)

4枚举类型:enum(慎用,性能有问题)

5集合形:set

约束

1主键 primary key:不重复,不为空 自增长: auto increment 主键一般都是自增长

2唯一建 unique:不重复

3非空not null

4外键 foreign key Referencrs 存在依赖

mysql支持4大约束,oracle支持5个,check 例:check(gender in ('男','女'))

 CREATE TABLE course(
`cno` int(5) auto_increment COMMENT '课程编号,主键',
`cname` varchar(50) DEFAULT '' NOT NULL COMMENT '课程名称',
PRIMARY KEY(`cno`)
)
insert into course(cname) values ('Java');
insert into course(cname) values ('.Net');
insert into course(cname) values ('C#');
CREATE TABLE student16(
`id` BIGINT auto_increment,
`stuno` int(6) default 0 not null,
`stuname` varchar(50) default '' not null,
`birthday` date,
`cnum` int(5) default 0 not null,
PRIMARY KEY(`id`),
FOREIGN KEY(`cnum`) REFERENCES course(`cno`)
)

复制表

create table class_copy as select * from class

但是无法复制约束

数据库操作DML-增删改

1增加记录 insert into 表名(列名列表) values (值列表)

没写列名列表就要全部添加

添加多行记录
insert into userinfo(name,regtime) 
values 
('Tom1','2019-8-8 16:9:27'),
('Tom2','2019-8-8 16:9:27'),
('Tom3','2019-8-8 16:9:27');

2修改记录 update 表名 set 修改哪些列【where 哪些行】

binary 区分大小写

3删除数据 delete from 表名 {where 哪些行}

DML 数据操作语言:数据的增删改

DQL:查询

DDL数据定义语言:数据库对象的增删改

TPL事务控制语言:提交commit,回滚roollback

事务:一组DML语句

set autocommit=false 关闭自动提交

事务四大特性

① 原子性 :组成事务的DML语句,要么全成功【commit】,要么全失败【rollback】,不会出现半成功半失败的情况

② 一致性 :事务一旦结束,数据保持一致状态

③ 隔离性 :事务之间互不影响

④ 永久型 :事务一旦提交不能回滚

当执行了dcl或者ddl,上面的事务隐式提交

锁:这边要用,必须等待另一边把事务结束,提交完成

select 看什么 from 数据源

null值参与运算,结果一定是空值

select empno,ename,sal,sal*12+IFNULL(comm,0) 年薪,comm
from emp

列别名 通常用在运算表达式或函数上

特殊别名加双引【别命中有空格,特殊字符,区分大小写】

查询去重 distinct

特殊比较运算符

between and

in(参数列表) 等于其中任意一个

like 模糊查询 % 任意多个字符 _一个字符

转译符 \

不能用like 通配事件,不允许

is null

条件查询中不能使用列别名

排序

order by 根据列名排序

默认是升序 asc 降序是desc

排序可以用列别名,列序号(查询的第几列)因为运行顺序靠后

limit

函数

类似java中的方法,通常都有返回值

单行函数,一个返回值

多行函数 ,多个返回值

虚表dual

round (x,y)将x精确到小数点y位

truncate(x,y)截断 将x从小数点后y位截断

字符函数

length() 看看参数多长 char_length(返回多少个字符)

concat()连接 也可以连接列名

insert(x,y,z,a)从y开始,到第三个,把x中的替换成a

lower() |lcase() 将字符串全部装换成小写

upper()|ucase()将字符串全部装换成大写

replace(x,y,z)将x中的y,用z替换

substring(x,y)从x中的y开始截

日期函数

curtime() 时分秒 current_date() 获取当期日期函数 年月日

now() 年月日时分秒

timediff(x,y)时间差

datediff(x,y)天数差

date() time() year() month() day()选取时间的各个部分

-DATE_FORMAT(date,format):格式化日期;(重点)

select ename,hiredate,date_format(hiredate,'%Y-%m-%d %H:%i:%s') date

from emp

-- 计算时间间隔 TIMESTAMPDIFF()

select TIMESTAMPDIFF(hour,'2008-8-8','2019-8-30')

from dual

CASE

select empno,ename,deptno,(case deptno

                                                        when 10 then '会计部'

                                                        when 20 then '销售部'

                                                        when 30 then '管理部'

                                                        else '小卖部' END) 部门

多表连接

多表连接 :连接1张以上的表

笛卡尔积 : 一张表中的所有记录和另一张表中所有记录,都发生连接

查询员工姓名,工资,工资等级
SELECT ename,sal,grade,losal,hisal
FROM emp
JOIN salgrade
ON sal BETWEEN losal and hisal

自连接(内连接)

查询员工姓名和直接上级姓名
SELECT e.ename,m.ename
FROM emp e
JOIN emp m
ON e.mgr = m.empno

了解 : 交叉连结CROSS JOIN(笛卡尔积)、

自然连接NATURAL JOIN(相同类型、名称的字段做等值连接)、

USING 子句(指定某一列做等值连接)

掌握

join on

左【外】连接 以关键字左边表为主表,肯定显示

右【外】连接 以关键字右边表为主表,肯定显示

分组函数

在 WHERE 条件中不能直接使用

SUM,AVG,MAX,MIN,COUNT

MAX 最大值,MIN 最小值

NULL : ①影响运算;②不能比较

-- 分组函数不计算NULL值

group by(写在where 后面,order by前面)

使用分组函数时:查看字段不能随意写

SELECT 子句中,非分组函数必须写在GROUP BY后面语法才能通过

WHERE 筛选组前条件

HAVING 组后条件

查询每个部门的平均工资,部门编号,只显示平均工资2000以上的部门
SELECT AVG(sal) avgsal,deptno
FROM emp
GROUP BY deptno
HAVING AVG(sal) > 2000

子查询(嵌套查询)

子查询如果返回多行记录,不能使用单行比较运算符(>,<,=,>=,!=,<=)

oracle支持分组函数嵌套,mysql不支持,需要额外嵌套一层查询

查询部门人数大于所有部门平均人数的的部门编号,部门名称,部门人数
-- 注意:oracle支持分组函数嵌套,mysql不支持,需要额外嵌套一层查询
select d.deptno,dname,count(empno) counts
from emp e 
join dept d 
on e.deptno = d.deptno
group by d.deptno,dname
having counts > (select avg(counts)
                                 from (select count(empno) counts
                                            from emp e 
                                            group by deptno) a)

多行运算符

in

any 任意一个

all 全部

not in (查询,参数) 不能有NULL,必须处理

-- 查询比自己部门平均工资高的员工姓名,工资,部门编号,部门平均工资
select ename,sal,d.deptno,avgsal
from emp e
join (select deptno,avg(sal) avgsal from emp group by deptno) d
on e.deptno = d.deptno
where sal > avgsal

相关(高级)子查询

select ename,sal
from emp e
where sal = (select max(sal) from emp where deptno = e.deptno)

删除注意的问题:外键问题,默认情况下,外键是删不掉的

视图

本质就是(命名的)查询,如果你想频繁的调用这个查询,就建一个视图

CREATE VIEW emp_20
AS 
select * from emp where deptno = 20
drop view emp_20

索引

index

优点 :加快查询速度

-- 缺点 :①占内存;②降低了增删改速度

-- 索引是作用在列上的

-- 主键,唯一键,外键自带索引

-- 什么样的列适合加索引 :经常作为查询条件的,数据量大的时候

-- 建表直接给索引

CREATE TABLE index_tab(
`id` BIGINT auto_increment,
`name` varchar(20),
PRIMARY KEY(`id`),
index(`name`)
)

-- 建表后给索引

CREATE TABLE index_tab1(
`id` BIGINT auto_increment,
`name` varchar(20),
PRIMARY KEY(`id`)
)

CREATE INDEX aaa
ON index_tab1(`name`)

触发器

触发器就是某个表发生一个事件(增删改操作),然后自动的执行预先编译好的SQL语句,执行相关操作。触发器事件跟触发器中的SQL语句是原子性的(要么同时执行,要么同时不执行),这样保证了数据的完整性。

存储过程

简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;

存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;

缺点:1不同数据库,语法差别很大,移植困难,换了数据库,需要重新编写;

2.不好管理,把过多业务逻辑写在存储过程不好维护,不利于分层管理,容易混乱,一般存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大;

你可能感兴趣的:(Mysql)