网站建设知识
MySQL快速入门13
2025-07-22 10:00  点击:0

SQL:结构化查询语言,是一门编程语言,是一种管理数据的编程语言!

一 元素


数据、数据类型、变量、函数、控制流程、运算符 、注释。。。

二 注释


行注释:

方法一: # 首先表one中的内容为:
mysql> select * from one;+--------+----------+--------------+| one_id | one_data | public_field |+--------+----------+--------------+|      1 | A        |          222 ||      2 | B        |           20 ||      3 | X        |           30 |+--------+----------+--------------+3 rows in set (0.00 sec)

当id为1时的表one的内容:
mysql> select * from one where one_id = 1;+--------+----------+--------------+| one_id | one_data | public_field |+--------+----------+--------------+|      1 | A        |          222 |+--------+----------+--------------+1 row in set (0.00 sec)

加注释的时候:
mysql> select * from one #where one_id = 1;    -> ;+--------+----------+--------------+| one_id | one_data | public_field |+--------+----------+--------------+|      1 | A        |          222 ||      2 | B        |           20 ||      3 | X        |           30 |+--------+----------+--------------+3 rows in set (0.00 sec)

方法二:--【空格】

mysql> select * from one -- where one_id = 1;    -> ;+--------+----------+--------------+| one_id | one_data | public_field |+--------+----------+--------------+|      1 | A        |          222 ||      2 | B        |           20 ||      3 | X        |           30 |+--------+----------+--------------+3 rows in set (0.00 sec)

块注释:


mysql> select * from one ;+--------+----------+--------------+| one_id | one_data | public_field |+--------+----------+--------------+|      1 | A        |          222 ||      2 | B        |           20 ||      3 | X        |           30 |+--------+----------+--------------+3 rows in set (0.00 sec)

三 结束符


分号、\G、\g
其中分号和\g是一样的;
\G会对输出结果进行优化;
mysql> select * from one \G;*************************** 1. row ***************************      one_id: 1    one_data: Apublic_field: 222*************************** 2. row ***************************      one_id: 2    one_data: Bpublic_field: 20*************************** 3. row ***************************      one_id: 3    one_data: Xpublic_field: 303 rows in set (0.00 sec)

可以使用delimiter来修改结束符;
mysql> delimiter $$mysql> select * from one$$+--------+----------+--------------+| one_id | one_data | public_field |+--------+----------+--------------+|      1 | A        |          222 ||      2 | B        |           20 ||      3 | X        |           30 |+--------+----------+--------------+3 rows in set (0.00 sec)mysql> delimiter ;


四 变量




MySQL中,允许用户自己定义变量。即为用户变量(用户自定义变量)。

语法:
Set 语句可以定义并为变量赋值。
Set @var = value;

也可以使用select into 语句。为变量初始化并赋值。这样要求select语句只能返回一行,但是可以是多个字段,就意味着同时为多个变量进行赋值,变量的数量需要与查询的列数一致。
还可以把赋值语句看作一个表达式,通过select 执行完成。此时为了避免=被当作关系运算符看待,使用:=代替。(set语句可以使用= 和 :=)。
Select @var:=20; Select @v1:=id, @v2=name from t1 limit 1;select * from tbl_name where @var:=30;

自定义变量名:
为了避免select语句中
避免用户自定义的变量与系统标识符(通常是字段名),用户自定义变量在变量名前使用@作为开始符号。
@var=10;

变量被定义后,在整个会话周期都有效(登录到退出)


系统中有许多默认的变量,如:
mysql> show variables like 'char%';+--------------------------+----------------------------------------+| Variable_name            | Value                                  |+--------------------------+----------------------------------------+| character_set_client     | gbk                                    || character_set_connection | gbk                                    || character_set_database   | utf8                                   || character_set_filesystem | binary                                 || character_set_results    | gbk                                    || character_set_server     | utf8                                   || character_set_system     | utf8                                   || character_sets_dir       | D:\Program_win10\MySQL\share\charsets\ |+--------------------------+----------------------------------------+8 rows in set (0.00 sec)

定义一个变量:
set 变量名 = 变量值
注意,为了区分 系统变量和字段与用户自定义变量,需要在用户变量前,增加@标识符。
mysql> set @v1 = 123;Query OK, 0 rows affected (0.00 sec)mysql> select @v1;+------+| @v1  |+------+|  123 |+------+1 row in set (0.00 sec)
通过 select 语句可以获得当前的变量的值。


Set是专门的为变量赋值的形式,甚至可以子查询:
mysql> set @v2 = (select public_field from one where one_id = 1);Query OK, 0 rows affected (0.00 sec)mysql> select @v2;+------+| @v2  |+------+|  222 |+------+1 row in set (0.00 sec)

使用select into注入多个变量:
mysql> select 1,2,3 into @v3, @v4,@v5;Query OK, 1 row affected (0.00 sec)mysql> select @v3,@b4,@v5;+------+------+------+| @v3  | @b4  | @v5  |+------+------+------+|    1 | NULL |    3 |+------+------+------+1 row in set (0.00 sec)

mysql> select public_field from one where one_id = 1 into @v6;Query OK, 1 row affected (0.00 sec)mysql> select @v6;+------+| @v6  |+------+|  222 |+------+1 row in set (0.00 sec)

注意:select into @var 要求,只能返回一行。如果返回多行,会语法错误,或者只将最后一行的数据,注入到变量内。
使用select 为变量赋值的时候使用 :=(如果直接使用等号的话,相当于判断语句了!!!)
mysql> select @v7:='Apple';+--------------+| @v7:='Apple' |+--------------+| Apple        |+--------------+1 row in set (0.00 sec)mysql> select @v7;+-------+| @v7   |+-------+| Apple |+-------+1 row in set (0.00 sec)

比较一下语句的区别:
mysql> select * from one where @v3 = one_id;+--------+----------+--------------+| one_id | one_data | public_field |+--------+----------+--------------+|      1 | A        |          222 |+--------+----------+--------------+1 row in set (0.00 sec)mysql> select * from one where @v3 := one_id;+--------+----------+--------------+| one_id | one_data | public_field |+--------+----------+--------------+|      1 | A        |          222 ||      2 | B        |           20 ||      3 | X        |           30 |+--------+----------+--------------+3 rows in set (0.00 sec)


1,作用域。用户定义的函数,是全局的(函数内可用)。存在局部作用域变量,函数内定义的变量。
2,有效期。会话结束(连接结束)。


五 函数





5.1 内置函数




数值函数

Abs(X),绝对值 abs(-10.9) = 10
Format(X,D),格式化千分位数值 format(1234567.456, 2) = 1,234,567.46
Ceil(X),向上取整 ceil(10.1) = 11
Floor(X),向下取整 floor (10.1) = 10
Round(X),四舍五入去整
Mod(M,N) M%N M MOD N 求余 10%3=1
Pi(),获得圆周率
Pow(M,N) M^N
Sqrt(X),算术平方根
Rand(),随机数
TRUNCATE(X,D) 截取D位小数


时间日期函数

Now(),current_timestamp(); 当前日期时间
Current_date();当前日期
current_time();当前时间
Date(‘yyyy-mm-dd HH;ii:ss’);获取日期部分
Time(‘yyyy-mm-dd HH;ii:ss’);获取时间部分
Date_format(‘yyyy-mm-dd HH;ii:ss’,’ %D %y %a %d %m %b %j');
Unix_timestamp();获得unix时间戳
From_unixtime();//从时间戳获得时间


字符串函数

LENGTH (string ) //string长度,字节
CHAR_LENGTH(string) //string的字符个数
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
INSTR (string ,substring ) //返回substring首次在string中出现的位置
ConCAT (string [,... ]) //连接字串
CHARSET(str) //返回字串字符集
LCASE (string ) //转换成小写
LEFT (string ,length ) //从string2中的左边起取length个字符
LOAD_FILE (file_name ) //从文件读取内容
LOCATE (substring , string [,start_position ] ) //同INSTR,但可指定开始位置
LPAD (string ,length ,pad ) //重复用pad加在string开头,直到字串长度为length
LTRIM (string ) //去除前端空格
REPEAT (string ,count ) //重复count次
RPAD (string ,length ,pad) //在str后用pad补充,直到长度为length
RTRIM (string ) //去除后端空格
STRCMP (string1 ,string2 ) //逐字符比较两字串大小


流程函数:

CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END 多分支
IF(expr1,expr2,expr3) 双分支。


聚合函数

Count()
Sum();
Max();
Min();
Avg();
Group_concat()


其他常用函数

Md5();
Default();


内置函数举例:


rand返回0到1的随机数:
mysql> select rand();+--------------------+| rand()             |+--------------------+| 0.8635645637880681 |+--------------------+1 row in set (0.03 sec)

如何得到5到10之间的随机数呢?
mysql> select floor(rand()*5 + 5);+---------------------+| floor(rand()*5 + 5) |+---------------------+|                   8 |+---------------------+1 row in set (0.00 sec)mysql> select floor(rand()*5 + 5);+---------------------+| floor(rand()*5 + 5) |+---------------------+|                   5 |+---------------------+1 row in set (0.00 sec)

now()函数:
mysql> select now();+---------------------+| now()               |+---------------------+| 2016-08-09 00:14:53 |+---------------------+1 row in set (0.02 sec)

unix_timestamp函数:
mysql> select unix_timestamp();+------------------+| unix_timestamp() |+------------------+|       1470672909 |+------------------+1 row in set (0.00 sec)

获取当前时间:
mysql> select now(unix_timestamp());+-----------------------+| now(unix_timestamp()) |+-----------------------+| 2016-08-09 00:15:32   |+-----------------------+1 row in set (0.00 sec)

字符串,substring(原字符串,开始位置,截取长度),位置从1开始:
mysql> select substring('Apple', 1, 2);+--------------------------+| substring('Apple', 1, 2) |+--------------------------+| Ap                       |+--------------------------+1 row in set (0.00 sec)

length函数(别忘了设置set names gbk;):
mysql> select length('Apple'), length('苹果');+-----------------+----------------+| length('Apple') | length('苹果')    |+-----------------+----------------+|               5 |              4 |+-----------------+----------------+1 row in set (0.01 sec)

lpad(需要补足的字符串,补足后的长度,补字符串):
mysql> select lpad('abc', 5, '5');+---------------------+| lpad('abc', 5, '5') |+---------------------+| 55abc               |+---------------------+1 row in set (0.00 sec)

六 存储函数----自定义函数




6.1 要素


函数名参数列表函数体返回值

6.2 语法


Create function function_name (参数列表) returns 返回值类型函数体

函数名,应该合法的标识符,并且不应该与已有的关键字冲突。
一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。


参数部分,由参数名和参数类型组成。

返回值类类型

函数体由多条可用的mysql语句,流程控制,变量声明等语句构成。
多条语句应该使用 begin end语句块包含。
注意,一定要有return 返回值语句。

删除:
Drop function if exists function_name;

查看:
Show function status like ‘partten’Show create function function_name;

修改:
Alter function function_name 函数选项。




创建函数,功能时返回hello,world!:
mysql> delimiter $$mysql> create function sayHello() returns varchar(20)    -> begin    ->  return 'hello, world!';    -> end    -> $$Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;

函数执行结果:
mysql> select sayHello();+---------------+| sayHello()    |+---------------+| hello, world! |+---------------+1 row in set (0.02 sec)

注意:函数是与当前的数据库绑定的,可以使用库名.函数名的形式调用;