文章目录
一:SQL 语句中
在 SQL 语句中常用注释方式
(1) 单行注释: -- ,
(2) 多行注释 /* */
1: select 语句中从数据库中选取的数据, 结果被存储在一个结果表中,称为结果集。
select column_name, colume_name from table_name;
2: select distinct 语句用于返回唯一不同的值。
select distinct column_name, column_name from table_name
3: where 子句用于提取那些满足指定条件的记录
select column_name, colume_name from table_name where colume_name operator value;
select * from table where name = ‘王记勇’;
在 where 中有 文本字段 和 数值字段时
(1)文本字段使用了 单引号。
(2)数字字段,请不要使用引号。
select * from websites where id = 1;
select * from websites country= ‘China’;
where 后面:
= : 等于
<> : 不等于 (在SQL 的一些版本中, 该操作可被写成 !=)
> : 大于
< : 小于
>= : 大于等于
<=%: 小于等于
between : 在某个范围内
like : 搜索某种模式
in : 指定针对某个列的可能值
特殊条件查询: 通配符
(1): is null;
select * from emp where comm is null;
(2): between and (在 之间的值)
select * from emp where sal between 1500 and 3000;
(3):in (), colume_name(2, 3, 4);
select * from emp where sal in(5000, 3000, 1500);
(4): like 模糊查询
select * from emp where ename like 'M%';
- 查询 emp 表中 ename 列中有 M 的值,
- % :表示 多个字值, _ :下划线表示一个字符
- M% : 为能配符, 正则表达式, 表示的意思为模糊查询信息为 M;
- %M% : 表示查询包含 M 的所有内容。
- %M_ : 表示查询以 M 在倒数第二位的所有内容。
不带比较运算符的 where 子句
select studentNO from student where 0
会返回一个空集select studetNO from student where 1
返回 studentNO列的值。
4: and 和 or 运算符
(1):AND: 第一个条件和第二条件都成立, 则and 运算符显示一套记录
(2):OR:第一条件和第二个条件只要有一个成立, 则 OR 运算符显示一条记录。
5: SQL 中拥有的计数和计算的内建函数
SQL Aggregate 函数
- AVG() – 返回平均值
- COUNT() – 返回行数
- FIRST() – 返回第一个记录的值
- LAST() – 返回最后一个记录的值
- MAX() – 返回最大值
- MIN() – 返回最小值
- SUM() — 返回总和
SQL Scalar 函数
- SQL Scalar 函数基于输入值, 返回一个单一的值。
- Scalar 函数
- UCASE() – 将某个字段转换为大写
- LCASE() – 将某个字段转换为小写
- MID() – 从某个文本字段提取字段, mysql 中使用
- subString(字段, 1, end) – 从某个文本字段提取字符
- LEN() – 返回某个文本字段的长度
- ROUND() – 对某个数值字段进行指定小数位数的四舍五入
- NOW() – 返回当前系统的日期和时间
- FORMAT() – 格式化某个字段的时间方式。
6: 查询中的升序和降序问题
SELECT
column_name,column_name
FROM
table_name
ORDER BY
column_name,column_name ASC|DESC;
-- ASC : 升序
-- DESC : 降序
/*
order by 主要用来解决排序的问题。
*/
7: 表中插入数据 -> insert into
- 第一种形式:无需指定插入数据的列名, 只需要提供被插入的值即可
INSERT INTO
table_name
VALUES
(value1, value2, value3....);
- 第二种形式: 需要指定列名以及被插入的值
INSERT INTO
table_name(column1 column2, column3...)
VALUES
(value1, value2, value3....);
二: SQL 语句中的高级用法
1: Top 进行表中行数数据的查询。
- (1):按行数进行查询
SELECT
*
FROM
table_name
WHERE
ROWNUM <= 10;
- (2): 按 top 前几行查询
SELECT
top 2 *
FROM
table_name; -- 查询 前两行 的数据
- (3):按百分比进行查询
SELECT
top 50 percent
FROM
table_name; -- 查询百分之50 的数据
- (4) top 语法格式:
SELECT
top number|percent column_name
FROM
table_name
2: like 操作符用于在 where 字句中搜索列中的指定模式
- 语法格式
SELECT
colum_name(s)
From
table_name
WHERE
clumn_name LIKE pattern;
- like 使用方法
- 1:
WHERE clumn_name like %s
表示: 查询以 s 结尾的字段 - 2:
WHERE clumn_name like a%
表示:查询以 a 开头的字段 - 3:
WHERE clumn_name like %bass%
表示:查询字段中含有 bass 数据的字段 - 4:
WHERE clumn_name not like %bass%
表示:查询字段中不含有 bass 数据的字段
- 1:
3: 通配符的使用
以下的使用都是在 **WHERE clumn_name like ' '**
like 后的分号内进行使用。
- “_” :表示代替一个字符
- “%” : 表示代替一个或者几个字符
- “[abc]”: 表示字段中数据以 a, b, c 开头的数据
- “[!abc]”: 表示字段中不以a, b, c 开头的数据
- “[a-d]”: 表示字段以a, b, c, d 开头的字段数据。
4: in 操作符的使用
- 使用条件:查询多个 字段时, 可以直接进行简写
SELECT
*
FROM
table_name
WHERE
clumn_name IN (name1, name2, name3)
-- 相当于: clumn_name=name1 or clumn_name=name2 or clumn_name=name3;
5: between … and …
-
不同的数据库中, between中字段的范围不一样,
- between … and … 常用于处理:三种字段
- 数值:
- 时间值: 时间数据的格式进行类型的转化。
- 文本值 :根据字段数据的第一个字符进行比较。
- between … and … 常用于处理:三种字段
/* **********************************************************************
(2) 进行 BETWEEN 数据的查询, 用来查询在两个值的数据类型: 值:可以是数字、时间,文本。
* ***********************************************************************/
SELECT
*
FROM
emp
WHERE
HIREDATE BETWEEN to_date('1981-01-02 00:00:00','yyyy-mm-dd hh24:mi:ss')
and to_date('1981-12-02 00:00:00','yyyy-mm-dd hh24:mi:ss'); -- 时间格式: 进行数据的查询。
AND
(DEPTNO not BETWEEN 10 and 20) -- 查询数字字段时,实例
AND
empno not in (1001, 1007, 1008)
AND
job not BETWEEN 'S' AND 'T'; -- 后面是文本值时: 只查看第一个字节。记得使用单引号进行数据是引用。
- Oracle数据库按照时间中: 天, 周, 月, 季度, 年: (扩展)
获取某一天的数据
select clumn_name as 设备,clumn_time 时间 from device d where clumn_time between to_date('2010-9-27 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2010-9-27 23:59:59','yyyy-mm-dd hh24:mi:ss')
//返回当天的数据
select clumn_name as 设备,clumn_time 时间 from device d where clumn_time between to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd hh24:mi:ss') and sysdate;
–按照每月进行统计
select to_char(sysdate,'mm') from dual group by to_char(sysdate,'mm')
–按照每季度进行统计
select to_char(sysdate,'q') from dual group by to_char(sysdate,'q')
–按照每周度进行统计
select to_char(sysdate,'ww') from dual group by to_char(sysdate,'ww')
–按照每年进行统计
select to_char(sysdate,'yyyy') from dual group by to_char(sysdate,'yy')
6: 取别名:as
- (1): as 使用情况:
- 在查询中涉及和超过了一个表(建立两张表的相同字段)
- 在查询过程中使用了函数
- 列名称很长或者可读性差
- 需要把两个或者多个列结合到一起
- (2):as 作用
- 用来给 列名或者 表名进行 取别名。
7: SQL 中的约束(Constrainsts)
SQL 中的约束, 用于指定表中的规则:
- 如果违反约束的数据行为, 行为会被约束终止。
- 约束可以在创建表规定(create table 语句), 或者创建之后规定(alter table 语句)
SQL 语句中的约束
NOT NULL :指定某列不能存储 NULL 值
UNIQUE : 保证某列的某行必须有唯一的值
撤销 unique 修饰:
alter table table_name drop index column_name
MYSQL
alter table table_name drop constrait column_name
OralcePrimary Key : 和 NOT NULL 和 UNIQUE 的结合, 确保某列有唯一 标识, 有助于特定的记录。
主键必须包含唯一的值
主键列不能包含 NULL 值
每一个表都应该有一个主键, 并且每一个表中只能有一个主键。
Foreign key : 保证一个表中的数据匹配另一个表中的值的参照完整性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FklYla3y-1588677786872)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200504212354304.png)]
create table table_name1 ( column_name1 int not null primary key, column_name2 int not null, column_name3 varchar(256), -- 外键的插入, 关联另一张表。 column_name4 foreign key references table_name2(column_name4); -- 关键字: foreign key references z ) -- 添加外键约束:(Oracle)(命名已经存在 ) alter table table_name1 add constraint column_name foreign key (p_id) references table_name2(p_id), -- 删除外键约束(Oracle) alter table table_name1 drop constraint column_name; -- 添加外键约束:(Mysql) -- 删除外键约束(Mysql)
Check : 保证列中的值符合指定的条件
Default : 规定没有给列赋值时的默认值。
每个表可以有多个 unique, 但是只能有一个 primary Key
8: 创建索引
- 创建索引的语句:create Index
- 作用: 在不读区整个表的情况下, 索引时数据库应用程序可以更快的查找数据
- 索引:
- 在表中创建索引, 以便可以更加高效的查询数据
- 注意: 更新一个包含索引的表需要比更新一个没有索引的表书费的时间长, 因为由于索引本更新也需要时间
- 因此理想的做法是: 在需要搜索的列上创建索引。
-- 在表中创建一个简单的索引(使用时, 允许重复) create index index_name on table_name(column_name) -- 在表上创建一个唯一的索引: --1: 不允许使用重复值 --2: 唯一的索引意味: 两个行不能拥有相同的索引值。 create unique index index_name on table_name(column_name) -- 在一个已经创建的表中添加索引 create index Pindex_name on table_name(column_name1, column_name2); -- 删除表中的索引: alter table table_name drop index index_name; -- 删除数据库中的表 drop table table_name; -- 删除表中的数据, 并不删除表结构 truncate table;
9: 对表进行修改
1: 在表中进行添加列:
alter table table_name add column_name datatype;
2: 删除表中的列
alter table table_name drop column column_name
3: 修改列名
alter table table_name modify column column_name datatype
10: 在 SQL 语句中的关键字:auto-increment
- 在 新的记录中插入表中时,生成一个唯一的数字
- 在每次插入新的记录时,自动地创建主键字段的值。(auto-increment)字段
create table table_name ( ID int not null auto_increment, -- 初始值是 1, 没插入一条数据时, 递增。 LastName varchar(255) not null, FirstName varchar (255), Address varchar(255), City varchar(255), Primary Key(ID) ) -- ************************************************************************* -- Oracle 中的 序列号 -- 必须通过 sequence 对象(该对象生成数字序列)创建 auto-increment字段 -- 使用下面的 create sequence 语法 create sequence seq_person MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10 -- 上面的代码解释 创建了一个名为 seq_person 的对象, 它以 1 起始且以 1 递增, 该对象缓存 10 个值,以提高性能,cache 选项规定为了提高访问速度要存储 多少个序列值。 -- *************************************************************************
11: 视图 view
- 可视化的表
- 在 SQL 语句的结果集的可视化的表。包含行和列, 就像一个真实的表。
- 视图中的字段来自一个或者多个数据库中的真是的表中的字段。
- 可以向视图中添加 SQL 函数, WHERE 以及 JOIN 语句, 也可以呈现数据, 就像一个单一的表一样。
可以进行:
- 创建视图
- 更新视图
- 销毁视图
12: 时间函数
- 常用的三个函数
- now() : 最近时间
- curdate(); 最近日期
- curtime(); 最近时间
- EXTRACT() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
CREATE TABLE Orders ( OrderId int NOT NULL, ProductName varchar(50) NOT NULL, OrderDate datetime NOT NULL DEFAULT NOW(), -- 默认插入到 时间是 now(); PRIMARY KEY (OrderId) ) ----- SELECT EXTRACT(YEAR FROM OrderDate) AS OrderYear, EXTRACT(MONTH FROM OrderDate) AS OrderMonth, EXTRACT(DAY FROM OrderDate) AS OrderDay, FROM Orders WHERE OrderId=1
- 时间处理函数
1: DATE_ADD() 函数向日期添加指定的时间间隔。 DATE_ADD(date,INTERVAL expr type) 2: DATE_SUB() 函数从日期减去指定的时间间隔。 DATE_SUB(date,INTERVAL expr type) 3: 返回两个日期之间的天数 DATEDIFF(date1,date2) 4:DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。 DATE_FORMAT(date, format)
三: 练习查询语句
/****************************************************
Oracle中 SQL语句的基本上使用
*****************************************************/
select * from emp;
select deptno from emp;
/* *******************
(1) 插入全部的数据
* *******************/
INSERT INTO
emp--(EMPNO, ENAME, "JOB", MGR, HIREDATE, sal, COMM, DEPTNO)
VALUES
(1008,'wang', 'yong', 1006, NULL, 1002, 1000, 20);
/* *****************************
(2) 执行更新某个字段的 SQL 命令
* ******************************/
UPDATE
EMP
SET
DEPTNO = 30
WHERE
EMPNO = 1001;
/* *****************************
(3) detele 进行某个字段的删除
* ******************************/
DELETE FROM
EMP
WHERE
empno=1008;
/* *****************************
(4) SQl 函数的调用
* ******************************/
SELECT
AVG(DEPTNO) as orderAverage
FROM
emp
WHERE
ROWNUM <= 10;
/* *****************************
(5) 进行 top 数据的查询
* ******************************/
SELECT
top 2 * DEPTNO
FROM
emp
WHERE
ROWNUM <= 10; -- Oracle 的语法。
SELECT * FROM emp LIMIT 5; -- MYSQL 的语法。
select * from emp;
/* *****************************
(6) 进行 like 数据的查询
* ******************************/
SELECT
ENAME, EMPNO, DEPTNO
FROM
EMP
WHERE
ENAME not like '%2%';
/* **********************************************************************
(7) 进行 in 数据的查询, 字段中包含的数据信息。用来查询特定的字段
* ***********************************************************************/
SELECT
*
FROM
EMP
WHERE
DEPTNO not IN (20, 30); --等同于:DEPTNO=20 or DEPTNO = 30;
/* **********************************************************************
(8) 进行 BETWEEN 数据的查询, 用来查询在两个值的数据类型: 值:可以是数字、时间,文本。
* ***********************************************************************/
SELECT
*
FROM
emp
WHERE
HIREDATE BETWEEN to_date('1981-01-02 00:00:00','yyyy-mm-dd hh24:mi:ss')
and to_date('1981-12-02 00:00:00','yyyy-mm-dd hh24:mi:ss'); -- 时间格式: 进行数据的查询。
AND
(DEPTNO not BETWEEN 10 and 20) -- 查询数字字段时,实例
AND
empno not in (1001, 1007, 1008)
AND
job not BETWEEN 'S' AND 'T'; -- 后面是文本值时: 只查看第一个字节。记得使用单引号进行数据是引用。
/* **********************************************************************
(9) 进行 取别名 数据的查询, 关键字: as
* ***********************************************************************/
SELECT
ename
FROM
emp as name;
/****************************************************
(10): 连接的拼接使用
*****************************************************/
SELECT
*
from
emp FULL JOIN dept on emp.deptno = dept.deptno -- 把表中数据全部显示出来。
ORDER BY
EMP.DEPTNO ASC;
/****************************************************
(11): 进行数据修改
*****************************************************/
update
DEPT
set
DEPT.DEPTNO = 40
where
DEPT.DEPTNO = 30;
/****************************************************
(12): UNION 进行重复数据的整合
*****************************************************/
SELECT DEPTNO from EMP
UNION all -- 查询的数据中可以有重复值, union: 不可以有重复值
SELECT DEPTNO from dept
order BY DEPTNO asc;
show databases;
/****************************************************
(13): Oracle表的建立
*****************************************************/
CREATE TABLE Student
(
PersonID int UNIQUE,
LastName varchar(255) NOT NULL,
FirstName VARCHAR(255),
Address VARCHAR(255),
City VARCHAR(255)
);
DROP table student;
select * from STUDENT;
/****************************************************
(14): Oracle中查询时间的函数
*****************************************************/
select now(), curdate(), curtime();
/****************************************************
(15): Oracle中查询45天之后的时间函数
*****************************************************/
SELECT
DATE_ADD(hiredate, INTERVAL 45 DAY) AS new_day
FROM
emp
WHERE
empno = 7369;
/****************************************************
MYSQL 语句的基本上使用
*****************************************************/
SELECT
*
FROM
emp
limit 5;
/******************************************************************************
(16) as :为 列名和表名进行取别名(mysql 中可以为table 取别名), oracle 不可以。
*******************************************************************************/
SELECT
-- deptno, ename+','+job as na -- column_name 进行取别名
`name`.deptno, `name`.empno, name2.loc
FROM
emp as name,dept as name2 -- table_name : 进行取别名
WHERE
`name`.deptno = name2.deptno;
/****************************************************
(17): 连接的拼接使用
*****************************************************/
SELECT
*
from
emp RIGHT JOIN dept on emp.deptno = dept.deptno; -- 把右边表中数据全部显示出来。
create view emp_empt as select * from emp full join dept on emp.deptno=dept.deptno;
select now(), curdate(), curtime();
/****************************************************
(18): 创建表的过程
*****************************************************/
create table consume
(
-- P_ID int auto_increment,
Name VARCHAR(255)not null PRIMARY KEY,
Morning int ,
Afternoon int ,
Evening int
);
select (morning+afternoon+evening) as consume1 from consume;
/****************************************************
(19): 时间的分解查询
*****************************************************/
SELECT EXTRACT(YEAR FROM hireDate) AS OrderYear,
EXTRACT(MONTH FROM hireDate) AS OrderMonth,
EXTRACT(DAY FROM hireDate) AS OrderDay,
FROM emp
WHERE empno=7369;