mysql的查询操作(未完)

mysql的查询操作

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)

离散取值查询的时候,我们可以使用列表,如:查找cid1 3subject


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是偏移量


猜你喜欢

转载自blog.csdn.net/fsx2550553488/article/details/80317509
今日推荐