MySQL学习2022.7015-7.23

第九章 正则表达式

正则表达式

regexp后跟的东西作为正则表达式处理

9.2.1 基本字符匹配

mysql> select prod_name from products where prod_name regexp '1000' order by prod_name ;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.05 sec)
mysql> select prod_name from products 
    -> where prod_name regexp '.000'
    -> order by prod_name ;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.06 sec)

正则表达式.000,. 是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符

9.2.2 进行or匹配

mysql> select prod_name from products
    -> where prod_name regexp '1000|2000'
    -> order by prod_name ;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.03 sec)

语句使用了正则表达式 1000|2000,|为正则表达式思维OR操作符,它表示匹配其中之一

9.2.3 匹配几个字符之一

mysql> select prod_name from products where prod_name regexp '[123] Ton' order by prod_name ;
+-------------+
| prod_name   |
+-------------+
| 1 ton anvil |
| 2 ton anvil |
+-------------+
2 rows in set (0.08 sec)

这里使用了正则表达式[123] Ton,[123] 定义了一组字符它的意思是匹配1或2或3,因此得到如上结果

9.2.4 匹配范围

集合可来定义要匹配的一个或者多个字符

下面的集合将匹配数字0到9

[0123456789]

简化集合

[0-9]

范围不限于完整的集合,[1-3]和[6-9]也是合法的

不一定只是数值,[a-z]匹配任意字母字符

mysql> select prod_name from products
    -> where prod_name regexp '[1-5] Ton'
    -> order by prod_name ;
+--------------+
| prod_name    |
+--------------+
| .5 ton anvil |
| 1 ton anvil  |
| 2 ton anvil  |
+--------------+
3 rows in set (0.06 sec)

这里使用正则表达式[1-5] Ton,[1-5]定义了一个范围,这个表达式的意思是匹配到1到5

9.2.5 匹配特殊字符

为了匹配特殊字符,***必须用\\为前导,\\-表示查找-,\\.表示查找. 。

mysql> select vend_name from vendors 
    -> where vend_name regexp '\\.'
    -> order by vend_name ;
+--------------+
| vend_name    |
+--------------+
| Furball Inc. |
+--------------+
1 row in set (0.06 sec)

这就是所谓的转义

正则表达式内具有特殊意义的所有字符都必须以这种方式转义

**也用来引用元字符(具有特殊含义的字符)

元字符说明
\\f换页
\\n换行
\\r回车
\\t制表
\\v纵向制表

9.2.6 匹配字符类

p58

9.2.7 匹配多个实例

mysql> select prod_name from products
    -> where prod_name regexp '\\([0-9] sticks?\\)'
    -> order by prod_name ;
+----------------+
| prod_name      |
+----------------+
| TNT (1 stick)  |
| TNT (5 sticks) |
+----------------+
2 rows in set (0.06 sec)

正则表达式\\([0-9] sticks?\\)

\\(匹配(,[0-9]匹配任意数字,sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何数字的0次或者1 次出现),\\)匹配)。没有?,匹配stick和sticks会非常困难

匹配连在一起的四位数字

mysql> select prod_name from products where prod_name regexp '[[:digit:]]{4}' 
    -> order by prod_name ;
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.12 sec)

[:digit:]匹配任意数字,因而它为数字的一个集合,{4}确切要求前面的字符(任意数字)出现4次

编写某个特殊的表达式几乎总是不止一种方法

9.2.8 定位符

匹配特定位置的文本

mysql> select prod_name from products where prod_name regexp '^[0-9\\.]' order by prod_name ;
+--------------+
| prod_name    |
+--------------+
| .5 ton anvil |
| 1 ton anvil  |
| 2 ton anvil  |
+--------------+
3 rows in set (0.07 sec)

^匹配符的开始 ,1只在.或者任意数字为串中第一个字符的时候才匹配它们。

^的双重使用:

​ 1、否定集合

​ 2、指串的开始处

第十章 创建计算字段

10.2 拼接字段

MySQL使用Concat()函数实现

拼接:将值联结到一起构成单个值

mysql> select Concat(vend_name , ' (' , vend_country , ')' )
    -> from vendors order by vend_name ;
+-----------------------------------------------+
| Concat(vend_name , ' (' , vend_country , ')' ) |
+-----------------------------------------------+
| ACME (USA)                                     |
| Anvils R Us (USA)                              |
| Furball Inc. (USA)                             |
| Jet Set (England)                              |
| Jouets Et Ours (France)                        |
| LT Supplies (USA)                              |
+-----------------------------------------------+
6 rows in set (0.07 sec)

利用MySQL的RTrim()函数实现删除右侧多余空格来整理数据

mysql> select Concat(RTrim(vend_name ), ' (' , RTrim(vend_country ), ')' )
    -> from vendors order by vend_name ;
+--------------------------------------------------------------+
| Concat(RTrim(vend_name ), ' (' , RTrim(vend_country ), ')' ) |
+--------------------------------------------------------------+
| ACME (USA)                                                   |
| Anvils R Us (USA)                                            |
| Furball Inc. (USA)                                           |
| Jet Set (England)                                            |
| Jouets Et Ours (France)                                      |
| LT Supplies (USA)                                            |
+--------------------------------------------------------------+
6 rows in set (0.06 sec)

感觉没啥变化,不知道用在哪

trim函数

RTrim()去掉串右边的空格

LTrim()去掉串左边的空格

Trim()去掉左右两边的空格

使用别名

别名是一个字段或者值的替换名

别名用AS关键字赋予

mysql> select Concat(RTrim(vend_name),' (', RTrim(vend_country) , ')') AS vend_title 
    -> from vendors
    -> order by vend_name;
+-------------------------+
| vend_title              |
+-------------------------+
| ACME (USA)              |
| Anvils R Us (USA)       |
| Furball Inc. (USA)      |
| Jet Set (England)       |
| Jouets Et Ours (France) |
| LT Supplies (USA)       |
+-------------------------+
6 rows in set (0.06 sec)

第十一章 使用数据处理函数

使用函数时,做好注释

文本处理函数

mysql> select vend_name , Upper(vend_name) AS vend_name_upcase
    -> from vendors
    -> order by vend_name ;
+----------------+------------------+
| vend_name      | vend_name_upcase |
+----------------+------------------+
| ACME           | ACME             |
| Anvils R Us    | ANVILS R US      |
| Furball Inc.   | FURBALL INC.     |
| Jet Set        | JET SET          |
| Jouets Et Ours | JOUETS ET OURS   |
| LT Supplies    | LT SUPPLIES      |
+----------------+------------------+
6 rows in set (0.06 sec)

Upper()大写

mysql> mysql> select vend_name , Upper(vend_name) AS vend_name_upcase
    -> from vendors
    -> order by vend_name ;
+----------------+------------------+
| vend_name      | vend_name_upcase |
+----------------+------------------+
| ACME           | ACME             |
| Anvils R Us    | ANVILS R US      |
| Furball Inc.   | FURBALL INC.     |
| Jet Set        | JET SET          |
| Jouets Et Ours | JOUETS ET OURS   |
| LT Supplies    | LT SUPPLIES      |
+----------------+------------------+
6 rows in set (0.06 sec);

文本处理函数

函数说明
Left()
Length()
Locate()
Lower()
LTrim()
Right()
RTrim()
Soundex()
SubString()
Upper()

日期和时间处理函数

between…and…定义一个要匹配的方位

mysql> select vend_id , count(*) as num_prods
    -> from products
    -> where prod_price >=10
    -> group by vend_id 
    -> having count(*) >= 2 ;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1003 |         4 |
|    1005 |         2 |
+---------+-----------+
2 rows in set (0.09 sec)

mysql> select vend_id , count(*) as num_prods
    -> from products
    -> group by vend_id 
    -> having count(*) >= 2 ;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         3 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
+---------+-----------+
4 rows in set (0.06 sec)

mysql> select cust_id , count(*) as orders 
    -> from orders
    -> group by cust_id
    -> having count(*) >= 2 ;
+---------+--------+
| cust_id | orders |
+---------+--------+
|   10001 |      2 |
+---------+--------+
1 row in set (0.07 sec)

mysql> select vend_id , count(*) as num_prods
    -> from products
    -> where prod_price >= 10 
    -> group by vend_id 
    -> having count(*) >= 2 ;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1003 |         4 |
|    1005 |         2 |
+---------+-----------+
2 rows in set (0.07 sec)

mysql> select vend_id ,count(*) as num_prods
    -> from products
    -> group by vend_id 
    -> having count(*) >=2 ;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         3 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
+---------+-----------+
4 rows in set (0.05 sec)

mysql> select order_num , sum(quantity*item_price) as ordertotal
    -> from orderitems
    -> group by order_num
    -> having sum(quantity*item_price) >= 50;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
|     20005 | 149.87     |
|     20006 | 55.00      |
|     20007 | 1000.00    |
|     20008 | 125.00     |
+-----------+------------+
4 rows in set (0.05 sec)

mysql> select order_num , sum(quantity*item_price) as ordertotal 
    -> from orderitems
    -> group by order_num
    -> having sum(quantity * item_price) >= 50 
    -> order by ordertotal ;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
|     20006 | 55.00      |
|     20008 | 125.00     |
|     20005 | 149.87     |
|     20007 | 1000.00    |
+-----------+------------+
4 rows in set (0.05 sec)

mysql> 

第十四章 子查询

利用子查询进行过滤

子查询 嵌套在其他查询中的查询

使用子查询可以将多个查询语句组合成一条语句

在查询的过程中注意子查询

mysql> select cust_id from orders 
    -> where order_num in (select order_num from orderitems
    -> where prod_id = 'TNT2' );
+---------+
| cust_id |
+---------+
|   10001 |
|   10004 |
+---------+
2 rows in set (0.09 sec)

子查询从内向外处理

注意:

  • 格式化子查询

​ 适当对语句进行缩进

mysql> select cust_name , cust_contact 
    -> from customers 
    -> where cust_id in (select cust_id 
    ->                   from orders 
    ->                   where order_num in (select order_num
    ->                                       from orderitems
    ->                                       where prod_id = 'TNT2'));
+----------------+--------------+
| cust_name      | cust_contact |
+----------------+--------------+
| Coyote Inc.    | Y Lee        |
| Yosemite Place | Y Sam        |
+----------------+--------------+
2 rows in set (0.08 sec)
  • 列必须匹配
  • 子查询也可以用于测试等于(=)、不等于(<>)等

作为计算字段使用子查询

创建计算字段

假如需要显示customers表中每个客户的订单总数,订单与相应的客户ID存储在orders表中。

步骤:

  1. 从customers表中检索客户列表
  2. 对于检索出的每个客户,统计其在orders表中的订单数目
mysql> select cust_name ,
    ->        cust_state,        
    ->        (select count(*) 
    ->         from orders
    ->         where orders.cust_id = customers.cust_id) as orders
    -> from customers
    -> order by cust_name ;
+----------------+------------+--------+
| cust_name      | cust_state | orders |
+----------------+------------+--------+
| Coyote Inc.    | MI         |      4 |
| E Fudd         | IL         |      1 |
| Mouse House    | OH         |      0 |
| Wascals        | IN         |      1 |
| Yosemite Place | AZ         |      1 |
+----------------+------------+--------+
5 rows in set (0.05 sec)

orders 是一个计算字段,是由圆括号的子查询建立的

子 查询的where子句使用了完全限定列名;

第十五章 联结表

1.关系表

举例子解说

外键 :外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系

可伸缩性:能够适应不断增加的工作量而不失败,设计良好是数据库或应用 程序称之为可伸缩性好

**联结是一种机制,用来再一条select语句中关联表

创建关联

权限

触发器

触发器的创建

create trigger 语句

例子

mysql> create trigger newproduct after insert on products
    -> for each row select 'Product added' ;
1415 - Not allowed to return a result set from a trigger

出现错误,原因:MYSQL5以后,不允许触发器返回任何结果,因此使用into @变量名,将结果赋值到变量中,用select调用即可

修改为

mysql> create trigger newproduct after insert on products
    -> for each row select 'Product added' into @asd ;
Query OK, 0 rows affected (0.11 sec)

mysql> select @asd ;
+------+
| @asd |
+------+
| NULL |
+------+
1 row in set (0.03 sec)

注意:只有表才支持触发器,视图不支持(临时表也不支持)。

触发器按表每个事件每个表定义,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器(每条insert,update和delete的之前和之后,单一触发器不能与多个事件或多个表关联。

故,若需要一个对insert和update操作执行的触发器,则应该定义两个触发器。

删除触发器

drop trigger newproduct ;

触发器不能更新或覆盖,为了修改一个触发器必须删除再重新创建

使用触发器

  • BEFORE INSERT : 在插入数据前,检测插入数据是否符合业务逻辑,如不符合返回错误信息。

  • AFTER INSERT : 在表 A 创建新账户后,将创建成功信息自动写入表 B 中。

  • BEFORE UPDATE :在更新数据前,检测更新数据是否符合业务逻辑,如不符合返回错误信息。

  • AFTER INSERT :在更新数据后,将操作行为记录在 log 中

  • BEFORE DELETE :在删除数据前,检查是否有关联数据,如有,停止删除操作。

  • AFTER DELETE :删除表 A 信息后,自动删除表 B 中与表 A 相关联的信息。

*空间表(tablespaces)

mysql中,会涉及到各种表空间的概念,虽然,很多方面这些概念和Oracle有相似性,但也有很多不同的地方,初学者很容易被这些概念弄的晕头转向,从而,混淆这些概念的区别和理解,下面,就简要介绍和说明一下这些表空间的概念。

1.系统表空间(System Tablespace)

innodb系统表空间包含innodb数据字典(innodb相关对象的元数据),同时,双写缓冲(doublewrite buffer)、改变缓冲(change buffer)和undo日志(undo logs)等也存储于系统表空间中。此外,系统表空间

也包含用户在改表空间创建的表和索引等数据。由于系统表空间可以存储多张表,因此,其为一个共享表空间。系统表空间由一个或多个数据文件组成,默认情况下,其包含一个叫ibdata1的系统数据文件,位于mysql

数据目录下。系统表空间数据文件的大小和数目由innodb_data_file_path启动选项控制。

2.表文件表空间(File-Per-Table Tablespaces)

表文件表空间是一个单表表空间,该表创建于自己的数据文件中,而非创建于系统表空间中。当innodb_file_per_table选项开启时,表将被创建于表文件表空间中。否则,innodb将被创建于系统表空间中。

每个表文件表空间由一个.ibd数据文件代表,该文件默认被创建于数据库目录中。表文件表空间支持动态(DYNAMIC)和压缩(commpressed)行格式。

3.通用表空间(General Tablespaces)

通用表空间为通过create tablespace语法创建的共享表空间。通用表空间可以创建于mysql数据目录外的其他表空间,其可以容纳多张表,且其支持所有的行格式。

通过create table tab_name … tablespace [=] tablespace_name或alter table tab_name tablespace [=] tablespace_name语法将其添加与通用表空间内。

4.undo表空间(undo tablespace)

undo表空间由一个或多个包含undo日志的文件组成。innodb_undo_tablespace配置选项控制undo表空间的数目。undo表空间创建于innodb_undo_directory配置选项确定的位置,该选项典型被用于将undo日志放于不同的

存储设备上。如果该选项没有确定任何路径,undo表空间则备创建于mysql通过datadir确定的数据目录下。

5.临时表空间(Temporary Tablespace)

用户创建的临时表和磁盘内部临时表创建于共享临时表空间中。innodb_temp_data_file选项确定临时表空间数据文件的相对路径、名字、大小和属性等。如果该选项未确定任何值,默认情况下,系统将在

innodb_data_home_dir确定的目录下创建一个叫ibtmp1的自动扩展的数据文件,该文件将稍大于12m。

mysql服务器正常关闭或异常终止初始化时,临时表空间将被移除,并且,mysql服务器每次启动时会被重新创建。当临时表空间被创建时,其被赋予一个动态产生的空间ID(space ID)。如果不能创建临时表空间,

mysql服务器启动将被拒绝。mysql服务器异常终止的情况下,临时表空间将不被移除。这种情况下,DBA能手工移除临时表空间或重启mysql服务器,重启服务器过程中,将自动移除和重新创建临时表空间。

临时表空间并不能存储于裸设备。

这里既然说到了innodb_data_home_dir,那么,就说说这个选项,该选项确定innodb系统表空间数据文件目录路径的共同部分。innodb_file_per_table开启时,该选项设置并不影响表文件表空间的位置。该选项默认值

为mysql数据目录。如果你将该选项设置为空串,那么,你可以为innodb_data_file_path设置一个绝对路径值。此外,当为innodb_data_home_dir指定一个值时,需要在尾部添加一个斜杠。

来源:oschina
————————————————
版权声明:本文为CSDN博主「九零先生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36356958/article/details/113594366

MySQL添加注释

1.创建新表时,在表的字段约束后面添加注释。

mysql> create table users(id int(11) primary key comment '用户id');
Query OK, 0 rows affected (0.33 sec)
mysql> desc users
    -> ;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.04 sec)

mysql> select * from users ;
Empty set

mysql> insert user
    -> values(1);
1146 - Table 'ben.user' doesn't exist
mysql> insert users
    -> values(1);
Query OK, 1 row affected (0.11 sec)
mysql> select * from users ;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.03 sec)

注释没有显示出来

2.如果是已经建好的表,可以用修改字段的命令,加上comment属性。

mysql> alter table users modify id int(11) not null comment '用户名';
Query OK, 0 rows affected (0.14 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> select * from users ;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.05 sec)

mysql> desc users ;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.07 sec)

2.为表添加注释:
1)创建新表时,在括号外面写表注释。
例如:

mysql> create table user (id int(11) primary key comment '用户名') comment = '用户信息表';
Query OK, 0 rows affected (0.23 sec)
mysql> show create table user ;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                              |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int(11) NOT NULL COMMENT '用户名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户信息表' |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.05 sec)

2)已经建好的表,可以修改表的时候加上注释。
例如:
alter table users comment ‘用户信息表’;
这里的users为表名

mysql> alter table user comment '用户信息表';
Query OK, 0 rows affected (0.15 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc user ;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.06 sec)

mysql> show create table user ;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                              |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int(11) NOT NULL COMMENT '用户名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户信息表' |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)

3.查看表注释的方法
show create table users;
这里users为表名。
** 4.查看字段注释的方法**
show full columns from users;
这里users为表名。
————————————————
版权声明:本文为CSDN博主「wenwencute」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43752966/article/details/84312178

comment on table TEAM is ’ ';

oracle语句


  1. 0-9\. ↩︎

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值