DML
操作主要有以下命令:
SELECT:查询操作,按照一定的条件,在对应的关系上挑选对应的字段或者对应行的命令
SELECTC查询例子:SELECT select_list FROM tbl_name WHERE qualification(搜索标准)
SELECT支持的查询类型一般分为三类
简单查询(单表查询)
多表查询
子查询(嵌套查询)
INSERT INTO
DELETE
UPDATE
使用INSERT
查询时,会用到FROM
关键字FROM
子句后面跟表(可以是多表,或者关系语句(如再加一个SELECT
语句)),如果跟一个表,就是单表查询,如果是多个表,就是多表查询,如果是一个关系语句,就是嵌套查询
单表查询
使用SELECT
对单表所有字段进行查询:
mysql> SHOW TABLES; +-------------------+ | Tables_in_classes | +-------------------+ | courses | +-------------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM courses; //*是一个通配符,表示所有字段 +-----+-----------------+--------------+ | cid | subject | level | +-----+-----------------+--------------+ | 1 | 密码学基础 | 学位课 | | 2 | 走进通信 | 非学位课 | | 3 | JAVA编程 | 非学位课 | +-----+-----------------+--------------+ 3 rows in set (0.00 sec) //如果要查询某一个或者几个字段,则将*改为对应字段的名称。这种方式称之为投影 mysql> SELECT cid,subject FROM courses; +-----+-----------------+ | cid | subject | +-----+-----------------+ | 3 | JAVA编程 | | 1 | 密码学基础 | | 2 | 走进通信 | +-----+-----------------+ 3 rows in set (0.00 sec) //如果要查询所有字段的某些行,可以使用WHERE进行过滤。这种方式称之为选择 mysql> SELECT * FROM courses WHERE cid<=2; +-----+-----------------+--------------+ | cid | subject | level | +-----+-----------------+--------------+ | 1 | 密码学基础 | 学位课 | | 2 | 走进通信 | 非学位课 | +-----+-----------------+--------------+ 2 rows in set (0.00 sec)
在使用INSERT
命令时,可以加入DISTINCT
来解决冗余问题,比如我们只要查询courses
表种课程的level
有几种,就可以添加关键字DISTINCT
,表示相同的值只显示一次
//为了证明操作的真实性,我又添加了一门subject mysql> SELECT * FROM courses; +-----+-----------------+--------------+ | cid | subject | level | +-----+-----------------+--------------+ | 1 | 密码学基础 | 学位课 | | 2 | 走进通信 | 非学位课 | | 3 | JAVA编程 | 非学位课 | | 4 | 体育 | 学位课 | +-----+-----------------+--------------+ 4 rows in set (0.00 sec) mysql> SELECT DISTINCT level FROM courses; +--------------+ | level | +--------------+ | 学位课 | | 非学位课 | +--------------+ 2 rows in set (0.00 sec)
FROM
子句后面跟表(可以是多表,或者关系语句(如再加一个SELECT
语句)),如果跟一个表,就是单表查询,如果是多个表,就是多表查询,如果是一个关系语句,就是嵌套查询
WHERE的使用
WHERE
子句用来指定一个布尔关系表达式(为真为假或者一个范围),通常使用=,<,>,<=,>=,!
等。在做数值比较时,不加引号;在做字符串比较时,要添加引号;这种查询方式很不理想,因为我们无法有效使用索引
使用组合表达式,对数据库进行查询:
注意:组合表达式之间用逻辑关系符连接
MYSQL中的逻辑符:
AND
OR
NOT
BETWEEN AND
LIKE
REGEXP(RLIKE)
IN
mysql> SELECT * FROM courses WHERE cid>1 & cid<4; +-----+--------------+--------------+ | cid | subject | level | +-----+--------------+--------------+ | 2 | 走进通信 | 非学位课 | | 3 | JAVA编程 | 非学位课 | +-----+--------------+--------------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM courses WHERE cid>1 & level='学位课'; +-----+-----------------+-----------+ | cid | subject | level | +-----+-----------------+-----------+ | 1 | 密码学基础 | 学位课 | +-----+-----------------+-----------+ 1 row in set, 1 warning (0.00 sec) mysql> SELECT * FROM courses WHERE subject LIKE '体%'; +-----+---------+-----------+ | cid | subject | level | +-----+---------+-----------+ | 4 | 体育 | 学位课 | +-----+---------+-----------+ 1 row in set (0.00 sec) mysql> SELECT * FROM courses WHERE subject LIKE '密____';//跟了四个_ +-----+-----------------+-----------+ | cid | subject | level | +-----+-----------------+-----------+ | 1 | 密码学基础 | 学位课 | +-----+-----------------+-----------+ 1 row in set (0.00 sec) mysql> SELECT * FROM courses WHERE subject LIKE '%A%'; +-----+------------+--------------+ | cid | subject | level | +-----+------------+--------------+ | 3 | JAVA编程 | 非学位课 | +-----+------------+--------------+ 1 row in set (0.00 sec)
%是任意长度任意字符;_是单个长度任意字符
为了更好的展示效果,扩充了courses
表的内容:
mysql> SELECT * FROM courses; +-----+-----------------+--------------+---------+ | cid | subject | level | teacher | +-----+-----------------+--------------+---------+ | 1 | 密码学基础 | 学位课 | Rose | | 2 | 走进通信 | 非学位课 | Cindy | | 3 | JAVA编程 | 非学位课 | Tony | | 4 | 体育 | 学位课 | Jerry | | 5 | 通信原理 | 学位课 | Kobe | +-----+-----------------+--------------+---------+ 5 rows in set (0.00 sec)
mysql
查询支持正则表达式,如:查询teacher
以大写J T
开头的内容:
mysql> SELECT * FROM courses WHERE teacher LIKE 'T%' OR teacher LIKE 'J%'; +-----+------------+--------------+---------+ | cid | subject | level | teacher | +-----+------------+--------------+---------+ | 3 | JAVA编程 | 非学位课 | Tony | | 4 | 体育 | 学位课 | Jerry | +-----+------------+--------------+---------+ 2 rows in set (0.00 sec) //当然,这种方式比较本中,有个简单的方法,即使用正则表达式 mysql> SELECT * FROM courses WHERE teacher RLIKE '^[TJ].*'; +-----+------------+--------------+---------+ | cid | subject | level | teacher | +-----+------------+--------------+---------+ | 3 | JAVA编程 | 非学位课 | Tony | | 4 | 体育 | 学位课 | Jerry | +-----+------------+--------------+---------+ 2 rows in set (0.00 sec)
离散取值查询的时候,我们可以使用列表,如:查找cid
为1 3
的subject
mysql> SELECT subject FROM courses WHERE cid IN(1,3); +-----------------+ | subject | +-----------------+ | JAVA编程 | | 密码学基础 | +-----------------+ 2 rows in set (0.00 sec)
关于NULLC查询
如果WHERE
条件是NULL
,则不能使用=
,因为 NULL
是很危险的 使用关键字IS
mysql> SELECT * FROM courses WHERE teacher IS NULL; Empty set (0.00 sec) //这里没有为NULL的,所以显示为0 mysql> SELECT * FROM courses WHERE teacher IS NOT NULL; +-----+-----------------+--------------+---------+ | cid | subject | level | teacher | +-----+-----------------+--------------+---------+ | 1 | 密码学基础 | 学位课 | Rose | | 2 | 走进通信 | 非学位课 | Cindy | | 3 | JAVA编程 | 非学位课 | Tony | | 4 | 体育 | 学位课 | Jerry | | 5 | 通信原理 | 学位课 | Kobe | +-----+-----------------+--------------+---------+ 5 rows in set (0.00 sec)
查询排序
ORDER BY子句
如果我们想对查询的结果进行排序,可以使用ORDER BY
如:查询courses
表中内容,并且输出结果时,按照teacher
名字进行排序
mysql> SELECT * FROM courses ORDER BY teacher; +-----+-----------------+--------------+---------+ | cid | subject | level | teacher | +-----+-----------------+--------------+---------+ | 2 | 走进通信 | 非学位课 | Cindy | | 4 | 体育 | 学位课 | Jerry | | 5 | 通信原理 | 学位课 | Kobe | | 1 | 密码学基础 | 学位课 | Rose | | 3 | JAVA编程 | 非学位课 | Tony | +-----+-----------------+--------------+---------+ 5 rows in set (0.00 sec) //上面时升序输出(ASC),默认时升序,所以可以不添加关键字;如果要降序输出,则还要添加关键字DESC mysql> SELECT * FROM courses ORDER BY teacher DESC; +-----+-----------------+--------------+---------+ | cid | subject | level | teacher | +-----+-----------------+--------------+---------+ | 3 | JAVA编程 | 非学位课 | Tony | | 1 | 密码学基础 | 学位课 | Rose | | 5 | 通信原理 | 学位课 | Kobe | | 4 | 体育 | 学位课 | Jerry | | 2 | 走进通信 | 非学位课 | Cindy | +-----+-----------------+--------------+---------+ 5 rows in set (0.00 sec)
数据存储在磁盘上有三种方式:堆方式、顺序方式、HASH方式,如果数据本来就是乱的存放在磁盘上,则要按顺序读取数据十分消耗资源,所以在存储时,让它进行顺序存储是很必要的,所以排序是很重要的
字段别名查找的时候,给字段起别名输出
同理,表也支持别名
mysql> SELECT teacher AS student FROM courses ORDER BY teacher DESC; +---------+ | student | +---------+ | Tony | | Rose | | Kobe | | Jerry | | Cindy | +---------+ 5 rows in set (0.00 sec) mysql> SELECT 3+2 AS sum; +-----+ | sum | +-----+ | 5 | +-----+ 1 row in set (0.00 sec)
LIMIT子句
LIMIT [offset,]count
offset表示偏移量,count表示取的个数
mysql> SELECT teacher FROM courses LIMIT 2 ; +---------+ | teacher | +---------+ | Rose | | Cindy | +---------+ 2 rows in set (0.00 sec) //表示查看前两行的teacher名 mysql> SELECT teacher FROM courses LIMIT 1,2 ; +---------+ | teacher | +---------+ | Cindy | | Tony | +---------+ 2 rows in set (0.00 sec) //表示略过第一个,查看下来的两个的teacher名 第一个1是偏移量