简单查询
结构(语法):
SELECT COLUMN1,COLUMN2... FROM TABLE_NAME ;
说明:数据是以表的方式存储的,一行描述一个整体的信息
每一列都有属于自己的定义,所以每一列都有一个属于自己的列名
说明:SELECT指明所要查询的东西
FROM指明从哪里查询,FROM后面跟的也叫数据源
应用:
SELECT ENAME,EMPNO,JOB FROM EMP;
→
说明:
必须以英文分号结尾
sql中逗号不区别中英文,但是尽量使用英文逗号
逗号前后的含义是一样的,他们属于同一属性
说明:
EMP、 DEPT 、SALGRADE 表是PL/SQL Developer中用于教学的几个表,在未来的几天学习中需熟知
DUAL表是任何用户都可读取,只有一行一列数据”X”,常用于没有明确指出目标表(验算公式、函数结果、未指定具体的表名和数据集合)的语句中使用
*:通配符:全部的
↓
比如
SELECT * FROM EMP;
思考:
为什么运行
SELECT 123 FROM EMP;
→
有14条数据?
因为表中一共就14行
查询常量就会返回 值为本身、列名为本身(如上图)
SELECT ABC FROM EMP;
——报错——
因为ABC标识符无效
需加单引号来声明其为字符串
SELECT 'ABC' FROM EMP;
特别地,因为ENAME作为列名已在表中定义,定义之后就不需要加单引号
所以我们可以直接
SELECT ENAME FROM EMP;
→
sql中的数学运算
-+*/
TRUNC()截位
ROUND()四舍五入
·
·
·
SELECT 10+5 FROM DUAL;
→
注意:什么时候可以用数学运算?
如果执行下列语句:
SELECT SAL,SAL+100 FROM EMP;
——显示每个人的工资和加100之后的每个人的工资
SELECT ENAME,ENAME+100 FROM EMP;
——报错,无效数字,为什么呢?因为ENAME列的数据类型是字符串,不能加减数字
SELECT ENAME,ENAME+JOB FROM EMP;
——报错,无效数字,为什么呢?因为他们同属于字符串,不能互相加减
拼接符:||
语法:
SELECT VALUE1||VALUE2||VALUE3 FROM TABLE_NAME;
用途:将不同的字符拼接到一起
1.常量+常量
SELECT 123||'ABC' FROM DUAL;
→123ABC
SELECT 'SMITH'||'的名字第一个字母为'||'A' FROM DUAL;
→SMITH的名字第一个字母为A
SELECT 'SMITH的名字第一个字母为A' FROM DUAL;
→SMITH的名字第一个字母为A
2.常量+字段名
将EMP表中的数据显示为:’XXX的工资为XXX,部门编号为XXX’
←
SELECT ENAME||'的工资为'||SAL||',部门编号为'||DEPTNO FROM EMP;
3.字段名+列名
4.字符串在这里视为常量,字符串的标志用’标记
起别名——列别名
语法:
SELECT COLUMN_1 AS 别名,COLUMN_2 AS 别名 FROM TABLE_NAME;
或者
SELECT COLUMN_1 别名,COLUMN_2 别名 FROM TABLE_NAME;
应用:
给EMPNO赋值1001
←
SECELT 1001 AS EMPNO FROM DUAL;
注意:
1.能不能以关键字作为别名?
有时能,有时不能
SELECT EMPNO,EMPNO AS NAME FROM EMP;
——可以的
SELECT EMPNO,EMPNO AS NUMBER FROM EMP;
——不可以,报错
SELECT EMPNO,EMPNO AS “NUMBER” FROM EMP;
——可以的
2.能不能包含数字或者特殊符号?
有时能,为了减少出错,我们每次都加双引号
SELECT EMPNO AS 1 FROM EMP;
——不可以
SELECT EMPNO AS E1A FROM EMP;
——可以
SELECT EMPNO AS E_A FROM EMP;
——可以
SELECT EMPNO AS 1EA FROM EMP;
——不可以
SELECT EMPNO AS _EA FROM EMP;
——不可以
SELECT EMPNO AS “1EA” FROM EMP;
——可以
SELECT EMPNO AS “_EA” FROM EMP;
——可以
SELECT EMPNO,EMPNO E*A FROM EMP;
——不可以
SELECT EMPNO,EMPNO “E*A” FROM EMP;
——可以的
3.能不能以汉字起别名?
能。
SELECT EMPNO,EMPNO AS 员工编号 FROM EMP;
SELECT ENAME AS 员工姓名 FROM EMP;
4.别名只在当前查询语句中起效
起别名——表别名
语法:
SELECT T.COLUMN_NAME FROM TABLE_NAME T;
最规范:
SELECT TABLE_NAME.COLUMN_NAME FROM TABLE_NAME T;
思考:
我们已经学习过了SELECT * FROM DEPT;这种语句
思考一下如果执行
SELECT * FROM EMP,DEPT;
会出现什么?
→
列数:两者相加
行数:两者各自行数相乘
·
·
·
那么如果执行以下语句,会出现什么?
SELECT EMPNO,ENAME,JOB,DEPTNO FROM EMP,DEPT;
——报错
为什么?
因为DEPTNO这一列在EMP和DEPT表中均存在,所以我们需要指明是哪一个表中的DEPTNO这一列
也即
SELECT EMPNO,ENAME,JOB,EMP.DEPTNO FROM EMP,DEPT;
表别名就是用在这个地方,因为有时候表名会很长,且需要在语句中多次声明,所以我们会用表别名去代替表名,来达到减少工作量的目的
也即
SELECT EMPNO,ENAME,JOB,E.DEPTNO FROM EMP E,DEPTNO;
注意:
1.表别名的中间不需要用AS隔开,否则报错
2.便于书写,减少SQL语句的长度
备注:emp和dept的建表语句(MYSQL)
1.建表
CREATE TABLE DEPT (
DEPTNO INT (2) NOT NULL,
DNAME VARCHAR (14),
LOC VARCHAR (13)
);
ALTER TABLE DEPT ADD CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO);
CREATE TABLE EMP (
EMPNO INT (4) NOT NULL,
ENAME VARCHAR (10),
JOB VARCHAR (9),
MGR INT (4),
HIREDATE date,
SAL INT (7),
COMM INT (7),
DEPTNO INT (2)
);
ALTER TABLE EMP ADD CONSTRAINT PK_EMP PRIMARY KEY (EMPNO);
ALTER TABLE EMP ADD CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES DEPT (DEPTNO);
2.插入数据
INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (10, ‘ACCOUNTING’, ‘NEW YORK’);
INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (20, ‘RESEARCH’, ‘DALLAS’);
INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (30, ‘SALES’, ‘CHICAGO’);
INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (40, ‘OPERATIONS’, ‘BOSTON’);
COMMIT;
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7369, ‘SMITH’, ‘CLERK’, 7902, str_to_date(‘17-12-1980’, ‘%d-%m-%Y’), 800, NULL, 20 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7499, ‘ALLEN’, ‘SALESMAN’, 7698, str_to_date(‘20-02-1981’, ‘%d-%m-%Y’), 1600, 300, 30 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7521, ‘WARD’, ‘SALESMAN’, 7698, str_to_date(‘22-02-1981’, ‘%d-%m-%Y’), 1250, 500, 30 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7566, ‘JONES’, ‘MANAGER’, 7839, str_to_date(‘02-04-1981’, ‘%d-%m-%Y’), 2975, NULL, 20 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7654, ‘MARTIN’, ‘SALESMAN’, 7698, str_to_date(‘28-09-1981’, ‘%d-%m-%Y’), 1250, 1400, 30 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7698, ‘BLAKE’, ‘MANAGER’, 7839, str_to_date(‘01-05-1981’, ‘%d-%m-%Y’), 2850, NULL, 30 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7782, ‘CLARK’, ‘MANAGER’, 7839, str_to_date(‘09-06-1981’, ‘%d-%m-%Y’), 2450, NULL, 10 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7788, ‘SCOTT’, ‘ANALYST’, 7566, str_to_date(‘19-04-1987’, ‘%d-%m-%Y’), 3000, NULL, 20 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7839, ‘KING’, ‘PRESIDENT’, NULL, str_to_date(‘17-11-1981’, ‘%d-%m-%Y’), 5000, NULL, 10 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7844, ‘TURNER’, ‘SALESMAN’, 7698, str_to_date(‘08-09-1981’, ‘%d-%m-%Y’), 1500, 0, 30 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7876, ‘ADAMS’, ‘CLERK’, 7788, str_to_date(‘23-05-1987’, ‘%d-%m-%Y’), 1100, NULL, 20 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7900, ‘JAMES’, ‘CLERK’, 7698, str_to_date(‘03-12-1981’, ‘%d-%m-%Y’), 950, NULL, 30 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7902, ‘FORD’, ‘ANALYST’, 7566, str_to_date(‘03-12-1981’, ‘%d-%m-%Y’), 3000, NULL, 20 );
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( 7934, ‘MILLER’, ‘CLERK’, 7782, str_to_date(‘23-01-1982’, ‘%d-%m-%Y’), 1300, NULL, 10 );