一、数据库
1.数据库概念
数据库是用户存放数据、访问数据、操作数据的存储仓库,用户的各种数据被有组织的存放在数据库中。可以随时被有权限的用户查询、统计、添加、删除、和修改。
是长期存储在计算机内的,有组织、可共享的数据集合。数据库系统是由普通的文件系统发展而来的。数据库系统具有较高的数据独立性,即不依赖于特定的数据库应用程序;数据库系统的数据冗余小,可以节省数据的存储空间;另外数据库系统还很容易实现多个用户的数据共享。
2.数据库管理系统(DBMS)
数据库管理系统(DataBase Managerment System,简称DBMS)是管理数据库的一个软件,它充当所有数据的知识库,并对它的存储、安全、一致性、并发操作、恢复和访问负责。是对数据库的一种完整和统一的管理和控制机制。数据库管理系统不仅让我们能够实现对数据的快速检索和维护,还为数据的安全性、完整性、并发控制和数据恢复提供了保证。数据库管理系统的核心是一个用来存储大量数据的数据库。
DBMS是所有数据的知识库,并对数据的存储、安全、一致性、并发操作、恢复和访问负责。
DBMS有一个数据字典(有时被称为系统表),用于贮存它拥有的每个事物的相关信息,例如名字、结构、位置和类型,这种关于数据的数据也被称为元数据(metadata)
3.DBMS支持的数据模型
层次模型
若用图来表示,层次模型是一棵倒立的树。在数据库中,满足以下条件的数据模型称为层次模型:
a.有且仅有一个节点无父节点,这个节点称为根节点;
b.其他节点有且仅有一个父节点。桌面型的关系模型数据库网状模型
在现实世界中,事物之间的联系更多的是非层次关系的,用层次模型表示非树型结构是很不直接的,网状模型则可以克服这一弊病。网状模型是一个网络。在数据库中,满足以下两个条件的数据模型称为网状模型。
a.允许一个以上的节点无父节点;
b.一个节点可以有多于一个的父节点。
从以上定义看出,网状模型构成了比层次结构复杂的网状结构,适宜表示多对多的联系。关系模型
以二维表的形式表示实体和实体之间联系的数据模型称为关系数据模型。从模型的三要素角度看,关系模型的内容为:
a.数据结构:一张二维表格。
b.数据操作:数据表的定义、检索、维护、计算等。
c.数据约束条件:表中列的取值范围即域值的限制条件。
4.关系型数据库
关系模型数据库采用表组织数据(表称为“关系”),一个数据库由许多个表组成,多个表数据之间存在着关系,在这些表上的数据操作依赖于关系,关系用来描述多个表之间的数据依存,包括了一对一、一对多、多对多的关系
概念模型
:基于客户的想法和观点所形成的认识和抽象。
实体(Entity):客观存在的、可以被描述的事物。例如员工、部门。
属性(Attribute):用于描述实体所具有的特征或特性。如使用编号、姓名、工资等来属性来描述员工的特征。
关系(Relationship):实体之间的联系。
数据模型
:也叫关系模型,是实体、属性、关系在数据库中的具体体现。
关系数据库:用于存储各种类型数据的”仓库”,是二维表的集合。
表:实体的映射
行和列:行代表一个具体的实体的数据。也叫一条记录。列是属性的映射,用于描述实体的。
主键和外键。
二、库表的操作
1、SQL简介
结构化查询语言(Structured Query Language)在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。
使用SQL语句,程序员和数据库管理员可以完成如下的任务:
- 改变数据库的结构
- 更改系统的安全设置
- 增加用户对数据库或表的许可权限
- 在数据库中检索需要的信息
- 对数据库的信息进行更新
2、SQL语句的书写规范
①在数据库系统中,SQL语句不区分大小写(建议用大写) 。但字符串常量区分大小写。
②SQL语句可单行或多行书写,以“;”结尾,关键词不能跨多行或简写。
③用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。
④SQL注释标准:
/**/。多行注释
“–” 单行注释
MySql注释: “#”
3.数据库操作
MySql自带数据库 | 详细 |
---|---|
Information_schema | 主要存储了系统中的一些数据库对象信息:如用户表信息、列信息、权限信息、字符集信息、分区信息等。(数据字典表) |
Mysql | 存储了系统的用户权限信息及帮助信息。 |
Test | 系统自动创建的测试数据库,任何用户都可以使用。 |
①SHOW DATABASES
语法:SHOW DATABASES [LIKE wild];
如果使用LIKE wild字符,wild字符串可以是一个使用SQL的”%”和”_”通配符的字符串。
功能:列出在MySql服务器主机上的数据库。
②CRATE DATABASE
语法:CREATE DATABASE [IF NOT EXISTS]数据库名;
功能:用给定的名字创建一个数据库
如果数据库已经存在,发生一个错误。
查看创建数据库:SHOW CREATE DATABASE <数据库名>;
③DROP DATABASE
语法:DROP DATABASE [IF EXISTS]数据库名;
功能:删除数据库中得所有表和数据库(要小心使用这个命令)
④使用USE选用数据库
语法:USE 数据库名;
功能:把指定数据库作为默认(当前)数据库使用,用于后续语句。
⑤查看当前连接的数据库:SELECT DATABASE();
⑥查看数据库版本:SELECT VERSION();
⑦查看当前用户:SELECT USER();
⑧查看所有用户:SELECT User,Host,Password FROM mysql.user;
⑨执行Linux命令:SYSTEM <命令>
4.数据库对象
数据库对象的命名规则:
- 必须以字母开头
- 可包括数字和三个特殊字符(# _ $)
- 不要使用MySQL的保留字
- 同一Schema下的对象不能同名
5.表的操作
①CREATE TABLE
语法:CREATE TABLE 表名(
列名 列类型,
列名 列类型
);
功能:在当前数据库中创建一张表
- 标准的建表(table)语法(列定义之间以英文逗号,隔开):
- 数据表的每行称为一条记录(record),每一列称为一个字段(field)。
- 主键列:唯一能够标识每条记录的列。
②:SHOW TABLE
语法:SHOW TABLES[FROM 数据库名][LIKE wild];
功能:显示当前数据库中已有的数据表的信息
③DESCRIBE
语法:{DESCRIBE|DESC}表名[列名];
功能:查看数据表中各列的信息
用“SHOW CREATE TABLE 表名\G”可以查看更全面的表定义信息
④DROP TABLE
语法:DROP TABLE [IF EXISTS] 表名;
功能:删除指定的表
⑤修改表的结构
mysql> CREATE TABLE tb_dept(
-> dept_id INT PRIMARY KEY,
-> NAME VARCHAR(18),
-> description VARCHAR(255)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc tb_dept;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| dept_id | int(11) | NO | PRI | NULL | |
| NAME | varchar(18) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>
更改表名:ALTER TABLE 表名 RENAME 新表名;
RENAME TABLE 表名 TO 新表名;
mysql> ALTER TABLE tb_dept
-> rename dept;
Query OK, 0 rows affected (0.01 sec)
mysql>
列改名:ALTER TABLE 表名 CHANGE 旧列名 新列名 列类型;
mysql> ALTER TABLE tb_dept
-> change name dept_name varchar(20);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC tb_dept;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| dept_id | int(11) | NO | PRI | NULL | |
| dept_name | varchar(20) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>
删除列:ALTER TABLE 表名 DROP 列名;
mysql> ALTER TABLE dept DROP dept_id;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC dept;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| dept_name | varchar(20) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql>
增加列:ALTER TABLE 表名 ADD 列名 列类型;
mysql> ALTER TABLE dept
-> ADD gendar char;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC dept;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| dept_name | varchar(20) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| gendar | char(1) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>
修改列类型:ALTER TABLE 表名 MODIFY 列名 列类型;
mysql> ALTER TABLE dept
-> MODIFY gendar varchar(20);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC dept;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| dept_name | varchar(20) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| gendar | varchar(20) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>
⑥复制表的结构
方法一:在create table语句的末尾添加like子句,可以将源表的表结构复制到新表中,语法格式如:create table 新表名 like 源表;
mysql> create table d1 like dept;
Query OK, 0 rows affected (0.01 sec)
mysql> desc d1;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| dept_name | varchar(20) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
| gendar | varchar(20) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> select * from d1;
Empty set (0.00 sec)
mysql>
方法二:在create table语句的末尾添加一个select语句,可以实现表结构的复制,甚至可以将源表的表记录拷贝到新表中。下面的语法格式将源表的表结构以及源表的所有记录拷贝到新表中。create table 新表名 select * from 源表
mysql> select * from dept;
+-----------+-------------+--------+
| dept_name | description | gendar |
+-----------+-------------+--------+
| zs | happy | Men |
+-----------+-------------+--------+
1 row in set (0.00 sec)
mysql> create table d1 select * from dept;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from d1;
+-----------+-------------+--------+
| dept_name | description | gendar |
+-----------+-------------+--------+
| zs | happy | Men |
+-----------+-------------+--------+
1 row in set (0.00 sec)
mysql>
⑦约束
-
约束是在表上强制执行的数据校验规则.
-
约束主要用于保证数据库的完整性。
-
当表中数据有相互依赖性时,可以保护相关的数据不被删除.
-
大部分数据库支持下面五类完整性约束:
NOT NULL非空
UNIQUE Key唯一键
PRIMARY KEY主键
FOREIGN KEY外键
CHECK检查 -
约束作为数据库对象,存放在系统表中,也有自己的名字
-
创建约束的时机:在建表的同时创建;建表后创建(修改表)
-
可定义列级或表级约束
-
有单列约束和多列约束
-
非空约束(
NOT NULL
)
列级约束,只能使用列级约束语法定义。
确保字段值不允许为空
只能在字段级定义
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18) NOT NULL
);
-
NULL
所有数据类型的值都可以是NULL。
空字符串不等于NULL。
0也不等于NULL。 -
NULL值的使用
空值是指不可用、未分配的值
空值不等于零或空格
任意类型都可以支持空值
包括空值的任何算术表达式都等于空
字符串和null进行连接运算,得到也是null. -
唯一约束
唯一性约束条件确保所在的字段或者字段组合不出现重复值
唯一性约束条件的字段允许出现多个NULL
同一张表内可建多个唯一约束
唯一约束可由多列组合而成
建唯一约束时MySQL会为之建立对应的索引。
如果不给唯一约束起名,该唯一约束默认与列名相同
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18) UNIQUE NOT NULL
);
- 主键约束
主键从功能上看相当于非空且唯一
一个表中只允许一个主键
主键是表中唯一确定一行数据的字段
主键字段可以是单字段或者是多字段的组合
当建立主键约束时,MySQL为主键创建对应的索引
主键约束名总为PRIMARY。
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18)
);
- 外键约束
外键是构建于一个表的两个字段或者两个表的两个字段之间的关系
外键确保了相关的两个字段的两个关系:
子(从)表外键列的值必须在主表参照列值的范围内,或者为空(也可以加非空约束,强制不允许为空)。
当主表的记录被子表参照时,主表记录不允许被删除。
外键参照的只能是主表主键或者唯一键,保证子表记录可以准确定位到被参照的记录。
格式FOREIGN KEY (外键列名)REFERENCES 主表(参照列)
mysql> CREATE TABLE tb_dept(
-> dept_id INT PRIMARY KEY,
-> NAME VARCHAR(18),
-> description VARCHAR(255)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc tb_dept;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| dept_id | int(11) | NO | PRI | NULL | |
| NAME | varchar(18) | YES | | NULL | |
| description | varchar(255) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql>
CREATE TABLE tb_employee(
employee_id INT PRIMARY KEY,
NAME VARCHAR(18),
gender VARCHAR(10),
dept_id INT REFERENCES tb_dept(dept_id),
address VARCHAR(255)
);
- 删除定义的约束
删除NOT NULL 的约束:ALTER TABLE 表名 MODIFY 列名 类型;
删除UNIQUE约束:ALTER TABLE 表名 DROP INDEX 唯一约束名;
删除PRIMARY KEY 约束:ALTER TABLE 表名 DROP PRIMARY KEY ;
删除FOREIGN KEY 约束:ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
三、DML的操作
1.INSERT语句
语法:INSERT INTO table [(column [, column…])]–VALUES(value [, value…]);
默认情况下:
- 一次插入操作只插入一行,一次性插入多条记录:
- 如果为每列都指定值,则表名后不需列出插入的列名
- 如果不想在表名后列出列名,可以为那些无法指定的值插入null
- 可以使用如下方式一次插入多行
–Insert into 表名[(列名,…)]
–Select 语句——可以非常复杂。 - 如果需要插入其他特殊字符,应该采用\转义字符做前缀
2.REPLACE语句
语法格式1:replace into 表名 [(字段列表)] values (值列表)
语法格式2:replace [into] 目标表名[(字段列表1)]
select (字段列表2) from 源表 where 条件表达式
语法格式3:replace [into] 表名
set 字段1=值1, 字段2=值2
REPLACE与INSERT语句区别:
replace语句的功能与insert语句的功能基本相同,不同之处在于:使用replace语句向表插入新记录时,如果新纪录的主键值或者唯一性约束的字段值与已有记录相同,则已有记录先被删除(注意:已有记录删除时也不能违背外键约束条件),然后再插入新记录。
使用replace的最大好处就是可以将delete和insert合二为一,形成一个原子操作,这样就无需将delete操作与insert操作置于事务中了。
3.UPDATE语句
UPDATE table –SET column = value [, column = value] … –[WHERE condition];
修改可以一次修改多行数据,修改的数据可用where子句限定,where子句里是一个条件表达式,只有符合该条件的行才会被修改。没有where子句意味着where字句的表达式值为true。也可以同时修改多列,多列的修改中间采用逗号(,)隔开。
4.DROP、TRUNCATE、DELETE的区别
delete
删除数据,保留表结构,可以回滚,如果数据量大,很慢truncate
删除所有数据,保留表结构,不可以回滚,一次全部删除所有数据,速度相对很快drop
删除数据和表结构,删除速度最快。
5.SELECT语句
语法:SELECT {*, column [alias],...}FROM table;
说明:
- SELECT列名列表。*表示所有列。
- FROM 提供数据源(表名/视图名)
- 默认选择所有行
- 使用
DISTINCT
关键字可从查询结果中清除重复行
SELECT DISTINCT department_id FROM employees;
- 限制所选择的记录
使用WHERE子句限定返回的记录,WHERE子句在FROM 子句后
SELECT[DISTINCT] {*, column [alias], ...} FROM table–[WHEREcondition(s)];
- 带有限制条件的查询
比较运算符:= > >= < <= <>不等于
运算符 | 含义 |
---|---|
between…and | 在两个值之间(包含) |
in(list) | 匹配所有列出的值 |
like | 匹配一个字符模式 |
is null | 是空值 |
- 使用IN运算符获得匹配列表值的记录–SQL>
SELECTemployee_id, last_name, salary, manager_id
FROM employees
WHERE manager_id IN (7902, 7566, 7788);
- 使用LIKE运算符执行模糊查询
查询条件可包含文字字符或数字
(%) 可表示零或多个字符
( _ ) 可表示一个字符
SQL>
SELECT last_name
FROM employees
WHERE last_name LIKE '_A%';
- 使用IS NULL运算符查询包含空值的记录
SQL>
SELECT last_name, manager_id
FROM employees
WHERE manager_id IS NULL;
- 使用AND运算符:AND需要所有条件都是满足T.
SQL>
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary>=1100–4 AND job_id='CLERK';
- 使用OR运算符:OR只要两个条件满足一个就可以
SQL>
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary>=1100 OR job_id='CLERK';
- 使用NOT运算符:NOT是取反的意思
SQL>
SELECT last_name, job_id
FROM employees
WHERE job_id NOT IN ('CLERK','MANAGER','ANALYST');
- 优先级次序(括号将跨越所有优先级)
次序 | 运算符 |
---|---|
1 | 所有的比较运算符 |
2 | NOT |
3 | AND |
4 | OR |
- 常用函数
聚合函数对一组值进行运算,并返回单个值。也叫组合函数。
函数 | 详细 |
---|---|
COUNT(*|列名) | 统计行数 |
AVG(数值类型列名) | 平均值 |
SUM (数值类型列名) | 求和 |
MAX(列名) | 最大值 |
MIN(列名) | 最小值 |
除了COUNT()以外,聚合函数都会忽略NULL值。
- 数据分组–
GROUP BY
GROUP BY子句的真正作用是与各种聚合函数配合使用,它用来对查询出来的数据进行分组。
分组的含义是:把该列具有相同值的多条记录当成一组记录处理,最后只输出一条记录。
分组函数忽略空值,。
结果集隐式按升序排列,如果需要改变排序方式可以使用Order by 子句。
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
- 数据分组–限定组的结果:
HAVING
子句
语法:
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BYcolumn];
HAVING子句用来对分组后的结果再进行条件过滤。
where
和having
都是用来做条件限定
的,但是having只能用在group by
之后
例题:查询部门平均工资大于2000的
SELECT deptno,AVG(sal),MAX(sal),MIN(sal),SUM(sal),COUNT(1)
FROM TB_EMP
GROUP BY deptno
HAVING AVG(sal) > 2000
HAVING与WHERE的区别:
WHERE是在分组前进行条件过滤, HAVING子句是在分组后进行条件过滤,
WHERE子句中不能使用聚合函数,HAVING子句可以使用聚合函数。
- 查询结果限定
在SELECT语句最后可以用LIMLT来限定查询结果返回的起始记录和总数量。MySql特有。
SELECT … LIMIT offset_start,row_count;
offset_start:第一个返回记录行的偏移量。默认为0.
row_count:要返回记录行的最大数目。
例子:
SELECT * FROM TB_EMP LIMIT 5;
检索前5个记录
SELECT * FROM TB_EMP LIMIT 5,10;
检索记录行6-15
基本语法总结
SELECT selection_list
选择哪些列
FROM table_list
从何处选择行
WHERE primary_constraint
行必须满足什么条件
GROUP BY grouping_columns
怎样对结果进行分组
HAVING secondary_constraint
行必须满足的第二个条件
ORDER BY sorting_columns
怎样对结果排序
LIMIT offset_start,row_count
结果限定
6.多表连接查询
使用单个SELECT语句从多个表中取出相关的数据,通过多表之间的关系构建相关数据的查询。多表连接通常是建立在相互关系的父子表中的。
①交叉连接/笛卡尔交集
语法:SELECT ...FROM join_table CROSS JOIN join_table2;
没有ON子句和WHERE子句,它返回连接表中所有数据行的笛卡尔积。
其结果集合中的数据行数等于第一个表中符合查询条件行数乘以第二个表中符合查询条件的数据行数。相当于 SELECT ...FROM table1,table2;
交叉连接:返回两张表记录的乘积。
②内连接
-
语法:
SELECT ... FROM join_table
[INNER] JOIN join_table2
[ON join_condition]
WHERE where_defination
-
只列出这些连接表中与连接条件相匹配的数据行
-
内连接分类:
等值连接:在连接条件中使用等号(=)运算符来比较被连接列的列值
非等值连接:在连接条件中使用除等号(=)运算符以外其他的比较运算符来比较被连接列的列值
自然连接:在连接条件中使用等号(=)运算符来比较被连接列的列值,但它使用选择列表指出查询结果集合中所包含的列,并删除连接表中的重复列。 -
内连接示例
**SELECT * FROM tb_dept d,tb_emp e
WHERE d.deptno =e.deptno
**SELECT * FROM tb_dept
INNER JOIN tb_emp
ON tb_dept.deptno =tb_emp.deptno
Test这个员工的部门编号为NULL,在部门表中没有符合连接条件的记录,所以”test”员工的记录不被检索。
③外连接
-
语法:
SELECT ...FROM join_table
(LEFT | RIGHT | FULL) [OUTER] JOIN join_table2
ON join_condition
WHERE where_definition
不仅列出与连接条件相匹配的行,还列出坐标(左外连接),右表(右外连接)或两个表(全外连接)中所有符合WHERE过滤条件的数据行 -
外连接示例
SELECT * FROM tb_emp
LEFT JOIN tb_dept
ON tb_emp.deptno = tb_dept.deptno
-
左外连接:在外连接中,某些不满足条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。
-
左连接,左边的表为主表,左边的表记录全部显示,如果没找到记录则补NULL。
④自连接
:参与连接的表都是同一张表。(通过给表取别名虚拟出)
⑤子查询
- 某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候需要用到子查询
- 为了给主查询(外部查询)提供数据而首先执行的查询(内部查询)被叫做子查询
- 用于子查询的关键字包括in,not in ,= ,< >等
- 一般来说子查询的销量低于连接查询。表连接都可以用子查询替换,但反过来说却不一定。
7.MySQL中的通配符:
通配符 | 详细 |
---|---|
% | 代表任意长度(长度可以为0的字符串) |
_(下横线) | 代表任意单个字符 |
REGEXP运算符 | 可执行更复杂的字符串比较运算,可使用UNIX正则表达式 |
5.条件查询
6.查询排序
7.聚合函数
8.分组查询
9.多表连接和子查询