-
启动mysql服务 net start mysql查看全部
-
-D,--database=name 打开指定数据库
--delimiter = name 指定分隔符
-h,--host=name 服务器名称
-p,--password[=name] 密码
-P,--port=# 端口号
--prompt=name 设置提示符
-u,--user=name 用户名
-V,--version 输出版本信息并且退出
\D 完整的日期
\d 当前数据库
\h 服务器名称
\u 当前用户
显示当前服务器版本 SELECT VERSION();
显示当前日期时间 SELECT NOW();
显示当前用户 SELECT USER();
关键字与函数名称全部大写
数据库名称、表名称、字段名称全部小写
SQL语句必须以分号结尾
创建数据库
CREATE DATABASE db_name CHARACTER SET
查看全部 -
存储引擎:
MysQL可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。
每一种存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能。
存储引擎包括:MyISAM;InnoDB;Memory;CsV;Archive。
解决一些问题:当一个用户调用一个记录进行修改,同时有一个用户在查看该条记录,那么就可能出现有一个用户被迫退出或者查看记录的那个出现错误。这时触发并发控制:即保证数据的一致性和完整性。
用锁系统来解决这类问题:共享锁和排他锁
-共享锁(读锁) :在同一时间段内,多个用户可以读取同一个资源读取过程中数据不会发生任何变化。
-排他锁(写锁) :在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作。锁颗粒-表锁,是一种开销最小的锁策略。行锁是一种开销最大的锁策略。
事务:【简单介绍的,高级课程会有更多介绍】
外键:保证数据一致性
索引:对数据的一行或者多行进行排序的一种结构
查看全部 -
扩展
Memory的存储限制是由内存的大小来决定。
CSV存储引擎不支持索引。
BlackHole:黑洞引擎,写入的数据都会消失,一般用做数据复制的中继。
2.索引:普通索引、唯一索引、全文索引、btree索引、hash索引……
3.最广泛:MyISAM/InnoDB
MyISAM:适用于事务的处理不多的情况。
InnoDB:适用于事务处理比较多,需要有外键支持的情况
查看全部 -
1、外键:是保证数据一致性的策略
2、索引:是对数据表中一列或多列的值进行排序的一种结构,如同书籍的目录,进行快速定位。
查看全部 -
1、并发控制:当多个连接对记录进行修改时保证数据的一致性和完整性;例如多个用户同时访问同一个数据库,数据库可能报错。解决此类问题的方法为锁操作。
2、锁:共享锁和排他锁
共享锁(读锁):在同一时间段内,多个用户可以读取统一资源,读取过程中数据不会发生任何变化;
排他锁(写锁):在任何时候只能有一个用户写入资源,当进行写操作时会阻塞其他的读锁或者写锁操作。
3、锁的力度:锁的颗粒
只需要对需要修改的表或者记录加锁
4、锁颗粒
(1)表锁,是一种开销最小的锁策略;【针对整张表加锁,只需加一次锁】
(2)行锁,是一种开销最大的锁策略
查看全部 -
1、查看数据表的创建命令
show create table table_name;
2、mysql可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎。每种存储引擎提供的功能不同
3、常见的存储引擎
MyISAN;InnoDB;Memory;CSV;Archive
查看全部 -
MySQL是这样执行的:sql命令——>mysql引擎——>分析语法正确——>编译成可识别的命令——>执行结果——>返回客户端
如果我们省略掉分析和编译的过程那么可以节省很多。
存储过程:是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元来处理。
存储过程存储在过程之内,可以由应用程序调用执行,允许用户声明变量,以及流程控制;存储过程可以接受参数,也可以接受输出类型的参数;并且可以存在多个返回值。
创建存储过程:
CREATE
[DEFINER = { user | CURRENT-USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[IN | OUT I INOUT ] param_name type【解释】:
IN:表示该参数值必须在调用存储过程时指定;(只进不出)
OUT:表示该参数值可以被存储过程改变并且可以返回。(可出不进)
INOUT:表示该参数的调用时指定,并且可以被改变和返回。
过程体:合法的SQL语句;可以时任意的增删改查链接的SQL语句;如果有复合结构则使用BEGIN...END 语句;复合结构中可以声明,循环和调用。
创造一个没有参数的存储过程:
CREATE PROCEDURE sp1() SELECT VERSION();
调用存储过程:
CALL sp_name([parameter[,...]])
CALL sp_name[()]
如果没有参数那么用哪个调用都可以,但是如果由参数则只能用第一个。
那么调用上面的存储过程:CALL sp1;(或者CALL sp1();)
DELIMITER//
>CREATE PROCEDURE removeUserById(IN id INT UNSIGNED)
->BEGIN
->DELETE FROM users WHERE id = id;
->END
->//
->DELIMITER ;
此处的id 存在歧义,因此应该进行修改。
修改存储过程:
ALTER PROCEDURE sp_name[characteristic ... ] COMMENT 'string' |{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY {DEFINER | INVOKER }
只能修改注释,当前的内容的类型。
删除存储过程:
DORP PROCEDURE [IF EXISTS] sp_name
但是在这里只能用删除,而不能赢用修改
DELETE PROCEDURE removeUserById;
(重新构建一下数据表的id)
DELIMITER//
>CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED)
->BEGIN
->DELETE FROM users WHERE id = p_id;
->END
->//
->DELIMITER ;
删除id 不固定的记录吗,并且返回剩余的记录数;
DELIMITER //
CREATE PROCEDURE removeUserAndReturnUserNUMS(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED)
->BEGIN
->DELETE FROM users WHERE id = p_id;
->SELECT count(id) FROM users INTO userNums;
->END
->//
->DELIMITER ;
->CALL removeUsersAndReturnUserNums(27,@nums);
@nums 就是变量
局部变量:DELETE/CLEAR,他的应用范围只在BEGIN...END 之间。也就是说在BEGIN ... END 结束后局部变量就消失了。
用户变量:即SELECT ... INTO... / SET @i=9 ;他是跟MySQL的客户端链接的,也就是只对用户的客户端生效。
【介绍一个ROW_COUNT() 函数,返回的是被影响的行数(增、删、改、更)】
如:
>DELIMITER //
>CREATE PROCEDURE removeUserByAgeAndReturnInfos(IN p_age SMALLINT UNSIGNED,OUT deleteUsers SMALLINT UNSIGNED,OUT userCounts SMALLINT UNSIGNED)
->BEGIN
->DELETE FROM users WHERE age=p_age;
->SELECT ROW_COUNT() INTO deleteUsers;
->SELECT COUNT(id) FROM users INTO userCounts;
->END
->//
>DELIMITER ;
>CALL RemoveUserByAgeAndRetrunInfos(20,@A,@B);
存储过程和自定义函数的区别:存储过程经常用于表的操作,针对性强;存储过程可以有多个返回值而函数只能有一个;存储过程通常独立完成,而函数作为其他SQL语句的组成部分完成。
在实际过程中很少用函数;对于稍微复杂的经常用到的封装成存储过程
查看全部 -
1、ROW_COUNT():被影响的记录的总数
2、创建过程:可以根据年龄删除用户,并且可以返回被删除的用户数和剩余的用户数
DELIMITER //
CREATE PROCEDURE wangning1(IN p_age smallint unsigned, OUT
dels smallint unsigned,OUT levs smallint unsigned)
BEGIN
DELETE FROM users where age=p_age;
select row_count() into dels;
select count(id) from users into levs;
END
//
常见完毕后,将//修改
DELIMITER;
查看全部 -
存储过程的定义和调用:
如果要修改存储过程的过程体:
1- 必须先删除存储过程
2- 再重建存储过程
每次自定义函数或者存储过程之前:
1- DELIMITER //先把界定符重新定义下 不要用;
2- 定义完后,再把DELIMETER 改成;
查看全部 -
在存储过程的参数区:
利用IN来修饰入参
利用OUT来修饰返回值,可以有多个
1、创建带有in和out参数类型的存储过程【输入+返回】
delimiter //
create procedure removeuserandreturnusernums(IN p_id int unsigned,
OUT usernums int unsigned)
BEGIN
delete from users where id =p_id;
select count(id) from users into usernums;
END
//
DELIMITER;
2、过程调用
CALL removeuserandreturnusernums(27,@nums)【第二个参数不能为定值,只能为变量】
select @nums;
3、局部变量、用户变量
局部变量只在begin和end之间的语句块有效;语句块运行完毕,局部变量消失;
用户变量针对客户端有效
查看全部 -
8-5 MySQL 创建带有IN类型参数的存储过程
2018-08-19
创建带参数的存储过程
delimitter //(修改结束标识)
create procedure removeById(in pidn smallint unsigned)
begin
delete from user where p_id=pid;
end
//
call removeById(5);
查看全部 -
1、创建存储过程
CREATE
[DEFINER={user|CURRENT_USER}]
PROCEDURE sp_name([proc_paremeter[,…]])
[characteristic…] routine_body
proc_paremeter:
[IN|OUT|INOUT]param_name type
2、in:表示该参数的值必须在调用存储过程时指定;
out:表示该参数的值可以被存储过程改变,并且可以返回;
inout:表示该参数在调用时指定,并且可以被改变和返回
3、特性
COMMENT:注释
CONTAINS SQL:包含sql语句,但不包含读或者写数据的语句;
NOT SQL:不包含sql语句;
READS SQL DATA:包含读数据的语句;
MODIFIES SQL DATEA:包含写数据的语句;
SQL SECURITY{DEFINER|INVOKER}:指明谁有权限连执行
4、过程体
(1)过程体由合法的sql语句构成;
(2)过程体可以是任意的sql语句;
(3)过程体如果为复合结构则使用begin_end语句;
(4)复合结构可以包含声明、循环、控制结构
查看全部 -
自定义函数:
必要条件:参数和返回值(也存在没有参数的函数,但是必有返回值)
函数可以返回任何类型的值,同样可以接受这些类型的参数。(函数的参数和返回值之间没有内在的联系,参数的数量不能超过1024个。)
创建自定义函数:CREATE FUNCTION funvtion_name RETURNS {STRING | INTEGER | REAL | DECIMAL} routine_boby
解释:RETURNS返回值类型;routine_boby为函数体。
关于函数体:合法的SQL语句;可以是SELECT和INSERT语句;如果为复合结构则使用BEGIN...END语句;复合体可以包含声明,循环,控制结构。
(1)创建不带参数的函数:SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒'); 每次使用的时候都比较麻烦,因此创建一个函数保存就可以随时调用就可以了。
创建该函数:
CREAT FUNCTION f1() RETURNS VARCHAR(30)
->RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');
创建成功后,调用:SELECT f1();
(2)创建含有参数的函数:
CREAT FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED)
->RETUENS FLOAT(10,2) UNSIGNED
->RETURN (num+num2)/2;
SELECT f2(10,5); 求两个数的平均值
(3)创建含有多个参数的函数:
SHOW TABLES; 查看数据库的数据表
DESC test; 查看数据表的结构
SELECT * FROM test; 查看数据表中的记录
CREAT FUNCTION adduser(username VARCHAR(20))
->RETURNS INT UNSIGNED
->RETURN
->INSERT test(username) VALUES(username); 这个返回一定是错误的,因为insert函数以;结尾,而一段程序也是以;结尾,所以存在一定的歧义,顾我们使用:DELIMITER // 就是以后程序结束都要以//为结束。(//可以为其他符号,为自定义)
修正后:
CREAT FUNCTION adduser(username VARCHAR(20))
->RETURNS INT UNSIGNED
->RETURN
->INSERT test(username) VALUES(username);
->LAST_INSERT_ID();
由于插入姓名后还要返回其ID,因此就有两条语句需要执行,所以是复合语句
CREAT FUNCTION adduser(username VARCHAR(20))
->RETURNS INT UNSIGNED
->BEGIN
->INSERT test(username) VALUES(username);
->RETURN LAST_INSERT_ID();
->END
->//
此函数就创建成功了,
我们可以调用:SELECT adduser('Zuo');->//
那么就可以将结束字符改回来了:DELIMITER ;
实际中应用自定义函数并不多,主要在于了解。
查看全部 -
日期时间函数
当前日期和时间NOW()
当前日期CURDATE()
当前时间CURTIME()
日期变化DATE_ADD()
日期差值DATEDIFF()
日期格式化DATE_FORMAT()
如:
SELECT DURDATE()/DURTIME(); 得到当前日期/得到当前时间
SELECT DATE_ADD('2018-11-22',INTERVAL -365 DAY); 得到的是107-11-22,这里面的DAY可以是WEEK,MONTH,YEAR等
SELECT DATEDIFF('2017-11-22','2018-11-22'); 得到的是日期的差值
SELECT DATE_FORMAT('2018-11-22','%m/%d/&Y'); 得到的就是22/11/2018
日期函数是很少被用到的!!!!!
信息函数:
连接IDCONNECTION_ID()
当前数据库DATEBASE()
最后插入记录的ID号LAST_INSERT_ID()当前用户USER()
版本信息VERSION()
如:
SELECT CONNECT_ID()/DATEBASE()/LAST_INSERT_ID()/USER()/VERSION(); 返回的是链接的ID/当前数据库/最后插入的记录的ID号/当前的用户/当前的版本信息
【复习:ALTER TABLE test ADD id ——给表添加字段的操作】
聚合函数:()只能返回一个值
平均值:AVG()
计数:COUNT()
最大/小值:MAX()/MIN()
求和:SUM()
SELECT AVG(goods_price)AS bieming FROM tdb_goods; 聚合函数都是这样的格式
加密函数:
加密:MD5() 多用于web开发
密码的计算:PASSWORD() 修改用户的密码
函数很少单独使用,所示嵌套的使用,而且可以用在数据表的相关字段上
查看全部
举报