mysql基础概念与语法

由于没有系统学过mysql,之前自己看的相关ppt资料也是囫囵吞枣式的,对视图、游标、事物什么的理解都不是很深刻。特意找了本基础的书(《mysql必知必会》)看了下。


常用命令关键词

登录账户:mysql -u username
显示库的信息:show databases
操作库之前选择对应的库:use database_name
显示库中的表: show tables
显示表的列: show columns from table_namedescribe table_name
正则表达式查找: REGEXP (用法同LIKE,只不过关键词右边跟的是正则串)


mysql函数

字符串

字符串连接: concat(str…)
串左边字符: left(str,len)
串右边字符: right(str,len)
串长度:length(str)
字串位置 : locate(substr,str)
将串转小写:lower(str)
将串转大写:upper(str)
去全部空格:trim(str)
去左边空格:ltrim(str)
去右边空格:rtrim(str)
返回子串:substirng(str FROM pos FOR len)
soundex发音值:soundex(str)

日期

增加时间:Date_add(date,interval expr type)
当前日期+时间:now()
当前日期:curdate()
当前时间:curtime()
返回日期部分:Date(expr)
返回时间部分:Time(expr)
返回年份部分:year(expr)
返回月份部分:month(expr)
返回天数部分:day(expr)
返回分钟部分:month(expr)
返回秒数部分:second(expr)
返回日期之差(result_type:day):dateDiff(expr1,expr2)
时间格式化:date_format(date,format)
返回星期几:dayOfWeek(date) [1=星期日,2=星期一…7=星期六]

全文本查找

需要为被搜索列建立FULLTEXT索引,并且引擎为MYISAM; 建表语句例如:

1
2
3
4
5
6
7
8
CREATE TABLE test
(
id int NOT NULL AUTO_INCREMENT,
msg text NULL,
PRIMARY KEY (id),
FULLTEXT(msg)
)ENGINE=MYISAM;

文本查找语句则为:

1
select msg from test where Match(msg) against("xiaoqiang");


视图

主要用来简化复杂查询语句,创建可重用的 “sql查询接口”,至于更新操作(包括插入,删除)则取决于视图建立条件,如果采用聚合函数、group by等就不允许更新。(更新视图实质上是对原表进行更新,不确定具体字段 自然不会允许更新)

创建视图:

1
CREATE VIEW `exam_view` AS select * from `exam` where appid = 'xxxxxxx';


存储过程

实质上是sql中的函数,主要用于处理复杂的sql业务(高效,安全)。例如用户商品下单时对库存商品进行一系列处理,检查商品,预定商品,更新库存数目等等 一系列流程就可采用存储过程实现。

创建过程中IN代表函数接收参数,OUT是返回结果,INOUT则复合了IN、OUT的特性。

显示存储过程信息:

1
2
SHOW CREATE PROCEDURE processName;
SHOW PROCEDURE STATUS [LIKE processName];

创建存储过程:

1
2
3
4
CREATE PROCEDURE queryEnameByEid(IN eid_Para INT,OUT ename_result VARCHAR(100))
BEGIN
SELECT ename FROM exam WHERE eid=eid_Para INTO ename_result;
END;

执行存储过程:

1
CALL processName(30,@ename_result);

调用函数结果:

1
SELECT @ename_result;

游标

实质上是存储了数据序列的结果集,在mysql中只能用于存储过程中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
BEGIN
-- 声明局部变量
DECLARE flag INT DEFAULT 0;
DECLARE tmp_value VARCHAR(50);
-- 声明游标
DECLARE my_cursor CURSOR FOR (SELECT ename FROM exam);
-- 建表
CREATE TABLE IF NOT EXISTS test_cursor(id int AUTO_INCREMENT,ename VARCHAR(50),PRIMARY KEY(id));
-- 开启游标
OPEN my_cursor;
-- 循环开始
REPEAT
-- 将游标获取的值放局部变量里
FETCH my_cursor INTO tmp_value;
-- 更改flag值
SET flag=flag+1;
-- 插入语句
INSERT INTO test_cursor(ename) VALUES(tmp_value);
-- 游标到10时结束循环
UNTIL flag=10 END REPEAT;
-- 打印表数据
SELECT * FROM test_cursor;
-- 关闭游标
CLOSE my_cursor;
END

触发器

将事件与sql执行状况绑定,可使用NEW、OLD虚拟表访问具体操作的字段值

1
2
CREATE TRIGGER delete_question_msg AFTER DELETE ON question
FOR EACH ROW SELECT 'delete question finished!' INTO @msg;
1
2
DELETE FROM question WHERE qid=528;
SELECT @msg;