复习
1.多表查询
2.navicat
3.pymysql
1.视图 ***(是一个虚拟表,非真实存在的)
引子
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;
create view temp(emp_id,emp_name,salary,dep_id,dep_id2,dep_name,work) as
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;
# 全连接形成一张新表, 现有查询是基于全连接这张新表, 如何来操作
# 解决: 将新表其别名full_table, 将需求转换为 select 需求字段 from full_table 条件
what: 视图是由一张表或多张表的查询结果构成的一张虚拟表
why: 将复杂常用的查询结果保留下来重复使用 | 或者将一张大表拆分成多张小表
语法:
create [or replace] view 视图名[(查询字段别名们)] as 查询语句
create view new_emp as (select * from emp);
注:
1.查询字段别名们 要与 查询语句的查询字段对应
2.create or replace: 操作视图没有则创建、有则替换
create or replace view new_emp(id,姓名,工资) as (select id,name,salary from emp where dep_id = 2);
视图的修改:
alter view 视图名[(查询字段别名们)] as 查询语句
alter 等价于 create or replace, 且语法一致
alter view new_emp(id,姓名,工资) as (select id,name,salary from emp where dep_id = 1);
视图中字段的操作:不允许alter操作字段
alter table new_emp rename new_emp1; # 提示语法错误
alter view new_emp modify id tinyint;
视图中记录的操作:等价于普通表,完成增删改查
update new_emp set 姓名='san' where id = 3;(修改数据会将视图和旧表一起更改)
delete from new_emp where id = 3;
insert into new_emp(id, 姓名, 工资) values (10, "Bob", 10000); # 操作的是实体表, 虚拟表不会被插入新数据,要重新创建才能拿到最新数据
视图的删除:
drop view 视图名;
总结: 虚拟表作用 -- 查询
由一张表或多张表的查询结果构成一张虚拟表,创建视图产生的虚拟表
视图的作用在于方便查询
适合查询,原表中数据会有改变,但增删改后虚拟表中的数据不产生变化,因为原表可能链接着多个虚拟表,如果虚拟表都更新,会影响效率
mysql的data文件夹存放数据库文件,后缀名为frm文件用来保存表结构,后缀为ibd保存的数据内容
2.触发器 ***
what:定制用户对表进行[增,删,改]操作时前后的行为,会自动触发的功能称之为触发器,注意:没有查询
why:当一个表在发生数据更新时,需要去完成一些操作,可以为具体数据更新的方式添加触发器
语法:
delimiter //
create trigger 触发器名 before|after insert|update|delete on 表名 for each row
begin
需要触发执行的sql代码们
end //
delimiter ;
# 触发器名: t1_before_insert_tri
注:delimiter是用来修改sql的语句结束标识符
(用来修改sql语句的结束标识符,先将//改成sql的结束符,在里面可能有sql语句,;冒号就会被当做普通字符,然后写完再改回来)
删除触发器:drop trigger 触发器名;
触发器例子
# cmd表
create table cmd (
id int primary key auto_increment,
user char(32),
priv char(10),
cmd char (64),
sub_time datetime, # 提交时间
success enum ('yes', 'no') # 0代表执行失败
);
# 错误日志表
create table errlog (
id int primary key auto_increment,
err_cmd char(64),
err_time datetime
);
# 创建触发器
delimiter
3.事务 ***
what:事务是逻辑上的一组操作,要么都成功,要么都失败
why:很多时候一个数据操作,不是一个sql语句就完成的,可能有很多个sql语句,如果部分sql执行成功而部分sql执行失败将导致数据错乱
eg:转账 => 转入转出均成功,才能认为操作成功
事务的使用:
start transaction; --开启事物,在这条语句之后的sql将处在同一事务,并不会立即修改数据库
commit;--提交事务,让这个事物中的sql立即执行数据的操作,
rollback;--回滚事务,取消这个事务,这个事物不会对数据库中的数据产生任何影响
事务的四大特性:
1.原子性:事务是一组不可分割的单位,要么同时成功,要么同时不成功
2.一致性:事务前后的数据完整性应该保持一致(数据库的完整性:如果数据库在某一时间点下,所有的数据都符合所有的约束,则称数据库为完整性的状态)
3.隔离性:事物的隔离性是指多个用户并发访问数据时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
4.持久性:持久性是指一个事务一旦被提交,它对数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
事务的用户隔离级别:
数据库使用者可以控制数据库工作在哪个级别下,就可与防止不同的隔离性问题
read uncommitted --不做任何隔离,可能脏读,幻读
read committed --可以防止脏读,不能防止不可重复读,和幻读,
Repeatable read --可以防止脏读,不可重复读,不能防止幻读
Serializable --数据库运行在串行化实现,所有问题都没有,就是性能低
修改隔离级别:
select @@tx_isolation;--查询当前级别
set[session|global] transaction isolation level ....;修改级别
实例:
set global transaction isolation level Repeatable read;
注:修改后重新连接服务器生效
在这条语句后的sql将在同一事务,并不会立即修改数据库,可以查错
事务例子
4.存储过程(*****):
不是解决简单的sql查询过程,用来解决负责的过程
一段sql语句要重复使用,可以建立存储过程,保存下来,重复调用,不用多次写相同的sql语句
what:用于完成指定功能的sql语句块,类似于Python中的函数
why:将能指定功能的sql语句块建立成存储过程,不仅将sql语句逻辑化了,更是功能化了,那我们要完成相同的事,只需要重复使用建立的存储过程,不就需要再重复书写sql语句了
# 总结: 存储过程可以让sql语句具有 复用性, 从而提高开发效率
使用存储过程的优点:
#1. 用于替代程序写的SQL语句,实现程序与sql解耦
#2. 基于网络传输,传别名的数据量小,而直接传sql数据量大
语法:
delimiter
存储过程例子
delimiter //
create procedure send_money( out p_return_code char(20) )
begin
5.流程控制(*)
if语句的使用
第一种 if:
"""
if 条件 then
语句;
end if;
"""
第二种 if elseif
"""
if 条件 then
语句1;
elseif 条件 then
语句2;
else 语句3;
end if;
"""
案例:编写过程 实现 输入一个整数type 范围 1 - 2 输出 type=1 or type=2 or type=other;
delimiter //
create procedure showType(in type int,out result char(20))
begin
if type = 1 then
set result = "type = 1";
elseif type = 2 then
set result = "type = 2";
else
set result = "type = other";
end if;
end //
delimiter ;
set @res=null;
call showType(100, @res);
select @res;
CASE 语句
大体意思与Swtich一样的 你给我一个值 我对它进行选择 然后执行匹配上的语句 语法:
create procedure caseTest(in type int)
begin
CASE type
when 1 then select "type = 1";
when 2 then select "type = 2";
else select "type = other";
end case;
end
WHILE循环
循环输出10次hello mysql
create procedure showHello()
begin
declare i int default 0;
while i < 10 do
select "hello mysql";
set i = i + 1;
end while;
end
LOOP循环的
定义变量
declare 变量名 类型 default 值; 例如: declare i int default 0;
没有条件 需要自己定义结束语句 语法:
输出十次hello mysql;
create procedure showloop()
begin
declare i int default 0;
aloop: LOOP
select "hello loop";
set i = i + 1;
if i > 9 then leave aloop;
end if;
end LOOP aloop;
end
REPEAT循环
#类似do while
#输出10次hello repeat
create procedure showRepeat()
begin
declare i int default 0;
repeat
select "hello repeat";
set i = i + 1;
until i > 9
end repeat;
end
#输出0-100之间的奇数
create procedure showjishu()
begin
declare i int default 0;
aloop: loop
set i = i + 1;
if i >= 101 then leave aloop; end if;
if i % 2 = 0 then iterate aloop; end if;
select i;
end loop aloop;
end
6.索引 (*****)
http://www.cnblogs.com/linhaifeng/articles/7274563.html
了解知识点
了解:函数 | 约束的添加与删除 | 数据库的导入导出 | 表的导入导出
mysql提供了许多内置函数
一、数学函数
ROUND(x,y)
返回参数x的四舍五入的有y位小数的值
RAND()
返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
二、聚合函数(常用于GROUP BY从句的SELECT查询中)
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果
三、字符串函数
CHAR_LENGTH(str)
返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
CONCAT(str1,str2,...)
字符串拼接
如有任何一个参数为NULL ,则返回值为 NULL。
CONCAT_WS(separator,str1,str2,...)
字符串拼接(自定义连接符)
CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
CONV(N,from_base,to_base)
进制转换
例如:
SELECT CONV('a',16,2); 表示将 a 由16进制转换为2进制字符串表示
FORMAT(X,D)
将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。
例如:
SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
INSERT(str,pos,len,newstr)
在str的指定位置插入字符串
pos:要替换位置其实位置
len:替换的长度
newstr:新字符串
特别的:
如果pos超过原字符串长度,则返回原字符串
如果len超过原字符串长度,则由新字符串完全替换
INSTR(str,substr)
返回字符串 str 中子字符串的第一个出现位置。
LEFT(str,len)
返回字符串str 从开始的len位置的子序列字符。
LOWER(str)
变小写
UPPER(str)
变大写
REVERSE(str)
返回字符串 str ,顺序和字符顺序相反。
SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
mysql> SELECT SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
-> 'barbar'
mysql> SELECT SUBSTRING('Quadratically',5,6);
-> 'ratica'
mysql> SELECT SUBSTRING('Sakila', -3);
-> 'ila'
mysql> SELECT SUBSTRING('Sakila', -5, 3);
-> 'aki'
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
-> 'ki'
四、日期和时间函数
CURDATE()或CURRENT_DATE() 返回当前的日期
CURTIME()或CURRENT_TIME() 返回当前的时间
DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7)
DAYOFMONTH(date) 返回date是一个月的第几天(1~31)
DAYOFYEAR(date) 返回date是一年的第几天(1~366)
DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt) 根据指定的fmt格式,格式化UNIX时间戳ts
HOUR(time) 返回time的小时值(0~23)
MINUTE(time) 返回time的分钟值(0~59)
MONTH(date) 返回date的月份值(1~12)
MONTHNAME(date) 返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
NOW() 返回当前的日期和时间
QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
WEEK(date) 返回日期date为一年中第几周(0~53)
YEAR(date) 返回日期date的年份(1000~9999)
重点:
DATE_FORMAT(date,format) 根据format字符串格式化date值
mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
-> 'Sunday October 2009'
mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00',
-> '%D %y %a %d %m %b %j');
-> '4th 00 Thu 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
-> '%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'
mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
-> '00'
五、加密函数
MD5()
计算字符串str的MD5校验和
PASSWORD(str)
返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
六、控制流函数
CASE WHEN[test1] THEN [result1]...ELSE [default] END
如果testN是真,则返回resultN,否则返回default
CASE [test] WHEN[val1] THEN [result]...ELSE [default]END
如果test和valN相等,则返回resultN,否则返回default
IF(test,t,f)
如果test是真,返回t;否则返回f
IFNULL(arg1,arg2)
如果arg1不是空,返回arg1,否则返回arg2
NULLIF(arg1,arg2)
如果arg1=arg2返回NULL;否则返回arg1
自定义函数
#!!!注意!!!
#函数中不要写sql语句(否则会报错),函数仅仅只是一个功能,是一个在sql中被应用的功能
#若要想在begin...end...中写sql,请用存储过程
delimiter