数据库的DQL(1)

数据库的DQL

DQL是sql中的一种重要语言类型,用于查询数据库中表的记录。DQL的主要关键字是select,用于从数据库中检索数据。常见的查询操作包括基本查询,条件查询,排序查询,分组查询,聚合函数等;

在MySQL中,可以使用select语句来查询数据。查询数据是指从数据库总根据需求,使用不同的查询方式来获取不同的数据。

SELECT <字段名> FROM 表名 WHERE 表达式

在练习之前,导入准备好的sql文件。


mysql> source D:\python and mysql-note\mysql笔记\emp.sql
Query OK, 6 rows affected (0.10 sec)

Query OK, 1 row affected (0.01 sec)

Database changed
Query OK, 0 rows affected, 1 warning (0.02 sec)

Query OK, 1 row affected (0.01 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 0 rows affected, 5 warnings (0.04 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 0 rows affected (0.03 sec)

Query OK, 1 row affected (0.01 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)

Query OK, 1 row affected (0.00 sec)



mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| dept           |
| emp            |
| salgrade       |
+----------------+
3 rows in set (0.01 sec)


mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job       | mgr  | hiredate   | sal     | comm    | deptno |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-07-13 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-07 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-07-13 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)

mysql> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

mysql> select * from salgrade;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)
 		

1.基本查询

1.1查询指定字段

  • 使用*通配符查询所有字段
  • 列出表的所有字段

SELECT 可以使用*查找表中所有字段数据:

SELECT * FROM 表名;

使用*查询时,只能按照数据表中字段的顺序进行排序,不能改变字段的排序顺序。

案例1:


mysql> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

使用* 查询,结果会返回表中所有列

一般情况下,除非要使用表格中所有数据,否则最好不要使用*查询。虽然可以节省输入查询语句的时间,但回去不需要的列数据通常会降低查询各所使用程序的效率。

select关键字后面的字段名为需要查找的字段,因此可以将表中所有字段的名称跟在select关键字后面。如果忘了字段名称,可以使用desc命令查看表结构。


mysql> select deptno,dname,loc from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

查询表中指定字段:

select 列名 from 表名

案列2:


mysql> select dname from dept;
+------------+
| dname      |
+------------+
| ACCOUNTING |
| RESEARCH   |
| SALES      |
| OPERATIONS |
+------------+
4 rows in set (0.00 sec)

mysql> select loc,dname from dept;
+----------+------------+
| loc      | dname      |
+----------+------------+
| NEW YORK | ACCOUNTING |
| DALLAS   | RESEARCH   |
| CHICAGO  | SALES      |
| BOSTON   | OPERATIONS |
+----------+------------+
4 rows in set (0.00 sec)

1.2.去重查询

在MySQL了中使用select语句执行简单的数据查询时,返回的是所有匹配的记录。若果表黄总的某些字段没有唯一性约束,那么这些字段就看存在重复值。为了实现查询不重复的数据,MySQL提供了distinct关键字。

select distinct 字段名 from 表名

如果 DISTINCT 关键字后有多个字段,则会对多个字段进行组合去重,也就是说,只有多个字段组合起来完全是一样的情况下才会被去重.

案例1:指定关键字去重


mysql> select job from emp;
+-----------+
| job       |
+-----------+
| CLERK     |
| SALESMAN  |
| SALESMAN  |
| MANAGER   |
| SALESMAN  |
| MANAGER   |
| MANAGER   |
| ANALYST   |
| PRESIDENT |
| SALESMAN  |
| CLERK     |
| CLERK     |
| ANALYST   |
| CLERK     |
+-----------+
14 rows in set (0.00 sec)

mysql> select distinct job from emp;
+-----------+
| job       |
+-----------+
| CLERK     |
| SALESMAN  |
| MANAGER   |
| ANALYST   |
| PRESIDENT |
+-----------+
5 rows in set (0.00 sec)

案例2:多个字段去重


mysql> select job,deptno from emp;
+-----------+--------+
| job       | deptno |
+-----------+--------+
| CLERK     |     20 |
| SALESMAN  |     30 |
| SALESMAN  |     30 |
| MANAGER   |     20 |
| SALESMAN  |     30 |
| MANAGER   |     30 |
| MANAGER   |     10 |
| ANALYST   |     20 |
| PRESIDENT |     10 |
| SALESMAN  |     30 |
| CLERK     |     20 |
| CLERK     |     30 |
| ANALYST   |     20 |
| CLERK     |     10 |
+-----------+--------+
14 rows in set (0.00 sec)

mysql> select distinct job,deptno from emp;
+-----------+--------+
| job       | deptno |
+-----------+--------+
| CLERK     |     20 |
| SALESMAN  |     30 |
| MANAGER   |     20 |
| MANAGER   |     30 |
| MANAGER   |     10 |
| ANALYST   |     20 |
| PRESIDENT |     10 |
| CLERK     |     30 |
| CLERK     |     10 |
+-----------+--------+
9 rows in set (0.00 sec)

distinct 只能返回他的目标字段,而无法返回其他字段,所以在实际情况中,我们经常使用distinct关键字来返回不重复字段的条数,

1.3设置别名

为了查询方便,MySQL提供了as关键字来为表和字段指定别名。

表名 AS 别名

案例1:指定表别名


mysql> select * from salgrade as sal;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)

为字段指定别名

在使用select语句查询是MySQL会显示每个select后面指定输出的字段。为了显示结果更加直观,我们可以为字段指定一个别名。

字段名 AS 别名

AS 关键字也可以省略,省略后需要将字段名和别名用空格隔开。

案例2:


mysql> select grade as chengji,losal as di,hisal as gao from salgrade;
+---------+------+------+
| chengji | di   | gao  |
+---------+------+------+
|       1 |  700 | 1200 |
|       2 | 1201 | 1400 |
|       3 | 1401 | 2000 |
|       4 | 2001 | 3000 |
|       5 | 3001 | 9999 |
+---------+------+------+
5 rows in set (0.00 sec)

1.4指定查询数量

当数据表中有上万条数据时,一次性查询出表中的全部数据会降低数据返回的速度,同时给数据库服务器造成很大的压力,这时就可以使用limit关键字来限制查询结果返回的条数。

limit用于指定查询结果从哪一条记录开始显示,一共显示多少条记录。

1.指初始位置

limit 初始位置,记录数

数据表中第一条记录的位置是0,第二条位置是1…

案例1:


mysql> select * from salgrade;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)

mysql> select * from salgrade limit 2,3;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
3 rows in set (0.00 sec)

2.不指定初始位置

limit不指定初始位置是,记录从第一条记录开始显示。显示条数由limit关键字指定。

案例2:


mysql> select * from salgrade limit 2;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
+-------+-------+-------+
2 rows in set (0.00 sec)

mysql> select * from salgrade limit 6;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)

3.limit 和 offset组合使用

limit 记录数 offset 初始位置

初始位置”指定从哪条记录开始显示;“记录数”表示显示记录的条数

案例3:


mysql> select * from salgrade limit 2 offset 3;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
2 rows in set (0.00 sec)


mysql> select * from salgrade limit 2 offset 1;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
+-------+-------+-------+
2 rows in set (0.00 sec)

1.5查询结果排序

为了使查询结果的顺序满足用户的要求,MySQL提供了order by 关键字来对查询结果进行排序。

order by 字段名 [asc|desc]
  • ASC|DESC:ASC表示字段按升序排序;DESC表示字段按降序排序。其中ASC为默认值。

  • ORDER BY 关键字后可以跟子查询(关于子查询后面讲解,这里了解即可)。

  • 当排序的字段中存在空值时,ORDER BY 会将该空值作为最小值来对待。

  • ORDER BY 指定多个字段进行排序时,MySQL 会按照字段的顺序从左到右依次进行排序。

案例1:


mysql> select * from salgrade;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)

mysql> select * from salgrade order by grade;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)

案例2:


mysql> select * from salgrade order by losal desc;
+-------+-------+-------+
| grade | losal | hisal |
+-------+-------+-------+
|     5 |  3001 |  9999 |
|     4 |  2001 |  3000 |
|     3 |  1401 |  2000 |
|     2 |  1201 |  1400 |
|     1 |   700 |  1200 |
+-------+-------+-------+
5 rows in set (0.00 sec)

案例3:


mysql> select ename,mgr,sal from emp order by sal,hiredate;
+--------+------+---------+
| ename  | mgr  | sal     |
+--------+------+---------+
| SMITH  | 7902 |  800.00 |
| JAMES  | 7698 |  950.00 |
| ADAMS  | 7788 | 1100.00 |
| WARD   | 7698 | 1250.00 |
| MARTIN | 7698 | 1250.00 |
| MILLER | 7782 | 1300.00 |
| TURNER | 7698 | 1500.00 |
| ALLEN  | 7698 | 1600.00 |
| CLARK  | 7839 | 2450.00 |
| BLAKE  | 7839 | 2850.00 |
| JONES  | 7839 | 2975.00 |
| FORD   | 7566 | 3000.00 |
| SCOTT  | 7566 | 3000.00 |
| KING   | NULL | 5000.00 |
+--------+------+---------+
14 rows in set (0.00 sec)

出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.youkuaiyun.com/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值