MYSQL学习笔记

记录自学mysql一些知识点,将笔记稍作整理当成复习。很多都是网上摘抄,写的乱七八糟后续再慢慢修改

  1. 数学类函数:

    CEIL(X), CEILIN(X)-----------进一取整
    FLOOR(X)-------------舍掉小数部分
    ROUND(x, y)----------四舍五入(保留y位小数)
    MOD(x,y)---------x除以y以后的余数
    ABS(x)-----------取x的绝对值
    POWER(x, y), POW(x, y)---------幂运算(x的y次幂)
    PI()------------圆周率
    RAND()或者RAND(X)------------0~1之间的随机数, x相同时返回的结果相同.
    SIGN(X)-------------得到数字符号
    EXP(X)-------------计算e的x次方;

    PI()----------返回圆周率, 默认7位

    TRUNCATE(X, Y)---------返回x,保留小数点后y位

    SQRT(x)----------返回非负数x的二次方根

    LOG(x)----------返回x的基数为2的对数

    LOG10(x)-----------返回x的基数为10的对数 

    RADIANS(x)----------将角度转换为弧度

    DEGREES(x)-----------将弧度转化为角度

    SIN(x)---------------返回x的正弦, 其中x在弧度中被给定

    ASIN(x)----------------返回x的反正弦, 若x不在-1到1之间的值, 则返回NULL

    (COS, ACOS, TAN, ATAN, COT等类似)

        format(数值,取几位小数)  将数值化为整数或带几位小数   

  2. 字符串函数

    CHAR_LENGTH(s)-----------返回字符串s的字符数

    LENGTH(s)------------------返回s的长度, 单位为字节, 一个多字节字符算作多个字节

    CONCAT(s1, s2, .....)----------------返回结果为连接参数(s1, s2, ....)产生的字符串, 若有一个参数为NULL, 则返回NULL.如果所有参数均为非二进制, 则返回结果为非二进制,若有一个参数为二进制, 则返回结果为二进制字符串.一个数字参数转化为与之相等的二进制字符串格式, 若要避免这种情况, 可以使用显式类型CAST, 

如: SELECT CONCAT(CAST(int_col AS CHAR), char_col);

    CONCAT_WS(x, s1, s2, .....)------------同CONCAT()函数, 但是每个字符串要直接加上x

    INSERT(s1, x, len, s2)---------------将s2替换s1的x位置开始, 长度为len的字符串

    UPPER(s), UCASE(s)------------将s转换为大写

    LOWER(s), LCASE(s)-------------将s转换为小写

    LEFT(s, n)------------返回字符串s从左边开始的n个字符

    RIGHT(s, n)----------返回字符串s从右边开始的n个字符

    LPAD(s1, len, s2)------------返回字符串s1, 其左边用s2填补到len字符长度,

                假如s1的长度大于len, 则返回s1被缩短至len的长度

    RPAD(s1, len, s2)-------------返回字符串s1, 其右边被字符串s2填补至len字符长度, 假如s1的长度大于len, 则返回值被缩短到与len字符相等的长度

    LTRIM(s)----------返回字符串s, 开头空格字符被删除

    RTRIM(s)----------返回字符串s, 结尾空格字符被删除

    TRIM(s)----------去掉s开头和结尾的空格

    TRIM(s1 FROM s)----------去掉s中开头和结尾处的字符串s1

    REPEAT(s, n)-----------将字符串s重复n次

    SPACE(n)------------返回个空格

    REPLACE(s, s1, s2)---------用s2代替s中的s1

    STRCMP(s1, s2)----比较s1和s2

    SUBSTRING(s, n, len)---------获取字符串s中的第n个位置开始长度为len的字符串

    MID(s, n, len)--------------同SUBSTRING(s, n, len)

    LOCATE(s1, s), POSITION(s1 IN  s)---------------从字符串s中获取s1的开始位置

    INSTR(s, s1)-------------查找字符串s1在s中的位置, 返回首次出现的位置的索引值

    REVERSE(s)----------将字符串s反序

    ELT(n, s1, s2, .....)----------返回第n个字符串

    EXPORT_SET(bits, on, off[, separator [, number_of_bits ] ] )---------

 返回一个字符串, 生产规则如下:  针对bits的二进制格式, 如果其位为1, 则返回一个on值, 为0返回off值, 每个字符用separator进行分隔, 默认为" , "  .  number_of_bits指定可用的位数, 默认为64位.例如: 生成数字182的二进制(10110110)替换格式, 以" @ "作为分隔符, 设置有效位为6位, 其语句如下:SELECT EXPORT_SET(182, 'Y', 'N', '@', 6)       

其返回结果为: N@Y@Y@N@Y@Y

    FIFLD(s, s1, s2, ............)-----------返回第一个与字符串s匹配的字符串的位置

    FIND_IN_SET(s1, s2)----------返回在字符串s2中与s1相匹配的字符串的位置

    MAKE_SET(x, s1, s2, ........)-------------按x的二进制数从s1, s2, .............sn中选取字符串

  3. 日期和时间函数

    CURDATE(), CURRENT_DATE()----------返回当前日期

    CURTIME(), CURRENT_DATE()-----------返回当前时间

    NOW(), CURRENT_TIMESTAMP(), LOCALTIME(), SYSDATE(), LOCALTIESTAMP()--------返回当前日期和时间

    UNIX_TIMESTAMP()----------以UNIX时间戳的形式返回当前时间, 

    UNIX_TIMESTAMP(d)---------将时间d以UNIX时间戳的形式返回

    FROM_UNIXTIME(d)----------把UNIX时间戳转化为普通时间格式返回

    UTC_DATE()-----------返回UTC(国际协调时间)日期

    UTC_TIME()------------返回UTC时间

    MONTH(d)------------返回日期d中的月份值, 范围为1-12

    MONTHNAME(d)--------返回日期d中的月份名称, 如: January, February.....

    DAYNAME(d)-----------返回日期d是星期几, 如Monday, Tuesday.....

    DAYOFWEEK(d)-----------返回日期d是星期几, 1表示星期日, 2表示星期一......

    WEEKDAY(d)-------------返回日期d是星期几, 0表示星期一, 1表示星期二......

    WEEK(d)----------计算日期d是本年的第几个星期, 范围是0~53

    WEEKOFYEAR(d)-----------计算日期 d 是本年的第几个星期,范围是 1~53

    DAYOFYEAR(d)-----------计算日期 d 是本年的第几天

    DAYOFMONTH(d)-----------计算日期 d 是本月的第几天(也可简写为:DAY)

        LAST_DAY()——————函数是取某个月最后一天的日期

        例:可配合dat获取月份对应的天数select day (last_day('2022-1-11'))结果为31

    YEAR(d)--------返回年份

        DATE_FORMAT(date,fmt)--------返回按字符串fmt格式化日期date值

        DATE_ADD(date,INTERVAL expr type)--返回一个日期或时间值加伤一个时间间隔的时间值

        DATEDIFF(expr,expr2)-----------返回起始时间expr和结束时间expr2之间的天数

    QUARTER(d)----------返回日期d是第几季节,返回 1 到 4

    HOUR(t)-----------返回 t 中的小时值

    MINUTE(t)----------返回 t 中的分钟值

    SECOND(t)------------返回 t 中的秒钟值

    EXTRACT(type FROM d)------------从日期 d 中获取指定的值,type 指定返回的值。 type可取值为: MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, 

MONTH, QUARTER, YEAR,  DAY_SECOND, DAY_MINUTE, DAY_HOUR, YEAR_MONTH.....

    TIME_TO_SEC(t)-----------将时间 t 转换为秒

    SEC_TO_TIME(s)--------将以秒为单位的时间 s 转换为时分秒的格式

    TO_DAYS(d)---------计算日期 d 距离 0000 年 1 月 1 日的天数

    FROM_DAYS(n)--------计算从 0000 年 1 月 1 日开始 n 天后的日期

    DATEDIFF(d1,d2)-------计算日期 d1->d2 之间相隔的天数

    ADDDATE(d,n)--------计算起始日期 d 加上 n 天的日期

    ADDDATE(d, INTERVAL expr type)-------计算起始日期d加上一段时间(expr)之后的日期, type可以为: day, month.....

Exists 函数:用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值

True 或 false。Esists指定一个子查询,检测行的存在

例:

select * from 员工表

where not exists ( select 部门ID  from 部门表 where 部门表员工ID  = 员工表员工ID)

释:查找未分配部门的员工信息,主表中每一个需要输出的行都需要先去匹配子查询,为true则输出,为false则不输出。通过子查询过滤已分配部门的员工。

所有字符串都必须使用单引号,括号的作用是将括号内当成一个集合使用。

不管何种连表分组后,输出结果时都是以主表为主,副表列为空也会显示null或0

Order by 可写在分组后,对count进行排序:group by  col  order by  count  asc

只有一条数据的两个查询结果可以直接连表组成一个新的表

三表左、右 join可用圆括号,圆括号后不可使用别名,连A,B表,再连C

例:FROM (dept_emp AS de INNER JOIN salaries AS s ON de.emp_no = s.emp_no)

INNER JOIN departments AS dp ON de.dept_no = dp.dept_no

describe 表名 ——查看表内可用字段属性

两个表查找不同时,可用连表后,where is null

DISTINCT 列名 ——结果消重

查重复数量时可用 group by 分组后,count(*)-1 查找出重复数量,select输出单列单行是必须是group by所分组列

Order by多字段排序时,先满足第一条件,再按第二条件排序,且每个条件需分别指定排序

例:order by aaa desc, bbb desc

删除数值类重复行可先使用group by对有重复的列进行分组,再根据主键区分出删除行

例:delete from 表名where (需消重的列,主键列) not in(select * from(select 需消重的列,min(主键列) from 表名 group by 需消重的列)a )

位运算符是在二进制数上进行计算的运算符。位运算会先将操作数变成二进制数,进行位运算。然后再将计算结果从二进制数变回十进制数。

& ——按位与,| ——按位或,^ ——按位异或,! ——取反,<< ——左移, >>——右移

例:Where 列名 &1 = 1 ;结果为奇数,!=1 则为偶数

SELECT IFNULL(expr1,expr2)

如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。

Coalesce (coalesce (expression_1, expression_2, ...,expression_n)——依次参考各参数表达式,遇到非null值即停止并返回该值。

例:select coalesce(success_cnt, 1) from tableA

释:当success_cnt null值的时候,将返回1,否则将返回success_cnt的真实值。

With rollup sql语句中定义在group by之后,使用次函数是对聚合函数进行求和,注意:是对group by后的第一个字段,进行分组精算。

IF() ——判断函数     例:IF( expr , v1 , v2 ) 

释:表达式 expr 得到不同的结果,当 expr 为真是返回 v1 的值,否则返回 v2.

If exists —— 判断是否存在

Cast (字段名 as 转换的类型 )  ——转换数据类型

And = 而且  OR = 或者  优先级:And > OR

Case函数

SELECT          
    case                   -------------
如果
    when sex='1' then '
男' -------------sex='1',则返回值'男'
    when sex='2' then '
女' -------------sex='2',则返回值'女'  
    else 0                 -------------
其他的返回'其他’
    end                    -------------
结束
from   sys_user            --------
整体理解: 在sys_user表中如果sex='1',则返回值'男'如果sex='2',则返回值'女' 否则返回'其他’

Case函数具有两种格式。简单Case函数和Case搜索函数。

简单Case函数(等值判断)
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END

例:
CASE sex WHEN ‘1’ THEN WHEN ‘2’ THEN ELSE其他 END
搜索Case函数(区间判断)
CASE WHEN [expr] THEN [result1]…ELSE [default] END

例:
CASE WHEN sex = ‘1’ THEN WHEN sex = ‘2’ THEN ELSE其他 END

搜索函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END
:搜索函数可以写判断,并且搜索函数只会返回第一个符合条件的值,其他case被忽略

聚合函数 sum 配合 case when 的简单函数实现多表 left join 的行转列

例:sum(case c_id when '01' then score else 0 end) as '语文'

子查询嵌套查询,例:

select a.c_id,a.s_id,a.score

from score a

where (select count(1) from score b where a.c_id=b.c_id and a.score< b.score)< 3 order by a.c_id,a.score desc;

释:统计学生个数,即关联两个分数表a、b,外层查询每查询一次,再到内层循环中查询表b当课程名相同时,统计 a.score<b.score 即表b中成绩大于a的人数有几人

窗口函数:

1.窗口函数的语法:

窗口函数 over (partition by 用于分列的列名 order by 用于排序的列名);

2.功能:既能分组又可以排序,且不改变行数

3.分类:

专用窗口函数---rank(),dense_rank(),row_number()(括号中没有参数,注意区分三者区别)

聚合函数---max(),min(),sum(),avg(),count() (括号中有参数)

4.注意事项

原则上一般写在select子句中

例:

select *, rank() over (partition by 班级 order by 成绩 desc) as ranking from 班级表

释:先将列‘班级’进行分组,再按列‘成绩’进行排序,得到班级的成绩排序表,与分组

Group by 的区别是分组不会讲数据折叠。因此:分组函数适用于统计(相当于新的表), 窗口函数适用于排名(相当于加字段)。

rank(), dense_rank(), row_number() 这三个函数都是排序的序号,只不过,对于排序过程中,相同的数据怎么处理,规则不一样。

什么意思呢?举个例子,还是成绩的排名,如果学员A的成绩是 80分,B的也是80分,C79分,那怎么排名呢?

规则1:并列排名,假设A是第5名,B也是第5名,C是第6名,对于函数 dense_rank()

规则2:并列排名,顺延,假设A是第5名,B也是第5名,C是第7, 对应函数 rank()

规则3:纯排序,假设A是第5名,B是第6名,C是第7, 对应 row_number()

例:求某成绩大于平均成绩的ID

select id,job,score

from (select *,avg(score) over(partition by job) as aaa from grade ) as bbb

where score > aaa

释:使用窗口函数分组并计算出平均成绩,再使用where筛选大于平均成绩的ID

使用where XXX <> aaa 则表示结果排除这个值

Regexp ‘字符串’    ——正则表达式(匹配包含的字符串)

例:Regexp  [123] Ton  等于  Regexp  [1|2|3]Ton ——匹配1或2或3,| 为正则表达式的OR操作符。它表示匹配其中之一

Regexp ‘\\.’  为了匹配特殊字符,必须用\\为前导。\\(匹配),\\-表示查找-,\\.表示查找.

字符类

类           

[:alnum:]   任意字母和数字(同[a-zA-Z0-9]

[:alpha:]   任意字符(同[a-zA-Z]

[:blank:]   空格和制表(同[\\t]

[:cntrl:]    ASCII控制字符(ASCII 0到31和127

[:digit:]    任意数字(同[0-9]

[:graph:]   与[:print:]相同,但不包括空格

[:lower:]   任意小写字母(同[a-z]

[:print:]   任意可打印字符

[:punct:]   既不在[:alnum:]又不在[:cntrl:]中的任意字符

[:space:]   包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v]

[:upper:]   任意大写字母(同[A-Z]

[:xdigit:]   任意十六进制数字(同[a-fA-F0-9]

重复元字符:

符    

*           0个或多个匹配

+           1个或多个匹配(等于{1,}

?           0个或1个匹配(等于{0,1}

{n}         指定数目的匹配

{n,}         不少于指定数目的匹配

{n,m}       匹配数目的范围(m不超过255

定位元字符

符    

^          文本的开始

$          文本的结尾

[[:<:]]      词的开始

[[:>:]]      词的结尾

^ 的双重用途 ^ 有两种用法。在集合中(用[和]定义),用它

来否定该集合,否则,用来指串的开始处。

Regexp ‘\\([0-9] sticks?\\)’

\\(匹配),[0-9]匹配任意数字(这个例子中为1和5),sticks?匹配stick

和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出

现),\\)匹配)

Union 将多条查询结果作为一条返回并去重,union all 保留重复——Union连接(这些查询的字段个数必须相同)

Replace ( ) 用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。

语法:

REPLACE ( 'string_expression1' , 'string_expression2' , 'string_expression3' )

REPLACE ( '要修改的总体数据' , '被替换的内容' , '要替换的内容' )

Insert into 表名(列名) values (插入的行)   ——插入行

  • INSERT INTO 表示插入数据,数据库会检查主键(PrimaryKey),如果出现重复会报错;
  • INSERT IGNORE INTO 表示,如果数据库中已经存在相同的记录,则忽略当前新数据;
  • 用inset into actor select插入子查询的结果集(不需要用values(),()这种形式。这种形式是手工插入单条数据或多条数据时用圆括号分割。插入结果集是不需要)

update 表名 set 列名 =‘新的的行’where 列名 = ‘被改的行’——修改行

同时更新多个列时使用逗号间隔,勿用and

Alter table 表名 rename to 新表名  ——更新表名

Alter table 表名 add 列名 属性 afler 列名(在这个列后面)——更改表结构,新增列

Alter table 表名 drop column 列名 ——更改表结构,删除列

Alter table 表名 change 列名 新列名 数据类型  ——修改列名

Alter table 表名 modify 列名 新的列属性  ——修改列属性

alter table 表名 drop foreign key 外键名  ——删除外键约束

Delete  from 表名 where 列名 = ‘需要删除的行’——删除行

Truncate  table ——删除所有行

DROP  table——删除表

Create database 数据库名 ——新建数据库

Create table 表名 (列名 指定null/default 默认值)——新建表

例:CREATE TABLE actor(

    actor_id smallint(5) not NULL Primary key comment '主键id',

    first_name varchar(45) not NULL comment '名字',

    last_name varchar(45) not NULL comment '姓氏',

    last_update DATE not NULL comment '日期'

    );

Primary key (列名) ——定义主键(主键不允许null)例子如上

列名 int not null Auto_increment  —— 指定自增量列

DEFAULT 列值 ——定义默认值    ENGINE=InnoDB / MyISAM   ——指定数据库引擎

索引分类:

  1. 主键(约束)索引
  2. 唯一(约束)索引
  3. 普通索引
  4. 组合(联合)索引
  5. Hash索引
  6. 全文索引

索引语法:

已有表的字段上直接创建

  1. 创建普通索引:create index 索引名 on 表名(字段);
  2. 创建唯一索引:create unique index 索引名 on 表名(字段);
  3. 创建普通组合索引:create index 索引名 on 表名(字段1,字段2,,。。);
  4. 创建唯一组合索引:create index 索引名 on 表名(字段2,字段2,。。);

已有表的字段上修改表时指定

  1. alter table 表名 add primary key (字段);——默认索引名
  2. alter table 表名 add unique (字段);
  3. alter table 表名 add index (字段);

两种创建索引的区别:

1、CREATE INDEX必须提供索引名,对于ALTER TABLE,将会自动创建,如果你不提供;

2、CREATE INDEX一个语句一次只能建立一个索引,ALTER TABLE可以在一个语句建立多个,

如: ALTER TABLE HeadOfState ADD PRIMARY KEY (ID), ADD INDEX (LastName,FirstName);

3、只有ALTER TABLE 才能创建主键,

删除索引

  1. DROP INDEX index_name ON table_name;  ——直接删除索引
  2. ALTER TABLE table_name DROP INDEX index_name; ——修改表结构删除索引

约束类型(六种)

 

 

1.主键约束(PRIMARY KEY

确定表中的标识列(主键字段不能为空,必须唯一)

标识:确定一个对象的唯一表现

ALTER TABLE 数据表名

ADD CONSTRAINT PK_ID        --(命名一个主键名称)

PRIMARY KEY(ID)

2.外键约束(FOREIGN KEY

确定表与表之间的联系方式,一般情况下通过主表的标识列进行确定

主表:给哪张表添加约束哪张表就是主表,辅助表为从表

ALTER TABLE 从表名称

ADD CONSTRAINT FK_从表_主表        --(命名一个外键名称)

--添加外键约束

FOREIGN KEY(外键列名) REFERENCES 主表名 (主表列名)

3.唯一约束(UNIQUE

确定这个字段中的数据必须是唯一存在的

ALTER TABLE 数据表名称

ADD CONSTRAINT QU_Name        --(命名一个唯一约束的名称)

UNIQUE([Name])

4.非空约束(NOT NULL

确定这个字段中的数据必须不能为空

ALTER TABLE 数据表名称

ALTER COLUMN ID INT NOT NULL

5.检查约束(CHECK

设置这个字段中的数据特性

ALTER TABLE 数据表名称

ADD CONSTRAINT CK_SEX                --(命名一个检查约束的名称)

CHECK(SEX IN('男','女'));

6.默认约束(DEFAULT

若在表中定义了默认值约束,用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果我们不设置默认值,系统默认为NULL

1. 如果表字段已经建好

--DF_XXX(命名一个默认约束的名称)

ALTER TABLE 表名

ADD CONSTRAINT DF_XXX  DEFAULT 1 FOR 字段名

自增长列:AUTO_INCREMENT

删除自增长列: alter table 表名 modify column 字段名 字段类型 约束

 

事务:(一般用作增删改)

事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

隐式事务:事务没有明显的开启和结束标记。 如:insert、update、delete语句

显式事务:事务具有明显的开启和结束标记。 前提:必须先设置自动提交功能为禁用。

查看自动提交功能状态:show Variables like ‘autocommit’;

禁用自动提交功能: set autocommit = 0 ; 只针对当前事务

步骤1:开启事务

set autocommit = 0;

start transaction; 可选

步骤2:编写事务中的sql语句(select、insert、update、delete

语句1

语句2

。。。

步骤3:结束事务

Commit; 提交事务

Rollback; 回滚事务

隔离级别:

READ UNCOMMITTED:出现脏读,幻读,不氪重复读

READ COMMITTED:出现幻读,不可重复度

REPEATABLE READ:出现不可重复读(mysql中默认)

SERIALIZABLE:避免所有,但效率低下,必须执行完成第一个事务,其他事务等待

查看当前隔离级别:select @@tx_isolation;

设置当前隔离级别:set transaction isolation level 隔离级别;

设置数据库全局隔离级别:set global transaction isolation level 隔离级别;

Savepoint ——节点名;设置保存点,回滚点

 

Create view 表名 as select XXX ——创建视图,视图作为数据源时只能使用视图中检索的字段作为where条件 。视图一般作为查询使用

视图修改:

1、Create or replace view 视图名 as 新的查询语句; ——使用新的查询语句替代原有的

2、Alter view 视图名 as 新的查询语句;——方式二

更新视图:使用 update 视图名,分组函数、distinct、group by、having、union、子查询、jion的视图不能更新(视图一般不更新)

删除视图:

drop view 视图名,视图名。。。  ——可同时删除多个视图

查看视图:

 1、Desc 视图名;       2、show create view 视图名;

Select Substr(‘字符串’,截取起始字符,截取结束字符)——字符串截取

Select UPPER (‘字符串’)或 (列名)——转换成大写

select '字符串' || '字符串'  sql server中使用 +  ——字符串连接符

select *from 表名 别名,表名,别名  ——自连接(可用于同一张表中两列做对比

在满足a.c_id=b.c_id下筛选a.s_id<>b.s_id and a.score=b.scoreselect * from score a,score b where a.c_id=b.c_id and a.s_id<>b.s_id and a.score=b.score;

Concat ( )   ——拼接串,即把多个串连接起来形成一个较长的串,需要一个或多个指定的串,各个串之间用逗号分隔。例:给结果添加百分号

RTrim ( )(去掉串右边的空格),还支持LTrim ( )(去掉串左边的空格)以及Trim ( )(去掉串左右两边的空格)。

SQL聚集函数

      

AVG( )     返回某列的平均值

COUNT( )   返回某列的行数

MAX( )    返回某列的最大值

MIN( )     返回某列的最小值

SUM( )     返回某列值之和

FULLTEXT(指定列)   ——新建表时可在结尾指定索引列,可索引单个或多个列

Match(指定被搜索的列 ) 和 Against(指定要使用的表达式 )  ——全文本搜索,仅在MyISAM数据库引擎中支持全文本搜索

变量:

一、系统变量

1、查看所有系统变量: show global | [session]  variables;——global全局,session会话

2、查看满足条件的部分系统变量:show global | [session]  variables like ‘%char%’;

3、查看指定的某个系统变量的值:show @@global | [session] 变量名

   或:Select @@变量名

4、为某个系统变量赋值:set global | [session] 系统变量名 = 值

注:全局变量则需要加global,会话级别为session,不写则默认session

二、自定义变量

1、用户变量

声明并初始化以及赋值:

set @用户变量名=赋值 或

set @用户变量名:=赋值 或

select @用户变量名:=赋值 或

select 字段 into 用户变量名 from 表名

查看变量: select  @用户变量名

应用在会话的任何地方

2、局部变量

作用域:仅在定义它的begin and中有效

声明:declare 变量名 数据类型;如需赋值初始化:declare 变量名 数据类型 default 赋值

赋值:

set 局部变量名=赋值 或

set 局部变量名:=赋值 或s

elect @局部变量名:=赋值  或

select 字段 into 局部变量名 from 表名

使用:select 局部变量名

应用在 begin end中的第一句话

CREATE PROCEDURE 存储过程命名 () ——创建存储过程

Begin

        ——BEGINEND语句用来限定存储过程体(一组合法的sql语句)

Eng   

DELIMITER   ——定义符,可临时更改默认 ;分隔符,除 \ 符号外

IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)

OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

Call 存储过程名 () (实参列表)——执行存储过程

Drop PROCEDURE 存储过程名  ——删除存储过程

Show create procedure 存储过程名 ——查看存储过程

存储过程无法修改,一般用作增删改

in的存储过程:

 

Out的存储过程:

 

带多个out的存储过程:

 

inout的存储过程:

 

函数:

与存储过程的区别:

存储过程:可以有0个或多个返回,适合做批量增删改

函数:只有1个返回,适合处理数据后返回一个结果

  • 创建: create function 函数名(参数列表) returns 返回类型 

        Begin

                    ——函数体

        End

  • 调用语法: select 函数名(参数列表)
  • 案列:

1、无参返回

 

2、有参返回

 

  • 查看函数: show create function 函数名;
  • 删除函数: drop function 函数名;  (函数一般不做修改

流程控制结构

  1. 顺序结构:程序从上往下一次执行
  2. 分支结构:程序从两条或多条路径中选择一条执行
  3. 循环结构:程序在满足一定条件的基础上,重复执行一段代码
  • 分支结构:
  1. IF函数

功能:实现简单的双分支

  1. case结构

功能:一般用于实现等值判断、区间判断(类似多重IF 

例:在存储过程中使用区间判断:

 

  1. IF结构

功能:实现多重分支

语法:if 条件1 then 语句1

      Elseif 条件2 then 语句2

      。。。

      [else 语句n]

      End if

应用场合:应用在begin end

例:在存储过程中使用 IF 结构

 

  • 循环结构: 无返回,在bigin end中使用

分类: while loop repeat

  1. While          ——先判断后执行,不一定执行

语法:[标签:] loop

            循环体

End loop [标签]

  1. Loop          ——没有条件的死循环

[标签:] loop

          循环体

End loop [标签]      ——可用来模拟简单的死循环

3repeat         ——先执行后判断,无条件执行一次

语法:[标签:]  repeat

               循环体

Until  结束循环的条件

End repeat [标签]

循环控制:

iterate 继续   ——结束本次循环,继续下一次

leave 跳出  ——结束当前所在的循环

  例:未添加循环控制 

 

例:添加 leave 语句

 

例:添加 iterate 语句

例:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值