第九章 正则表达式
正则表达式
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表中。
步骤:
- 从customers表中检索客户列表
- 对于检索出的每个客户,统计其在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语句
0-9\. ↩︎