DML数据操纵语言:查询和修改数据记录(INSERT UPDATE DELETE SELECT)
DDL数据定义语言:定义数据库的结构(CREATE ALTER DROP )
DCL数据控制语言:控制数据库的访问(GRANT REVOKE COMMIT ROLLBACK SAVEPOINT LOCK)
首先需要知道我们使用的mysql数据库或者其他数据库语句的执行顺序,from最开始 把全部表从磁盘中一次性拿出来 然后在内存中进行操作() 最后执行select返回所需要的字段,间隔一定时间才会往磁盘中写数据。
SELECT:
选择全部数据
select * from table1;
别名:空格➕名字 / as + 名字
起别名时候才用双引号,可以用来处理别名中有空格的情况
IFNULL(,):如果第一个参数是null 就用第二个代替
DISTINCT去除重复的,但是一般去重不用他 效率比较低
SELECT CONCAT(xxx,',',cccc) 进行拼串
DESCRIBE table1;
DESC table1;
显示表结构
WHERE过滤,需要紧跟from字句
SELECT xxx
FROM table1;
WHERE ccc= 90;
sql中日期型和字符型必须使用在单引号中
一般能写到where中的字句都写到where中去 这样子会更优化
select from where group by having order by
顺序是从from开始到where group by having,from首先会加载部分需要的数据 然后where过滤剩下更小的表 再groupby会产生很多临时的表,所以最好是先where先过滤了可以减少临时表的量
并且需要注意WHERE不可以过滤组函数,过滤组函数需要用having,跟在GROUP BY之后
其他比较运算符
between …and…
包括两个极端值,而且左边的数要比右边的数小
in 值列表中的任何一个值成立都行
SELECT xxx
FROM table1;
WHERE id in (90,60,80);
like模糊查询
%表示零个或多个任意字符
_表示一个任意字符
\转义字符(mysql中)
SELECT xxx
FROM table1;
WHERE name like '%e%';
is null 查询条码为空的
SELECT xxx
FROM table1;
WHERE ccc is null;
order by排序 ASC升序 DESC降序
需要写在select字句的末尾 limit除外
SELECT xxx
FROM table1
WHERE ccc= 90
order by salary DESC , id DESC; 此为多列排序
分隔
单行函数:传入一行返回一个结果
concat 拼串
SUBSTR 截取字符串(sql中索引值从一开始) 从第一个参数位置开始截取到第二个参数个数的位置
LENGTH 长度
INSTR 查找字符所在的位置
LPAD 查询一个字段 不足多少位 左边用第三个参数补齐
RPAD 查询一个字段 不足多少位 右边用第三个参数补齐
TRIM 去除首尾指定的字符
REPLACE 把这个串里面所有的第二个参数的字符变成第三个参数
ROUND 保留第二个参数位数(该参数可以为负)四舍五入
TRUNCATE 截断 不进行四舍五入
MOD 求余数
NOW() 获取当前系统时间
CASE cccc WHEN 10 THEN aaa*1.1 WHEN 20 THEN aaa*1.2 ELSE aaa*1.3 END "别名" 相当于if else语句
分隔
多表连接查询
笛卡尔集:表中全部行都满足后出来的结果 结果通常是错的,需要提供表之间的连接条件
WHERE table1.id = table2.id 当完成n个表的连接查询的时候 至少需要n-1个连接条件
这里需要注意一个点,表的别名的使用,如果字段两个表都有,我们写好了别名 就不需要数据库自己搜索 这样算是数据库优化
等值连接(上述所写的连接条件是等于不等于的连接) - 非等值连接(例如table1的字段值的范围在table2的两个字段值之间 用between and连接)
内连接 - 外连接
外连接:将表中满足或者不满足条件的数据都查询出来了
--左外连接:查询出满足条件的数据,还将左表中不满足条件的数据也查询出来
select aaa,bbb
from table1 e
left outer join table2 d
on e.id = d.id
--右外连接: 查询出满足条件的数据,还将右表中不满足条件的数据也查询出来
select aaa,bbb
from table1 e
right outer join table2 d
on e.id = d.id
--满外连接:mysql不支持
内连接:只查询出满足条件的数据
select aaa,bbb
from table1 e
join table2 d
on e.id = d.id 默认省略了inner 即默认是内连接
自连接 - 非自连接
自连接:把自己这张表看成两张表
select a.name ,b.name
from table1 a, table1 b
where a.table2ID = b.id
分割
多行函数(分组函数):传入多行返回一个结果
组函数都不计算空值,并且mysql中组函数不可以嵌套
MAX()
MIN()
AVG()
SUM()
COUNT() 如果需要计算有null的字段总数 可以用COUNT(*) 或者 COUNT(IFNULL(字段,随便一个数字))
GROUP BY分组:用来查询各个…的…是多少,即按照字段分组
select aa,bb,AVG(cc)
from table1
group by bb,aa
HAVING AVG(cc) >= 111;
注意**出现在select字句后的非分组函数必须出现在GROUP BY字句后
如果不这样放在oracle是会报错的,mysql对此做了改变 给出的是随机值 实际意义是不大的
子查询:如果需要从AVG中搜索MAX,因为mysql中不可以嵌套组函数 可以用子查询 (注意所用字段和表一定要有别名)
select MAX(avg_bbb)
from (
select aaa,AVG(bbb) avg_bbb
from table1
group by aaa
) e
子查询 ,先子查询 返回结果给主查询进行过滤得到结果
select *
from table1
where xxx>(
select cc
from table1
where aaa= '';
)
有时候子查询出来会有很多结果 如果使用单行操作符就会出问题 所以需要使用
多行操作符
IN 里面的其中一个
ANY 里面的任意一个,其中一个满足就好 = ANY 就是 IN
ALL 里面的全部,所有条件都要满足
相关子查询(解决 该组织.. 本部门... 等需求) 子查询是可以写在任何位置的 ,普通子查询是先执行子查询 然后返回给主查询,相关子查询是主查询拿一个值给子查询进行过滤 然后再返回结果给主查询,即主查询可以给值给子查询!~
分割~~~~~~~~~~~~~~~~~~~~~~~
DDL数据定义语言:**注意每一个DDL都是自动COMMIT提交的 所以不可以回滚
1创建表 数据类型 : INT CHAR(经常改动用CHAR) VARCHAR(不经常改动) FLOAT DOUBLE DATE BLOB TEXT
(1)create table
(2)CREATE TABLE ... as seclect * from ... 基于现有的表创建表(相当于表的复制,主键约束和自增不复制!!)
基于现有的表创建新的表但是不导入数据
create table ... as select * from ... where 1 = 3 ; 给一个永远不成立的条件即可~
2修改表 ALTER TABLE
(1)添加列
ALTER TABLE ... ADD ... INT(3); 添加一列但是无数据
ALTER TABLE ... ADD ... INT(3) DEFAULT 2;添加一列并且拥有默认的数据
(2)修改列
ALTER TABLE table2
MODIFY ccc VARCHAR(20)
(3)重命名列
ALTER TABLE table3
CHANGE ccc aaa VARCHAR(2);
(4)删除列
ALTER TABLE table4
DROP COLUMN aaa;
3重命名表
ALTER TABLE table
RENAME ccc
4清空表 TRUNCATE TABLE table4 **注意TRUNCATE是DDL 是不可以回滚的 因为自动提交了
DELETE FROM table4 **注意DELETE是DML 是可以被回滚的
5删除表 DROP TABLE table4
DCL:数据控制语言
COMMIT 提交
ROLLBACK 回滚到上一次COMMIT的地方
mysql默认自动提交 取消自动提交:SET autocommit = FALSE;
DML:数据操纵语言:
1添加数据
(1)INSERT INTO table1(...,...,...) VALUES(... ,... ,...)
(2)基于现有表添加数据(类型需要保持一致):INSERT INTO table1(... ,... ,...) SELECT ..., ... ,...
2修改数据
UPDATE table1 SET NAME = "ccc" ,date = "..." WHERE id = ... ;
3删除数据
DELETE FROM table1 where id = ;
4查询数据 :就是开头所写SELECT
分隔~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
事务:
(1)在COMMIT和ROLLBACK之间的一个或多个DML作为一个整体就是一个事务
(2) 每一个DDL都是一个事务
如果需要设置事务 需要保证connection的连接是同一个
事务的acid特性:
1原子性:不可分割的操作 要么都成功 要么都失败
2一致性:从一种一致性状态到另一种一致性状态
3隔离性:一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
4持久性:一个事务一旦提交,对数据库中的数据的改变就是永久性的!
约束:说白了就是对数据加一些限制
首先说下两个概念:
(1)列级约束:在列后面写约束
(2)表级约束:在创建表的末尾写的约束,可以实现组合约束
CONSTRAINT 约束名 UNIQUE(字段名1,字段名2) 必须两个字段都一样才算重复
1 NOT NULL 非空约束(列级约束)
不允许为null mysql中如果在insert的时候不写上该属性的话 int默认是0 char varchar默认是空的
添加非空约束:
ALTER TABLE table1 MODIFY aaa varchar(25) not null;
取消非空约束:
ALTER TABLE table1 MODIFY aaa varchar(25) null;
2 UNIQUE 唯一约束(列级约束 表级约束)
(1)创建表后在列那里写 UNIQUE ----列级约束
(2)在创建表的末尾写CONSTRAINT 约束名 UNIQUE(字段名)----表级约束
如果用ALTER TABLE table1 ADD CONSTRAINT 约束名 UNIQUE(字段名)添加唯一约束的话 首先要先delete from table1 把数据清空
删除唯一约束:
ALTER TABLE table1 DROP INDEX 约束名:INDEX代表索引 因为数据库会自动为带有唯一约束的列设置索引
3 PRIMARY KEY AUTO_INCREMENT主键约束(列级约束 表级约束):唯一并且非空
添加主键约束:ALTER TABLE table1 ADD CONSTRAINT 约束名 PRIMARY KEY(字段名) 仍然需要先delete from清空一下
删除主键约束:ALTER TABLE table1 DROP PRIMARY KEY (在mysql中删除主键约束后非空不会被删除!还得加一个删除非空的命令!)
4 外键(列级约束 表级约束):关联另一个表的主键,出现在外检表中的数据必须出现在主键表中(即完整性问题)!
CONSTRAINT 约束名 FOREIGN KEY(本表字段名) REFERENCES 其他表名(主键字段名)
ON DELETE CASCADE //级联删除 主键表中列被删除时 外键表中列也被删除!
ON DELETE SET NULL //级联置空 主键表中列被删除时 外键表中列被置空!(注意级联置空后该属性不可以设置not null)
添加外键约束:ALTER TABLE table1 ADD CONSTRAINT 约束名 FOREIGN KEY (本表字段名) REFERENCES 其他表名(主键字段名)
删除外键约束:ALTER TABLE table1 DROP FOREIGN KEY 约束名
mysql分页:LIMIT 放在select字句最末尾
我们主需要记住一个公式: (当前页数-1)*每页条数,每页条数 即为所需要的两个参数
SELECT aaa,bbb,ccc
FROM table1
LIMIT 0,3;