1.库
- 显示所有数据库:show databases;
- 创建库:create database库名;
- 显示建库语句:show create database库名;
- 创建库时设置默认字符集:
create database库名 default character set 字符;(utf8,gbk)
- 删除数据库:drop database库名;
- 选定操作的数据库:use库名;
2.表
1) 显示库中所有表:show tables;
2) 创建表:
create table 表名(
列名1 数据类型(长度) [约束],
列名2 数据类型(长度) [约束],
)
3) 显示建表语句:show create table 表名;
4) 查看表结构:desc 表名;
5) 删除表:drop table 表名;
3.insert语句:
全表插入--要求字段一一对应,数量也要匹配
insert into表名values(值1,值2...);
insert into emp values(1,'lucy','cook',1,'2017-12-13',8000,1000,1);
全字段插入数据
insert into表名(列1,列2...) values (值1,值2....);
insert into emp(empno,ename,sal) values (2,'hanmeimei',1200);
批量插入insert into t_item (id,title,price,num)values(8,'mac',12888,12),(189, '小pad',3888,188);
4.select语句:
1) 查询: select * from表名;
2) 查询当前时间:select now() from dual;
5.update语句:(修改数据)
update表名 set 字段名 = 值 where 条件(empno=1);
例子:
修改所有18888为28888
update hero set money=28888 where money=18888;
修改30岁的人名为呵呵
update person set name='呵呵' where age=30;
6.delete语句:(删除一条数据)
1).delete from 表名 where 条件;
DELETE FROM book WHERE bname IS NULL;(删除是null的不用“=”号,用“is”)
2).truncate table 表名 清空整张表(删除后恢复不了,效率高)
运行机制:把整张表删除,创建一张一模一样的空表。
3).delete from 表名 (可以回滚取消删除)
7.alter
- 修改表名:rename table 原表名 to 新表名;
- 修改表的引擎和字符编码:
alter table 表名 engine=xxx,charset=xxx; (engine=myisam/innodb)
3.添加表字段:
alter table 表名 add 字段名 数据类型 位置(first,after);
(添加字段不写位置就是添加到末尾)
最后面格式:alter table表名 add 字段名 字段类型;
最前面格式:alter table表名 add 字段名 字段类型 first;
某字段后面:alter table表名 add 字段名 字段类型 after 字段名;
alter table person add gender varchar(5);
alter table person add id int first;
alter table person add salary int after name;
4.给字段改名:
alter table表名 change 原列名 新列名 数据类型;
alter table person change id pid int;
5.给字段加数据结构:
alter table 表名 modify 列名 数据类型;
6.修改字段顺序:
alter table 表名 modify 字段1 数据类型 after 字段2;
7.删除表字段(字段==列):
alter table表名 drop 字段名;
alter table person drop salary;
8.sql分类:
- DDL数据定义语言
- 负责数据结构定义与创建数据库对象的语言
- 常见create alter drop truncate
- 特点 DDL不支持事务 DDL语句操作的命令无法回滚(rollback)。
- DML数据操作语言
- 负责对数据库中更改数据操作的命令
- insert update delete
- 误区,其实select-->也属于DML
- 把增查改删称为CRUD
- DML语句支持事务,在非自动提交模式时,可以rollback回滚。
- insert update delete--->mysql 默认自动commit
- DQL数据查询语言
- data query language
- 用于查询表内数据的指令select
- dql是工作使用最多的指令。
- TCL事务控制语言
- Transaction control language
- 负责数据库中事务支持的语言,包括commit,rollback,savepoint等
- DCL数据库控制语言
- 用于管理数据库的授权和角色
- DCL包括grant revoke等
9.数据库数据类型:
1.整数:
- tinyint 1字节
- smallint 2字节
- int 4字节
- bigint 8字节
2.浮点数:
float(m,d)
double(m,d)
decimal(m,d)
m为这个数的总长度,d为小数点后面几位
decimal不会精度偏移
3.字符串:
char(m) m为固定长度,m为最大长度255
varchar(m) 可变长度,一般不超过255字节
text 2^16-1字节 65535字节
blob 大数据对象,以二进制方式存储数据
**char和varchar区别:
char(20)--->’abc’--->abc+17个空格
varchar(20)--->abc--->abc
char的长度不可变,如果数据不足长度,那么使用空格站位,同时char没办法处理末尾带空格的数据;
同样长度,char的效率比varchar高。
4.日期:
date 存日期 ‘1986-11-15’
time 存时间 ’14:54:24’
datetime 存储日期和时间 年月日时分秒
9999年上限 必须手动输入时间,默认null
timestamp 到2038年 如果没有手动输入,默认当前时间
bigint(long 毫秒)
5.其他的数据类型 set:
int(m),这里m跟长度无关,查询显示的位数.
CREATE TABLE int_demo2(
num INT(4) ZEROFILL
);
INSERT INTO int_demo2 VALUES(1);
显示:0001
**int(m)不写m行不行,语法上可以,但是语义不行**
**int(m),业务需要这个字段多长**
拓展知识点,找回密码:
操作步骤:
- 关掉本地mysql服务
- 控制台输入一个命令mysqld --skip-grant-tables这个控制台不要关闭,这个控制台就变成了一个mysql服务
- 再开启一个黑窗口,输入mysql -uroot -p不需要密码可以进入
- 选定mysql -更改user表update user set password='新密码' where user='用户名';
- 全部关闭,全部重启
别名:
SELECT comm AS '奖金' FROM emp WHERE comm IS NOT NULL;
SELECT ename '员工姓名',sal '工资',mgr '上级领导编号' FROM emp WHERE mgr IS NOT NULL;
10.SQL LIKE 操作符
like:(像……一样)
模糊查询
使用通配符
- “%” --- 一个或多个字符
- “_” --- 一个字符
between … and …;在…之间
in() 在…里边
not in()/not between…and…/not like…
distinct去掉重复的列值
SELECT DISTINCTjob FROM emp;
11.order by排序
默认排序为升序
在where语句之后
asc为升序,desc为降序;
两个以上排序以“,”隔开
多重排序,按照参照字段顺序,先按照第一位字段顺序,如果排序中有重复的字段
12.limit子句
limit begin,size
begin:代表本页数据起始行,从0开始
size:代表本页有多少条数据
limit子句要写在order by 之后
13.concat()函数
concat(str1,str2);
返回结果是一个字符串
如果拼接过程中,有一个字段是null,结果就是null;
将两个数据拼接到一起
SELECT CONCAT(title,price) FROM t_item;
SELECT CONCAT('今天中午','跟炒饼有仇') '心情' FROM DUAL;
+ - * / % 都可以计算 mod()
Mysql是弱数据类型,数字可以和字符串进行计算10+’10’
%--->mod()是同一个意思:取余 7%2==mod(7,2)
14.日期函数:
1.now() 返回当前的日期和时间
select now() from dual;
2.curdate() 返回的是当前的日期
select curdate() from dual;
3.curtime()返回当前时间
select curtime() from dual;
4.date()提取日期表达式的日期部分
select date(now()) from dual;
5.time()提取日期表达式的时间部分
select time(now()) from dual;
6.extract()提取日期表达式中单独的字段 年,月,日,时,分,秒
select extract(year from now()) ‘年’ from dual;
select extract(month from now()) ‘月’from dual;
select extract(day from now()) ‘日’from dual;
select extract(week from now()) ‘周’from dual;
select extract(hour from now()) ‘时’from dual;
DATE_FORMAT()函数
用于不同的格式显示/日期数据
把时间格式--->字符串
语法:date_format(时间数据,格式)
Date_format(date,format)
format:
%c 月 1 2 3 4 5 6 7 8 9 10 11 12
%d 月的日 (00-31)
%H 小时 (00-23)
%h 小时 (01-12)
%i 分钟 (00-59)
%m 月 01 02 03 04 05 06 07 08 09 10 11 12
%S 秒 (00-59)
%Y 年
str_to_date
把字符串转换成mysql认识的时间格式
SELECT STR_TO_DATE('08/12/16','%y/%c/%d') FROM DUAL;
IFNULL()函数
空值处理函数
语法:ifnull(e1,e2)如果e1不是null,那么返回e1,如果e1是null,返回e2.
ifnull返回值的类型,根据上下文逻辑,返回整数或字符串
15.聚合函数:
对多行数据进行合并并统计
sum() 求和 select sum(sal) from emp;
avg() 平均值 如果值为null不参与计算。
count() 求总数 不包括null的列
max() 最大值
min() 最小值
聚合函数不可以放到where之后,where执行的时候聚合函数还没有计算出结果
拓展知识点:
1.其他字符串函数(知道):
- charlength字符数 select ename,charlength(ename) from emp;
- concat('a','b','c')
- instr()返回第一个子串的位置 index从1开始 select instr('abcdef','cd') from dual;
- locate()返回第一个子串位置
select locate('abc','--abc--abc--abc--') from dual;
- insert()用子串取代从指定位置开始的N个字符 select insert('abcdefg',2,3,'-') from dual;
- lower()变为小写 select lower(ename) from emp;
- upper() select upper('abcd') from dual;
- left()返回最左边N个字符 select ename,left(ename,3) from emp;
- right
- trim(' a b c ')
- substring('abcdef',2)
- repeat('abc',3) select repeat('abc',3) from dual;
- select replace('hello Mysql','My','you');
- reverse反转
- space select space(10);
2.数学函数:
- floor-舍弃小数(正数,负数效果不同)
select floor(3.5);--3 select floor(-3.5);-- -4
- round(3.14) select round(-3.14) from dual; select round(-3.54) from dual;
- round(num,2) select round(3.556,2); select round(563.556,-2);
- truncate舍去小数点后面N位
select truncate(236.96,-1);
16.Group by 语句
select 列名,……,聚合函数(一个或多个)
from 表名
where 过滤条件
group by 分组条件
order by 排序
group by 作用:根据一个或多个列对结果进行分组
group by 必须在where和order之间
分组是为了聚合函数的更好应用
如果语句出现分组,那么所有的聚合函数都自动按照所属组别去统计数据
分组查询一般和聚合函数捆绑出现
一条select语句分组查询,select后面跟随的字段会存在普通的字段和聚合函数,
那么,分组条件一定包括普通字段。
所有的聚合函数必须使用别名
Group by可以根据多个字段分组
17.有条件分组统计
select执行过程:
- from找到数据源
- where过滤记录,确定查出的条目
- group分组
- 聚合函数的计算
- 分组过滤语句having
- 计算所有表达式
- 确认select字段
- order排序
having过滤分组条件
语法:
select字段名,聚合函数
from表名
where过滤条件
group by分组条件
having过滤分组条件
order by排序
如果having没有聚合函数可以使用where过滤
18.Mysql子查询
子查询是嵌套在另一个dml,dql语句中的
子查询称为内部查询,包含子查询的查询语句,称为外部查询
子查询可以再使用表达式的任何地方使用,并且必须在括号中关闭
表达式中使用子查询:
- 字段对应一个值(= > < >= <= !=)
- 字段对应多个值in,not in
关联查询数据 :
- 笛卡尔积:
当两张表关联时,若没有关联条件,则返回总条数为两张表的条目数乘积
这个乘积的结果叫做笛卡尔积
笛卡尔积通常是一个无意义的结果
要避免出现笛卡尔积,数据量大时会出现内存溢出。
1.等值连接/内连接语法:
select *
from A (inner可省略) join B
on A.某字段 = B.某字段
where筛选条件
N张表之间,做关联条件,至少存在n-1条件
内连接:
不满足关联条件的记录不会再内连接查询中被查询出来。
2.左外连接:
以left join 左侧的表作为驱动表(左侧的所有数据都会被查出来,哪怕不符合关联查询条件),那么当该表中某条记录不满足关联查询时,来自右侧表中的字段全部填写null.
语法:
select *
from驱动表 left (outer可省略) join 普通表
on关联查询
select d.deptno ‘dept左’,e.deptno ‘emp右’
from dept d left join emp e
on d.deptno=e.deptno;
3.右外连接:
语法:
select *
from普通表right (outer可省略) join 驱动表
on关联条件
select d.deptno ‘dept左’,e.deptno ‘emp右’
from emp e right join dept d
on d.deptno=e.deptno;
4.在数据库 全外连接 full join,mysql不支持全外连接,oracle支持;
- 子查询(拓展):
使用在表达式中 = > <,不需要有别名
子查询可以代替表放在from后面,充当数据源,必须有别名
select ename,job,sal from emp where sal > 1250;
select ename from (select ename,job,sal from emp where sal >1250) t;
create table e1 as(select ename,job,sal from emp where sal >1250);
自连接:
在逻辑上,把一张表当成两张来操作。
当前表的一条记录可以对应这张表的多条记录
自连接是为了解决同类型数据,但是存在上下级关系的树状结构的数据时使用
使用方式:
自己关联自己
设计方案,主表中添加一个字段,保存从表的主键
一对多关联:
员工表和部门表
通常一方称之为主表,多方称之为从表
设计方案,主表中添加一列作为外键,外键中存储是从表的主键。
多对多关联:
学生和课程
设计方案,添加一个中间表,保存两张的主键,形成关联
权限管理表的实现:
视图:view
- 视图也看作为表,但是表是真实存在的,视图是假表,不真实存在,视图是表的映射,或者是投影。
- 视图是一条DQL语句的结果集,把这个结果集当成表来使用。
- View本身不包含数据,他是一个DQL结果的映射。
- 如果DQL结果集的基表发生数据改变,那么对应视图的数据也会随之发生变化。
创建视图:
create view视图名as(子查询);
视图:
是数据库对象之一,由于数据对象名称不可以重复,所以视图的命名v_开头,
视图在sql语句中体现的角色与表相同,就是对表的操作在对视图的时候基本都可以操作,
但是视图并不是一张真实存在的表,而是对应一个select查询结果集。
视图最大的作用--->重用子查询
视图对应的子查询字段若含有函数或者表达式,那么该字段必须制定别名,如果其他普通字段也制定别名,那么在对视图操作时,只能通过别名找到相应字段。
- 修改视图:
视图的分类:
简单视图:
对应的子查询中,不含有关联查询,查询的字段不包括表达式,函数,没分组,没有去重。
复杂视图:
有上述任意一点都叫复杂视图。
对视图进行dml操作,只针对简单视图可以使用
- 数据污染
如果原列表有约束,那么不满足约束,不可以操作。
对视图的操作就是对基表的操作,操作不当可能对基表进行数据污染
- 对视图做Update,先去看where条件,如果where的条件在视图中可以找到,那么修改视图并且修改基表,若找不到,不修改视图,不修改表。
- 删除,删除是不会发生数据污染
- 为视图添加一个检查约束,可以保证对视图进行dml操作后,必须保证你操作的数据在视图可见,否则不允许dml操作,这样就对基表避免了数据污染。
With check option
CREATE OR REPLACE VIEW v_emp_5
AS
SELECT empno,ename,deptno
FROM emp
WHERE deptno = 20
WITH CHECK OPTION;
视图的作用
如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可,简化复杂查询。
对基表数据保护,限制数据访问。
工作中对视图一般只进行DQL,不使用DML
- 删除视图:
drop view 视图名;
删除视图不会影响基表数据;
删除视图中的数据,会影响基表数据。
索引原理:
- 索引概述:
- 用来加快查询的技术有很多,拼音,比划等等
- 数据库中使用索引加快查询速度
- 如果不使用索引,mysql必须从第一条记录开始然后读完整个表,直到找到相关行,表越大,数据越多,花费的时间越多。
- 索引可以用来改善性能,但有时候索引反而使性能降低。
- 索引的统计与应用是数据库自动完成的
- 创建索引,删除索引
CREATE INDEX idx_ename ON emp(ename);
- where ename=’’
- order by name
- distinct
- 但是like不用
- 复合索引:
CREATE INDEX idx_emp_job_sal ON emp(job,sal);
- 创建表的时候直接添加索引:
CREATE TABLE mytable(
id INT,
username VARCHAR(20),
INDEX idx_mytable_user(username)
);
- 更改表的索引:
ALTER TABLE mytable ADD INDEX idx_mytable_username1(username);
- 删除索引:
DROP INDEX idx_mytable_username1 ON mytable;
- 合理使用索引提升查询效率
- 不要在小表上建立(条目少)
- 不要在经常做dml操作的表上建立
- 限制表上的索引数目,索引不是越多越好
- 删除很少被使用,不合理的索引
- 为经常作为表的连接条件的列创建索引
- 为经常出现在where子句中的列创建索引
- 为经常出现在order by,distinct后面的字段建立索引,如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致。
MySQL约束:
- 主键约束:
- 用来约束行不重复,任意的两行主键值都不相同,每行都具有一个主键值,也不允许主键为null。
- 列级语法创建:
CREATE TABLE t1(
id INT PRIMARY KEY,
NAME VARCHAR(10)
);
- 表级语法:
CREATE TABLE t2(
id INT,
NAME VARCHAR(10),
PRIMARY KEY(id)
);
给表起名,日后好删。
CREATE TABLE t2(
id INT,
NAME VARCHAR(10),
CONSTRAINT(关键字,起名字用) pk_t3_id PRIMARY KEY(id)
);
CREATE TABLE t4(
id INT PRIMARY KEY AUTO_INCREMENT,自增长
NAME VARCHAR(20)
);
INSERT INTO t4 VALUES (NULL,'aaa');
INSERT INTO t4 VALUES (10,'aaa');
INSERT INTO t4 VALUES (NULL,'aaa');
INSERT INTO t4 VALUES (2,'aaa');
INSERT INTO t4 VALUES (NULL,'aaa');
在建表之后,使用命令添加主键约束。
CREATE TABLE t5(
id INT,
NAME VARCHAR(20)
);
ALTER TABLE t5 ADD PRIMARY KEY(id);
ALTER TABLE t5 MODIFY id INT PRIMARY KEY AUTO_INCREMENT;
- 删除主键约束:
alter table t5 drop primary key;
alter table t5 modify id int;(mysql这个命令不起作用)
- 复合主键:
不推荐使用
- 外键约束:(FOREIGN KEY)
- 一般除非特殊要求,否则只建立逻辑外键约束。
- 外键约束是保证一个或两个表之间的参照完成性,保持数据一致性
- 表的外键可以使另一张表主键,也可以是唯一的索引,外键可以重复,可以使空值。
- 实现一对一或者一对多关系。
外键约束的要求:
- 要求主表和从表必须使用同一个数据库引擎
- 只要使用外键,必须使用innodb
- 外键列和参照列必须创建索引。如果外键列不存在索引,mysql自动创建。
- 外键列和参照列必须具有相似的数据类型,长度,或是有符号位必须相同,而字符的长是可以不同的。
关于外键的使用:
CREATE TABLE class(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10)
);
列级语法:
CREATE TABLE s1(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
class_id INT REFERENCES class(id)
);
表级语法:
CREATE TABLE s1(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
class_id INT,
CONSTRAINT fk_class_id FOREIGN KEY (class_id) REFERENCES class(id)
); 外 键 依赖于
语法:constraint 约束名称 约束(列名) references 表名(列名)
虽然mysql支持外键约束使用列级语法创建,但是这种列级语法的外键约束不会生效,只有表级的外键约束生效。
Mysql提供列级外键约束的语法,是为了和标准sql保持兼容性。
CREATE TABLE teacher_table(
tid INT AUTO_INCREMENT,
tname VARCHAR(20),
PRIMARY KEY(tid)
);
INSERT INTO teacher_table VALUES (NULL,'t1');
INSERT INTO teacher_table VALUES (NULL,'t2');
INSERT INTO teacher_table VALUES (NULL,'t3');
INSERT INTO teacher_table VALUES (NULL,'t4');
- 唯一约束(UNIQUE):
- 指定表中某一项或者多个列不能有相同的两行或者两行以上的数据存在
- 唯一约束可以保证记录的唯一性
- 唯一约束的字段可以为空值,而且空值可以有多个
- 每张表可以存在可以多个唯一约束
- 主要用途,用来防止数据插入的时候重复
列级语法:
CREATE TABLE t6(
id INT PRIMARY KEY,
NAME VARCHAR(20) UNIQUE
);
表级语法:
CREATE TABLE t7(
NAME VARCHAR(20),
UNIQUE KEY(NAME)
);
复合的唯一约束
删除唯一约束
alter table t7 drop unique uq_t7_name;
修改唯一约束
alter table t8 add unique uq_..(字段);
alter table t8 modify name varchar(20) not null;
alter table t8 modify name varchar(20) null;
- 默认约束(DEFAULT)
Create table t9(
Id int,
Name varchar(20),
Sex char(10) default’男’
);
CHECK约束—mysql不支持 ,写上check不报错,没效果。
事务
原理:
- 原子性:业务的最小单元
- 一致性:事务作为一个整体执行,包含其中的操作要么都执行,要么都不执行
- 隔离性:多个事务同时执行,每个事务不影响其他事务
- 持久性:已经被提交的事务,对数据的修改真实的保存的数据库中
Mysql事务:
- innodb
- mysql默认自动开启事务提交
SHOW VARIABLES LIKE 'autocommit'
SET autocommit=0;0—off 1—on