1.数据库概述
ObjectOutputStream --> Java对象 -->序列化到文件当中
反序列化
new Java对象
readObject()
writeObject()
使用IO流操作,过程太过复杂
使用数据库(数据管理系统:简单的sql语句),但是数据库中简单的处理还是依靠的IO流
-
常见的有哪些数据库管理系统?
IBM --> eclipse
- Oracle 甲骨文
Oracle --> MySQL AB公司
- DB2
- Sybase “MS sqlServer支持标准sql的数据库管理”
1.1.MySQL的安装
百度网盘链接:https://pan.baidu.com/s/1mXbScF11q3eZogecJorHIQ
提取码:ekcs
安装过程中一般的过程都是next默认即可,要提一下的是有关端口号的知识:
MySQL的默认端口号是3306
设置密码:(不要设置成123,容易被病毒攻破造成数据泄露)
1.2数据库的登录
- cmd命令行打开
- 输入
mysql -uroot -pyq66s
回车,即可登录
其中-u
代表用户名,-p
代表密码
如果不希望密码显示表示,可以输入-p
后回车,再输入密码,此时密码不会显示表示。
数据库配置成功!
1.3MySQL的卸载(如何删除干净)
-
step1:找到软件
-
右键卸载即可删除。但是此时软件还没有删除干净,下次再安装会带来很多麻烦。
-
step2:C盘下的programfile里面的MySQL目录删除
-
step3:C盘下的ProgramData里面的MySQL目录删除。
一般ProgramData目录是隐藏的,需要显示可见才可操作。
1.4 DB DBMS SQL的关系
1、sql、DB、DBMS分别是什么?他们之间的关系?
-
DB:DataBase,数据库。数据库在硬盘上实际以文件的形式存在。
-
DBMS:DataBase Management System:数据库管理系统,常见的有:MySQL,Oracle,DB2,Sybase…
-
SQL:结构化查询语言,是一门通用的语言。标准的sql适用于所有的数据库产品。SQL属于高级语言。
SQL语句在执行的时候,实际内部也会先进行编译,然后再执行sql。SQL语句的编译由DBMS完成。
DBMS负责执行sql语句,通过执行sql语句来操作DB中的数据。
DBMS-(执行)->SQL-操作->DB
2、表(table)
表(table),是数据库的基本组织单元,所有的数据都以表格的形式组织,目的是可读性很强
一个表包括行和列:
- 行:被称为数据/记录(data)
- 列:被称为字段(column)
每个字段应该有哪些属性?
字段名、数据类型、相关的约束
学号(int) | 姓名(varchar) | 年龄(int) |
---|---|---|
1902051 | 张三 | 19 |
1903055 | 李四 | 20 |
相关约束,比如要求字段非空等。
3、学习MySQL主要还是学习通用的SQL语句,那么SQL语句包括增删查改,SQL语句怎么分类呢?
- DQL(数据查询语言):查询语句,凡是select的语句都是DQL
- DML(数据操作语言):insert delete update,对表中的数据进行增删改。
- DDL(数据定义语言):create drop alter,对表结构的增删改。
- TCL(事务控制语言):commit(提交事务),rollback回滚事务
- DCL(数据控制语言):grant授权,revoke撤销权限等
root超管 --> 创建其他用户 :DCL
4、导入初始化数据(后期练习)
***注意每个语句结束都要打分号
第一步:登录MySQL数据库管理系统
dos窗口命令:
mysql -uroot -p****
第二步:查看有哪些数据库
show databases;(这个不是SQL语句,属于MySQL的命令)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bjpowernode |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
第三步:创建属于自己的数据库
create database bjpowernode;(这个不是SQL语句,属于MySQL的命令)
第四步:使用bjpowernode数据
use bjpowernode;(这个不是SQL语句,属于SQL命令)
再次切换再使用use命令即可(如上图)
第五步:查看当前使用的数据库中有哪些表
show tables;
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
第六步:初始化表格
source + 路径;(其实直接将初始的数据拖拉进去即可)
初始化完成后有三张表,如上。
5、对sql脚本的理解
bjpowernode.sql,这个文件以sql结尾,这样的文件被称为“sql脚本”。什么是sql脚本呢?当一个文件的扩展名为sql,并且该文件中编写了大量的sql文件,我们称这样的文件为sql脚本。
注意:直接使用source命令可以执行sql脚本
sql脚本的数据量太大时,无法打开,请使用source命令完成初始化。
6、删除数据库
drop database bjpowernode;
删除数据库
7、查看表结构
+---------------------------------+
| Tables_in_bjpowernode |
+--------------------------------+
| dept | (部门表)
| emp | (员工表)
| salgrade | (工资统计表)
+---------------------------------+
3 rows in set (0.00 sec)
命令:desc + 表名,查看表的结构:
mysql> desc dept;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| DEPTNO | int(2) | NO | PRI | NULL | | #部门编号
| DNAME | varchar(14) | YES | | NULL | | #部门名字
| LOC | varchar(13) | YES | | NULL | | #部门位置
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.03 sec)
mysql> desc emp;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
| ----- | ---- | ---- | ---- | ------- | ----- |
| | | | | | |
+----------+-------------+------+-----+---------+-------+
| EMPNO | int(4) | NO | PRI | NULL | | 员工编号
| ENAME | varchar(10) | YES | | NULL | | 员工名字
| JOB | varchar(9) | YES | | NULL | | 工作岗位
| MGR | int(4) | YES | | NULL | | 上级领导编号
| HIREDATE | date | YES | | NULL | | 入职日期
| SAL | double(7,2) | YES | | NULL | | 月薪
| COMM | double(7,2) | YES | | NULL | | 补助/津贴
| DEPTNO | int(2) | YES | | NULL | | 部门编号
+----------+-------------+------+-----+---------+-------+
8 rows in set (0.05 sec)
mysql> desc salgrade;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| GRADE | int(11) | YES | | NULL | | 等级
| LOSAL | int(11) | YES | | NULL | | 最高薪资
| HISAL | int(11) | YES | | NULL | | 最低薪资
+-------+---------+------+-----+---------+-------+
3 rows in set (0.03 sec)
8、表格中的数据
使用语句:select * from +数据段的名字
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.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-04-19 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 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.01 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.01 sec)
9、常用的命令
-
创建数据库
create database
-
查看现在使用的数据库
select database();
-
查看现在的mySQL版本
selcet version();
mysql> select database();
+-------------+
| database() |
+-------------+
| bjpowernode |
+-------------+
1 row in set (0.00 sec)
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.36 |
+-----------+
1 row in set (0.01 sec)
-
结束一条语句
\c
-
退出mysql
exit();
-
查看创建表的语句
show create table + 数据库名
查看数据库的内容
mysql> show create table emp;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| emp | CREATE TABLE `emp` (
`EMPNO` int(4) NOT NULL,
`ENAME` varchar(10) DEFAULT NULL,
`JOB` varchar(9) DEFAULT NULL,
`MGR` int(4) DEFAULT NULL,
`HIREDATE` date DEFAULT NULL,
`SAL` double(7,2) DEFAULT NULL,
`COMM` double(7,2) DEFAULT NULL,
`DEPTNO` int(2) DEFAULT NULL,
PRIMARY KEY (`EMPNO`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
10、简单的查询语句(DQL)
语法格式:
select 字段名1, 字段名2, 字段名3...from 表名;
提示:
-
任何一个sql语句,以分号为结尾
-
sql语句不区分大小写
mysql> select Empno,ENamE from -> emp; +-------+--------+ | Empno | ENamE | +-------+--------+ | 7369 | SMITH | | 7499 | ALLEN | | 7521 | WARD | | 7566 | JONES | | 7654 | MARTIN | | 7698 | BLAKE | | 7782 | CLARK | | 7788 | SCOTT | | 7839 | KING | | 7844 | TURNER | | 7876 | ADAMS | | 7900 | JAMES | | 7902 | FORD | | 7934 | MILLER | +-------+--------+ 14 rows in set (0.00 sec)
查询员工的年薪?
select ename, sal*12 from emp;
mysql> select ename, sal*12 from emp; +--------+----------+ | ename | sal*12 | +--------+----------+ | SMITH | 9600.00 | | ALLEN | 19200.00 | | WARD | 15000.00 | | JONES | 35700.00 | | MARTIN | 15000.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 | +--------+----------+ 14 rows in set (0.00 sec)
字段可以参与运算,查询的字段结果可以重命名:
select ename, sal * 12 as yearSal from emp;
语句将展示出来的新字段重命名mysql> select ename,sal*12 as yearSal from emp; +--------+----------+ | ename | yearSal | +--------+----------+ | SMITH | 9600.00 | | ALLEN | 19200.00 | | WARD | 15000.00 | | JONES | 35700.00 | | MARTIN | 15000.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 | +--------+----------+ 14 rows in set (0.00 sec)
别名之中有中文?
select ename , sal * 12 as 年薪 from emp; #错误
select ename, sal * 12 as'年薪'from emp;
mysql> select ename, sal * 12 as'年薪'from emp; +--------+----------+ | ename | 年薪 | +--------+----------+ | SMITH | 9600.00 | | ALLEN | 19200.00 | | WARD | 15000.00 | | JONES | 35700.00 | | MARTIN | 15000.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 | +--------+----------+ 14 rows in set (0.00 sec)
标准字符串为单引号标识字符串。建议在数据库中书写字符串时使用单引号而不是双引号,便于不仅仅能在mysql中运行,也能在其他的数据库中运行。
as关键字可以省略:
mysql> select ename,sal * 12 yearSal from emp; +--------+----------+ | ename | yearSal | +--------+----------+ | SMITH | 9600.00 | | ALLEN | 19200.00 | | WARD | 15000.00 | | JONES | 35700.00 | | MARTIN | 15000.00 | | BLAKE | 34200.00 | | CLARK | 29400.00 | | SCOTT | 36000.00 | | KING | 60000.00 | | TURNER | 18000.00 | | ADAMS | 13200.00 | | JAMES | 11400.00 | | FORD | 36000.00 | | MILLER | 15600.00 | +--------+----------+ 14 rows in set (0.00 sec)
查询全部字段?
select * from table名;
*的效率较低,实际开发中不建议使用。
11、条件查询
语法格式:
select 字段1,字段2,字段3...from 表名 where 条件;
执行顺序:先from,然后where,最后select
- 查询员工的工资为5000 的员工的姓名:
select ename from emp where sal=5000;
mysql> select ename from emp where sal=5000;
+-------+
| ename |
+-------+
| KING |
+-------+
1 row in set (0.00 sec)
- 查询SMITH的工资:
mysql> select sal from emp where ename = 'SMITH';
+--------+
| sal |
+--------+
| 800.00 |
+--------+
1 row in set (0.00 sec)
(字符串查询要写单引号)
- 查询工资大于3000 的员工:
mysql> select ename, sal from emp where sal>=3000;
+-------+---------+
| ename | sal |
+-------+---------+
| SCOTT | 3000.00 |
| KING | 5000.00 |
| FORD | 3000.00 |
+-------+---------+
3 rows in set (0.01 sec)
- 查询工资不等于3000 的员工:
mysql> select ename,sal from emp where sal <> 3000;
+--------+---------+
| ename | sal |
+--------+---------+
| SMITH | 800.00 |
| ALLEN | 1600.00 |
| WARD | 1250.00 |
| JONES | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| KING | 5000.00 |
| TURNER | 1500.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| MILLER | 1300.00 |
+--------+---------+
12 rows in set (0.00 sec)
- 查询工资在某个区间内的:
mysql> select ename,sal from emp where sal >= 1100 and sal <= 3000;
+--------+---------+
| ename | sal |
+--------+---------+
| ALLEN | 1600.00 |
| WARD | 1250.00 |
| JONES | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| TURNER | 1500.00 |
| ADAMS | 1100.00 |
| FORD | 3000.00 |
| MILLER | 1300.00 |
+--------+---------+
11 rows in set (0.01 sec)
mysql> select ename,sal from emp where sal between 1100 and 3000;
+--------+---------+
| ename | sal |
+--------+---------+
| ALLEN | 1600.00 |
| WARD | 1250.00 |
| JONES | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| TURNER | 1500.00 |
| ADAMS | 1100.00 |
| FORD | 3000.00 |
| MILLER | 1300.00 |
+--------+---------+
11 rows in set (0.01 sec)
between and是闭区间[1000,3000],顺序不能交换,否则查询不到任何数据
between…and…还可以应用在字符串方面:
说明是以首字母为标记的。
mysql> select ename from emp where ename between 'A' and 'B';
+-------+
| ename |
+-------+
| ALLEN |
| ADAMS |
+-------+
2 rows in set (0.01 sec)
- 找出哪些人没有津贴
在数据库中NULL不是一个值,代表什么也没有,为空。不能用等号衡量,必须使用is null或者is not null。
mysql> select ENAME, SAL from EMP where COMM is null;
+--------+---------+
| ENAME | SAL |
+--------+---------+
| SMITH | 800.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING | 5000.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| FORD | 3000.00 |
| MILLER | 1300.00 |
+--------+---------+
10 rows in set (0.00 sec)
- 找出工作岗位是MANAGER和SALESMAN的员工:
mysql> select ENAME, JOB from EMP where JOB = 'SALSMAN' or JOB = 'MANAGER';
+-------+---------+
| ENAME | JOB |
+-------+---------+
| JONES | MANAGER |
| BLAKE | MANAGER |
| CLARK | MANAGER |
+-------+---------+
3 rows in set (0.00 sec)
注意,字符要用单引号括起来。另外,or连接的前后都要写上的是条件。
-
and和or的联合使用:找出薪资大于3000且部门编号是20 或者 30 部门的员工
-
mysql> select ENAME,SAL,DEPTNO from EMP where SAL > 1000 and DEPTNO = 20 or DEPTNO = 30; +--------+---------+--------+ | ENAME | SAL | DEPTNO | +--------+---------+--------+ | ALLEN | 1600.00 | 30 | | WARD | 1250.00 | 30 | | JONES | 2975.00 | 20 | | MARTIN | 1250.00 | 30 | | BLAKE | 2850.00 | 30 | | SCOTT | 3000.00 | 20 | | TURNER | 1500.00 | 30 | | ADAMS | 1100.00 | 20 | | JAMES | 950.00 | 30 | | FORD | 3000.00 | 20 | +--------+---------+--------+ 10 rows in set (0.00 sec)
mysql> select ENAME,SAL,DEPTNO from EMP where SAL > 1000 and (DEPTNO = 20 or DEPTNO = 30); +--------+---------+--------+ | ENAME | SAL | DEPTNO | +--------+---------+--------+ | ALLEN | 1600.00 | 30 | | WARD | 1250.00 | 30 | | JONES | 2975.00 | 20 | | MARTIN | 1250.00 | 30 | | BLAKE | 2850.00 | 30 | | SCOTT | 3000.00 | 20 | | TURNER | 1500.00 | 30 | | ADAMS | 1100.00 | 20 | | FORD | 3000.00 | 20 | +--------+---------+--------+ 9 rows in set (0.00 sec)
第一个写法是错误写法,第二个写法正确:当优先级不确定时注意写括号
-
in等同与or:找出工作岗位是MANAGER 和SALSMAN的员工:
-
mysql> select ENAME,SAL,JOB from EMP where JOB in ('SALSMAN','MANAGER'); +-------+---------+---------+ | ENAME | SAL | JOB | +-------+---------+---------+ | JONES | 2975.00 | MANAGER | | BLAKE | 2850.00 | MANAGER | | CLARK | 2450.00 | MANAGER | +-------+---------+---------+ 3 rows in set (0.00 sec)
注意,这不是区间,而是具体的值。比如下面的例子:
mysql> select ENAME,SAL,JOB from EMP where SAL in (800,5000); +-------+---------+-----------+ | ENAME | SAL | JOB | +-------+---------+-----------+ | SMITH | 800.00 | CLERK | | KING | 5000.00 | PRESIDENT | +-------+---------+-----------+ 2 rows in set (0.00 sec)
-
此外,in还有一个反面的:not in,表示不是列举的条件的,都查找出来:
mysql> select ENAME,SAL,JOB from EMP where SAL not in (800,5000); +--------+---------+----------+ | ENAME | SAL | JOB | +--------+---------+----------+ | ALLEN | 1600.00 | SALESMAN | | WARD | 1250.00 | SALESMAN | | JONES | 2975.00 | MANAGER | | MARTIN | 1250.00 | SALESMAN | | BLAKE | 2850.00 | MANAGER | | CLARK | 2450.00 | MANAGER | | SCOTT | 3000.00 | ANALYST | | TURNER | 1500.00 | SALESMAN | | ADAMS | 1100.00 | CLERK | | JAMES | 950.00 | CLERK | | FORD | 3000.00 | ANALYST | | MILLER | 1300.00 | CLERK | +--------+---------+----------+ 12 rows in set (0.00 sec)
-
12、模糊查询like
找出名字中含有o的:
在模糊查询中,必须掌握两个特殊的符号:一个是%,一个是_
%表示任意多个字符,_代表任意一个字符。那么找出名字中带有o的应该使用下面的语句:
select ENAME from EMP where ename like '%O%';
mysql> select ENAME from EMP where ename like '%O%';
+-------+
| ENAME |
+-------+
| JONES |
| SCOTT |
| FORD |
+-------+
3 rows in set (0.00 sec)
找出名字中第二个字母是A的:
mysql> select ENAME from EMP where ename like '_A%';
+--------+
| ENAME |
+--------+
| WARD |
| MARTIN |
| JAMES |
+--------+
3 rows in set (0.00 sec)
找出名字中有下划线的:使用转义字符\
找出名字中给最后一个字母是t的:
mysql> select ENAME from EMP where ename like '%t';
+-------+
| ENAME |
+-------+
| SCOTT |
+-------+
1 row in set (0.00 sec)
13、排序(升序,降序)
按照工资升序,找出员工名和薪资:
关键字是order by;默认是按照升序。
mysql> select ENAME, SAL from EMP order by SAL;
+--------+---------+
| ENAME | SAL |
+--------+---------+
| SMITH | 800.00 |
| JAMES | 950.00 |
| ADAMS | 1100.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN | 1600.00 |
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| KING | 5000.00 |
+--------+---------+
14 rows in set (0.00 sec)
- 怎么指定升序或者降序
- asc:升序
- desc:降序
mysql> select ENAME, SAL from EMP order by SAL desc;
+--------+---------+
| ENAME | SAL |
+--------+---------+
| KING | 5000.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| SMITH | 800.00 |
+--------+---------+
14 rows in set (0.00 sec)
按照工资的降序排,当工资相同时,再按照名字的升序排列:
mysql> select ENAME, SAL from EMP order by SAL desc,ENAME asc;
+--------+---------+
| ENAME | SAL |
+--------+---------+
| KING | 5000.00 |
| FORD | 3000.00 |
| SCOTT | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| MARTIN | 1250.00 |
| WARD | 1250.00 |
| ADAMS | 1100.00 |
| JAMES | 950.00 |
| SMITH | 800.00 |
+--------+---------+
14 rows in set (0.00 sec)
多字段排序:越靠前的字段越起主导作用。只有当前面的字段无法完成排序的时候,后面的字段才会起到排序作用。
按照列的顺序排:1代表第一列,2代表第二列。
mysql> select ENAME, SAL from EMP order by 2;
+--------+---------+
| ENAME | SAL |
+--------+---------+
| SMITH | 800.00 |
| JAMES | 950.00 |
| ADAMS | 1100.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN | 1600.00 |
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| KING | 5000.00 |
+--------+---------+
14 rows in set (0.00 sec)
mysql> select ENAME, SAL from EMP order by 1;
+--------+---------+
| ENAME | SAL |
+--------+---------+
| ADAMS | 1100.00 |
| ALLEN | 1600.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| FORD | 3000.00 |
| JAMES | 950.00 |
| JONES | 2975.00 |
| KING | 5000.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| SCOTT | 3000.00 |
| SMITH | 800.00 |
| TURNER | 1500.00 |
| WARD | 1250.00 |
+--------+---------+
14 rows in set (0.00 sec)
mysql> select * from EMP order by 6;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987-05-23 | 1100.00 | NULL | 20 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-04-19 | 3000.00 | NULL | 20 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
但是不建议使用列的号码进行排序,若是列的顺序变换了,那么这样的写法就失效了。
找出工作岗位是SALSMAN的员工,并要求按照工资的降序排列:
mysql> select ENAME,SAL from EMP where JOB = 'SALESMAN' order by SAL desc;
+--------+---------+
| ENAME | SAL |
+--------+---------+
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
+--------+---------+
4 rows in set (0.00 sec)
上述语句的执行顺序:
select
* 3
from
tablename 1
where
conditions 2
order by
… 4
注意:order by是最后执行的。验证请看下面的例子:
mysql> select ENAME,SAL as salary from EMP order by salary;
+--------+---------+
| ENAME | salary |
+--------+---------+
| SMITH | 800.00 |
| JAMES | 950.00 |
| ADAMS | 1100.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN | 1600.00 |
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| KING | 5000.00 |
+--------+---------+
14 rows in set (0.00 sec)
我们使用别名进行排序,别名可用作查询,说明order by是最后执行的。
用列的号码进行排序,若是列的顺序变换了,那么这样的写法就失效了。
找出工作岗位是SALSMAN的员工,并要求按照工资的降序排列:
mysql> select ENAME,SAL from EMP where JOB = 'SALESMAN' order by SAL desc;
+--------+---------+
| ENAME | SAL |
+--------+---------+
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
+--------+---------+
4 rows in set (0.00 sec)
上述语句的执行顺序:
select
* 3
from
tablename 1
where
conditions 2
order by
… 4
注意:order by是最后执行的。验证请看下面的例子:
mysql> select ENAME,SAL as salary from EMP order by salary;
+--------+---------+
| ENAME | salary |
+--------+---------+
| SMITH | 800.00 |
| JAMES | 950.00 |
| ADAMS | 1100.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN | 1600.00 |
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| SCOTT | 3000.00 |
| FORD | 3000.00 |
| KING | 5000.00 |
+--------+---------+
14 rows in set (0.00 sec)
我们使用别名进行排序,别名可用作查询,说明order by是最后执行的。