第二阶段1-数据库一(oracle)

3 篇文章 0 订阅
1 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


Oracle数据库(卸载,基础使用)

一、卸载

1、搜索 服务

在这里插入图片描述

2、找到安装位置

(D:\Oracle11g\product\11.2.0\dbhome_1\oui\bin)
在这里插入图片描述
找到文件双击执行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、删除注册表指定的key(一定不要删错)

在这里插入图片描述
搜索注册表编辑器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、删除环境变量

系统变量path中以oracle开头的删掉,没有就不删了

5、找到oracle的安装目录进行删除

在这里插入图片描述
有时候提示删不掉,重启电脑再删就好了

二、基础使用

新建连接:oracle
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


可视化工具:(有自带的,但是版本太低,可以手动安装一个Sqldevelope)
在这里插入图片描述
在这里插入图片描述

基本上没人用,都用navcat

三、NavCat15

安装教程

数据库sql知识点

一、表和约束

1.什么是表

数据库中存储数据的元素称之为表。是一个有结构的数据的集合。是整个数据库系统的基础。

2.创建表

2.1 基本语法
create table 表名(
	列名1 类型,
	列名2 类型,
	列名3 类型
)
--创建表的时候,列名和列名之间需要使用逗号隔开,但是最后一列无需逗号
2.2 数据类型

1、char(n):n的取值范围是1到2000

​ 描述:定义的字符串,n代表的是字节长度,如果不指定长度,缺省为1个字节。

2、varchar2(n):n的取值范围是1到4000

​ 描述:定长字符串。这种数据类型可以存储数字,字母,ASCII码字符集。如果存储的数据长度没有达到最大值n。oracle可以根据存储数据的大小自动调整字段的长度。如果存储的数据前后存在空格,oracle会自动的将其删除。

3、number(m,n):m的取值范围是1到38。n的取值范围是-84到127

​ 描述:可变长度的数值列。允许为0,正数,负数。m代表的存储数据的所有有效数字的位数。n是表示小数点后的位数,如果数据超过了有效位数就会截取多余的位数。

4、date:没有参数

​ 描述:可以存储公元前4712年1月1日到公元4712年12月31日。默认格式:DD-MON-YY:18-04-22

5、long:没有参数

​ 描述:可变长度的字符列。最大存储量为2GB。一般用于存储不需要检索的长串数据。

6、raw(n):n的取值范围是1到2000

​ 描述:可变长的二进制数据。一般用于存储比较小的文件或者图片。

7、long raw:没有参数

​ 描述:可变长的二进制数据,最大容量为2GB。一般存储比较大的文件或者图片。

8、blob:没有参数

​ 描述:存储特大数据。最大4GB。

2.3 创建表实例
create table student(
	stuid varchar2(20),
	stuname char(10),
	stuphone number(12),
	stuclasses varchar2(50)
)

3.操作表结构

3.1 添加列
--添加一列
ALTER TABLE STUDENT ADD(JAVASCORE NUMBER(3,1))
--添加多列
ALTER TABLE STUDENT ADD(CSCORE NUMBER(4,1),PYTHONSCORE NUMBER(4,1))
3.2 删除列
oracle:
--删除一列
ALTER TABLE STUDENT DROP(JAVASCORE)
--删除多列
ALTER TABLE STUDENT DROP(CSCORE,PYTHONSCORE)
mysql:
-- 添加一列
ALTER TABLE student add(score NUMERIC(3,1))

-- 添加多列
ALTER TABLE student add(stuAge NUMERIC(3,0),stuAddr NUMERIC(10,0))

-- 删除一列
ALTER TABLE student DROP score

-- 删除多列
ALTER TABLE student DROP stuAge,DROP stuAddr;

-- 重命名
ALTER TABLE student RENAME TO stu
3.3 重命名
--对表进行重命名(登录的用户必须是当前库的拥有者)
RENAME STUDENT TO STU;

4.约束

4.1 主键约束(要求非空且唯一)

一张表只能有一个主键

eg:身份证号,既保证没有重复数据,又保证了不空

--主键约束
--ALTER TABLE 表名 ADD CONSTRAINT 主键名(PK_列名)  PRIMARY KEY(列名)
ALTER TABLE STUDENT ADD CONSTRAINT PK_STUID PRIMARY KEY(STUID)
4.2 唯一约束

只保证该列没有重复数据

--唯一约束
ALTER TABLE STUDENT ADD CONSTRAINT UQ_STUPHONE UNIQUE(STUPHONE)
mysql:
-- 主键约束
-- 创建表后添加主键约束:alter table 表名 add primary key 列名;
-- 删除主键约束:alter table 表名 drop primary key;
ALTER TABLE stu ADD PRIMARY KEY(stuID)
-- 唯一键(即电话号码不可重复)
ALTER TABLE stu ADD UNIQUE(stuPhone)
4.3 默认约束
--默认约束
ALTER TABLE STUDENT MODIFY SRUCLASSES DEFAULT '无班级'

mysql:
-- 创建表时添加默认约束:CREATE TABLE 表名( 列名 数据类型 DEFAULT 默认值, … );
-- 建完表后添加默认约束:alter table 表名 alter  列名 set default 默认值;
-- 删除约束:alter table 表名 alter 列名 drop default;

4.4 检查约束
--检查约束
ALTER TABLE STUDENT ADD CONSTRAINT CK_AGE CHECK(STUAGE BETWEEN 20 AND 50)
4.5 非空约束
oracle:
CREATE TABLE TEST(
	TID VARCHAR2(20) PRIMARY KEY,
	TNAME VARCHAR2(30) NOT NULL
)
---------------------------------------------
mysql:
-- 非空约束
CREATE TABLE TEACHER(
    TID VARCHAR(20) PRIMARY KEY,
    TNAME VARCHAR(20) NOT NULL
)
-- 最外面的括号之后加不加分号都可以
4.6外键约束
--外键约束
--ALTER TABLE 主表 ADD CONSTRAINT 外键名  FOREIGN KEY (列名) REFERENCES 从表(列名(必须是从表的主键))
ALTER TABLE PERSON ADD CONSTRAINT FK_PC FOREIGN KEY (PERSONCARD) REFERENCES CAED (personcard)
-- 外键用来让两个表的数据之间进行连接,保证数据的一致性和完整性。
-- 创建表时添加外键约束:CREATE TABLE 表名( 列名 数据类型, … [CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名) );
-- 创建表后添加外键约束:
-- ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
-- 删除外键约束:alter table 表名 drop foreign key 外键名称;

-- 外键约束
ALTER TABLE stu ADD CONSTRAINT FK_PC FOREIGN KEY(CID) REFERENCES class(CID)

二、SQL语言基础

1.SQL的介绍

sql:结构化查询语言。简称为sql。是一种存在特殊目的的编程语言,目的就是对数据库进行操作以及对数据进行操作。sql分为四类:DML,DCL,DDL,DQL

DML:数据操作语言。update,insert,delete

DCL:数据控制语言。赋权等操作

DDL:数据定义语言。create,alter,drop等操作

DQL:数据查询语言。select

有时候会把DQL归类到DDL里面

2.⭐DML操作

--创建表
CREATE TABLE EMP (
	EMPID VARCHAR2(10) PRIMARY KEY,--主键
	EMPNAME VARCHAR2(10) NOT NULL,--非空
	EMPPHONE NUMBER(11) UNIQUE,--唯一
	EMPAGE NUMBER(3)
)
--添加字段
ALTER TABLE EMP ADD ADDRESS VARCHAR2(50);
ALTER TABLE EMP ADD EMPGENDER VARCHAR2(10);
--添加默认约束
ALTER TABLE EMP MODIFY ADDRESS DEFAULT '地址不详';
--insert语句
--语法:insert into 表名 (字段名...) values (值....)
INSERT INTO EMP (EMPID,EMPNAME,EMPPHONE,EMPAGE,ADDRESS,EMPGENDER) VALUES ('1001','林立',13121273669,22,'缅北','男')
INSERT INTO EMP (EMPID,EMPNAME,EMPPHONE,EMPAGE,ADDRESS,EMPGENDER) VALUES ('1002','有博园',13121273668,22,null,'男')
INSERT INTO EMP (EMPID,EMPNAME,EMPPHONE,EMPAGE,EMPGENDER) VALUES ('1003','季木吉',13121273648,22,'男')
--update语句
--语法 : update 表名 set 字段名=字段值
UPDATE EMP SET ADDRESS='海淀'
--where关键字
--需求:把名字叫林立的地址改成河南南阳
UPDATE EMP SET ADDRESS='河南南阳' WHERE EMPNAME = '林立'
--把年龄大于23岁的员工的性别改为女
UPDATE EMP SET EMPGENDER = '女' WHERE EMPAGE > 23
--把年龄在18到23之间的地址改成北京朝阳
--AND: 条件1 and 条件2  需要两个条件都成立
UPDATE EMP SET ADDRESS='北京朝阳' WHERE EMPAGE>18 AND EMPAGE<23
--BETWEEN num1 AND num2 前后都包含 
UPDATE EMP SET ADDRESS='北京房山' WHERE EMPAGE BETWEEN 18 AND 23
--把年龄大于20并且性别为女的员工的地址改成河南郑州
UPDATE EMP SET ADDRESS='河南郑州' WHERE EMPAGE>20 AND EMPGENDER='女'
--OR:条件1 OR 条件2  只要有一个条件成立就可以
--把年龄小于23或者性别为女的地址改成河北石家庄
UPDATE EMP SET ADDRESS='河北石家庄' WHERE EMPAGE<23 OR EMPGENDER = '女'
--把来自石家庄以外的员工年龄+2岁
UPDATE EMP SET EMPAGE=EMPAGE+2 WHERE ADDRESS != '河北石家庄'
--delete语句
--语法:delete from 表名 条件语句
--删除年龄等于25岁并且来自于北京房山的员工
DELETE FROM EMP WHERE EMPAGE=25 AND ADDRESS='北京房山'
--select语句
--语法:select 字段名(列名 *表示所有字段) from 表名 查询条件
--查询所有的员工信息
SELECT * FROM EMP
--查询所有的员工姓名
SELECT EMPNAME FROM EMP
--查询年龄大于20并且性别为男并且来自石家庄的员工信息
SELECT * FROM EMP WHERE EMPAGE>20 AND EMPGENDER='男' AND address='河北石家庄'
--查询性别为空的员工
SELECT * FROM EMP WHERE EMPGENDER IS NULL
--查询性别不为空的员工
SELECT * FROM EMP WHERE EMPGENDER IS NOT NULL
--AS 表名
SELECT EMPID,EMPNAME,EMPPHONE,EMPAGE,ADDRESS FROM EMP
SELECT EMPID AS 编号,EMPNAME AS 姓名,EMPPHONE AS 手机号,ADDRESS AS 地址 FROM EMP
--统计语句
--统计本公司员工总数
SELECT COUNT(*) AS 员工总数 FROM EMP  
--统计本公司男员工的个数
SELECT COUNT(*) AS 男工总数 FROM EMP  WHERE EMPGENDER='男'

三、数据库设计三范式

1.第一范式(确保每列数据保持原子性)

第一范式是最基本的范式,如果数据库中所有的字段都是不可再被分解的原子值,说明该数据库设计符合第一范式。

错误案例:

编号姓名性别家庭住址
1001张三河南南阳方城
1002李四山东菏泽曹县
1003王二北京海淀四季青镇

正确案例:

编号姓名性别省份城市详细地址
1001张三河南南阳方城
1002李四山东菏泽曹县
1003王二北京海淀四季青镇
2.第二范式(确保表中的每列数据都和主键相关)

第二范式是建立在第一范式的基础上,第二范式需要确保数据库中表的每一列都和主键相关,而不是和主键的某一部分相关(联合主键)。 翻译成白话就是:数据库中的表只能存储一种数据,不能把多种数据存储在同一张表中

错误案例:

订单表

订单编号商品编号商品名称商品单价客户名称收货地址
10012001苹果5季木吉河南南阳
10022002羊腰子30有博园河南商丘
10032003假账本1林立河北石家庄

真确案例:

客户信息表

用户编号用户名称省份详细地址
3001季木吉河南
3002有博园河南
3003林立河北

商品信息表

商品编号商品名称商品单价
2001苹果5
2002羊腰子30
2003假账本1

订单表

订单编号订单时间支付方式商品编号用户信息编号
10012020-12-12支付宝20013001
10022020-11-11支付宝20023002
10032022-02-02微信20033003
10042020-020-01支付宝20023003
3.第三范式(确保每列数据都和主键直接相关)

第三范式需要确保数据库中表中每一列数据都和主键之间之间相关而不是间接相关。翻译成白话:除主键外的所有字段两两之间不能存在关系。

错误案例:

变产编号户主户主配偶
1001季木吉有博园

正确案例:

房产信息表

房产编号户主编号
10012001

户籍信息表

户籍编号户主名称配偶名称
2001季木吉有博园
4.反三范式

在数据库设计的时候不遵守三范式的规定。在实际开发根据业务需求会设计反三范式的数据库表结构,为了根据业务提高数据库效率。

不良信息编号提供者编号提供的单位名称
10012001工商局
10022002工商局
10032003工商局
提供单位编号提供的单位名称电话
3001工商局13325584545

如果用户需要频繁的通过不良信息编号查找提供的单位名称就可以使用反三范式

四、单表查询

1.简单查询

--语法: select 查询字段(*表示所有) from 表名 [过滤条件]
--查询所有
select * from student
--单条件查询
select * from student where stuname = '张三'
--多条件查询
select * from student where stuname = '李四' and stugender='男' 
select * from student where stugender = '女' or score<60

2.去重

在MySQL和Oracle中,DISTINCT用于从查询结果中去除重复的行,返回唯一的结果。它可以应用于单个列或多个列。

以下是DISTINCT的使用方式:

  1. 单个列的去重:

    • 示例使用方式:
    SELECT DISTINCT column_name FROM table_name;
    

    示例:

    SELECT DISTINCT name FROM customers;
    

    上述查询将返回去除了重复的name列的唯一值列表。

  2. 多个列的去重:

    • 示例使用方式:
    SELECT DISTINCT column1, column2, ... FROM table_name;
    

    示例:

    SELECT DISTINCT name, email FROM customers;
    

    上述查询将返回去除了重复的nameemail列的唯一值组合。

DISTINCT关键字将查询结果中的重复行去除并返回唯一的数据。它适用于任何查询,包括SELECT语句中的单个表查询、多表连接查询以及子查询等场景。

需要注意的是,DISTINCT在操作大量数据时可能会对性能产生一定的影响。因此,对于大型数据集,应谨慎使用DISTINCT。另外,DISTINCT操作是针对整个行的,而不是仅限于某一列,所以它消耗的资源可能比预期要多。

--查看所有学生的班级
SELECT DISTINCT SUBCLAUSES  from student 

3.投影查询

MySQL和Oracle中都支持集合操作,包括并集(UNION)、交集(INTERSECT)和差集(MINUS/EXCEPT)的求解,但它们的语法和特性有一些区别。

  1. 并集(UNION):

    • MySQL中的并集使用UNION关键字,它将两个或多个查询结果合并为一个结果集,并去除重复的行。
    • 示例使用方式:
    SELECT column1, column2, ... FROM table1
    UNION
    SELECT column1, column2, ... FROM table2;
    

    示例:

    SELECT name FROM customers
    UNION
    SELECT name FROM suppliers;
    

    Oracle中的并集使用UNION ALL关键字,它将两个或多个查询结果合并为一个结果集,包括重复的行。
    示例使用方式:

    SELECT column1, column2, ... FROM table1
    UNION ALL
    SELECT column1, column2, ... FROM table2;
    

    示例:

    SELECT name FROM customers
    UNION ALL
    SELECT name FROM suppliers;
    

    区别:MySQL和Oracle在并集语法上有所不同,MySQL的UNION会去除重复行,而Oracle的UNION ALL保留所有行,包括重复的行。

  2. 交集(INTERSECT):

    • MySQL不直接支持INTERSECT操作。可以利用子查询和INNER JOIN等方法来实现交集操作。
    • Oracle中支持INTERSECT操作,可以使用INTERSECT关键字对两个查询结果进行交集运算。
      示例使用方式:
    SELECT column1, column2, ... FROM table1
    INTERSECT
    SELECT column1, column2, ... FROM table2;
    

    示例:

    SELECT name FROM customers
    INTERSECT
    SELECT name FROM suppliers;
    
  3. 差集(MINUS/EXCEPT):

    • MySQL不直接支持MINUS/EXCEPT操作。可以使用子查询和NOT IN、LEFT JOIN等方法来求解差集。
    • Oracle中支持MINUS(也可以使用EXCEPT关键字),可以使用MINUS关键字对两个查询结果进行差集运算。
      示例使用方式:
    SELECT column1, column2, ... FROM table1
    MINUS
    SELECT column1, column2, ... FROM table2;
    

    示例:

    SELECT name FROM customers
    MINUS
    SELECT name FROM suppliers;
    

需要注意的是,MySQL和Oracle在集合操作的语法上存在差异,部分操作在某个数据库中可能不直接支持,需要利用其他方式来求解。此外,MySQL和Oracle对于重复行的处理也有不同的策略。

Oracle:
--投影查询 并集操作
SELECT * FROM STUDENT WHERE SRUCLASSES='S9'
UNION ALL
SELECT * FROM STUDENT WHERE STUAGE<26
--投影查询 交集
SELECT * FROM STUDENT WHERE SRUCLASSES='S9'
INTERSECT
SELECT * FROM STUDENT WHERE STUAGE<26
--投影查询 差集
SELECT * FROM STUDENT WHERE SRUCLASSES='S9' -- 12   26
MINUS
SELECT * FROM STUDENT WHERE STUAGE<26  --26
--最后结果以第一条的查询结果为基准,剩余1

SELECT * FROM STUDENT WHERE STUAGE<26  
MINUS
SELECT * FROM STUDENT WHERE SRUCLASSES='S9'  


----------------------------------------------------
mysql:
CREATE TABLE EMP (
	EMPID VARCHAR(20) PRIMARY KEY,-- 主键
	EMPNAME VARCHAR(20) NOT NULL,-- 非空
	EMPPHONE INT(15) UNIQUE,-- 唯一
	EMPAGE INT(3)
)

-- 去重
SELECT DISTINCT EMPAGE FROM EMP

-- 投影
-- 并集
SELECT * FROM EMP WHERE EMPAGE>21 
UNION ALL
SELECT * FROM EMP WHERE EMPADDR='北京'

-- 交集
-- 年龄大于20,地址在上海 ,两次查询都出现的结果
SELECT * FROM EMP WHERE EMPAGE>20
INTERSECT
SELECT * FROM EMP WHERE EMPADDR='上海'

-- 差集
-- 查找年龄大于25且地址不在上海的
SELECT * FROM EMP WHERE EMPAGE > 25 AND EMPADDR <> '上海';
-- SELECT * FROM EMP WHERE EMPAGE>25 AND NOT EXISTS ( -- 查到年龄大于25的001,002
-- 	SELECT * FROM EMP WHERE EMPADDR='上海' -- 查到地址在上海的002,004,005
-- )-- 查找年龄大于25且地址不在上海的

-- 选择 EMPAGE 大于 20 的行,并且这些行在 EMPADDR 不等于 ‘上海’ 的行中不存在。
-- SELECT * FROM EMP WHERE EMPAGE>25 NOT IN(
-- 	SELECT * FROM EMP WHERE EMPADDR='上海'
-- )



4.算数运算符

MySQL和Oracle在算术运算符的使用上有一些共同点,也存在一些差异。以下是MySQL和Oracle中常用的算术运算符及其使用方式和差异:

  1. 加法:+
    用于将两个表达式相加,并返回结果。

    在MySQL和Oracle中,加法运算符的使用方式相同。

    SELECT column1 + column2 AS result FROM table_name;
    
  2. 减法:-
    用于从一个表达式中减去另一个表达式,并返回结果。

    在MySQL和Oracle中,减法运算符的使用方式相同。

    SELECT column1 - column2 AS result FROM table_name;
    
  3. 乘法:*
    用于将两个表达式相乘,并返回结果。

    在MySQL和Oracle中,乘法运算符的使用方式相同。

    SELECT column1 * column2 AS result FROM table_name;
    
  4. 除法:/
    用于将一个表达式除以另一个表达式,并返回结果。

    在MySQL和Oracle中,除法运算符的使用方式相同。

    SELECT column1 / column2 AS result FROM table_name;
    
  5. 取模:%
    用于获取两个数相除的余数。

    在MySQL和Oracle中,取模运算符的使用方式相同。

    SELECT column1 % column2 AS result FROM table_name;
    

需要注意的是,MySQL和Oracle在处理除法运算时的行为在某些情况下存在差异:

  • MySQL中,如果除数和被除数都是整数,则返回一个整数结果,舍去小数部分。
  • Oracle中,如果除数和被除数都是整数,则返回一个浮点数结果,保留小数部分。

另外,MySQL和Oracle可能支持其他高级算术运算符和函数,具体取决于数据库版本和配置。您可以参考官方文档或相关教程以了解更多详细信息和用法。

--求员工今年的总薪资
SELECT FIRST_NAME AS 姓名,SALARY*12 AS 年薪 FROM EMPLOYEES
--求每个员工的日薪
SELECT FIRST_NAME AS 姓名,SALARY/22 AS 日薪 FROM EMPLOYEES
--求每个员工的年总收入
SELECT FIRST_NAME AS 姓名,SALARY*12+500 AS 年薪 FROM EMPLOYEES

--mysql----------------------------------------
-- 运算符
-- 每个人的年龄+2
SELECT EMPNAME AS 姓名,EMPAGE+2 AS 新年龄 FROM EMP 

SELECT EMPSALARY AS 薪资 FROM EMP
-- EMPID=001的人薪资加300
SELECT EMPSALARY+300 AS new薪资 FROM EMP WHERE EMPID=001
-- EMPID=001的人薪资-500
SELECT EMPSALARY-500 AS new薪资 FROM EMP WHERE EMPID=001
-- EMPID=001的人薪资除300
SELECT EMPSALARY/300 AS new薪资 FROM EMP WHERE EMPID=001
-- EMPID=001的人薪资乘3
SELECT EMPSALARY*3 AS new薪资 FROM EMP WHERE EMPID=001

5.比较运算符

MySQL和Oracle在比较运算符的使用上有一些共同点,但也存在一些差异。以下是MySQL和Oracle中常用的比较运算符及其使用方式和差异:

  1. 等于:===
    用于检查两个表达式是否相等,如果相等则返回true。

    在MySQL和Oracle中,等于运算符的使用方式相同。

    SELECT * FROM table_name WHERE column_name = value;
    
  2. 不等于:!=<>
    用于检查两个表达式是否不相等,如果不相等则返回true。

    在MySQL和Oracle中,不等于运算符的使用方式相同。

    SELECT * FROM table_name WHERE column_name != value;
    
  3. 大于:>
    用于检查左边的表达式是否大于右边的表达式,如果成立则返回true。

    在MySQL和Oracle中,大于运算符的使用方式相同。

    SELECT * FROM table_name WHERE column_name > value;
    
  4. 小于:<
    用于检查左边的表达式是否小于右边的表达式,如果成立则返回true。

    在MySQL和Oracle中,小于运算符的使用方式相同。

    SELECT * FROM table_name WHERE column_name < value;
    
  5. 大于等于:>=
    用于检查左边的表达式是否大于或等于右边的表达式,如果成立则返回true。

    在MySQL和Oracle中,大于等于运算符的使用方式相同。

    SELECT * FROM table_name WHERE column_name >= value;
    
  6. 小于等于:<=
    用于检查左边的表达式是否小于或等于右边的表达式,如果成立则返回true。

    在MySQL和Oracle中,小于等于运算符的使用方式相同。

    SELECT * FROM table_name WHERE column_name <= value;
    

除了上述常用比较运算符之外,MySQL和Oracle还提供了其他一些特殊的比较运算符,如LIKEINBETWEEN,它们的使用方式在两个数据库中是相同的。

-- 查询名字中含有王的
SELECT *  FROM EMP WHERE EMPNAME LIKE '%王%'
SELECT * FROM table_name WHERE column_name IN (value1, value2, value3, ...);
-- table_name 是您要查询的表名,column_name 是要匹配的列名,value1, value2, value3, ... 是要匹配的值列表。`LIKE`、`IN`和`BETWEEN`是在MySQL中常用的三种查询操作符,它们用于在查询语句中进行模糊匹配、多个值匹配和范围匹配。下面分别介绍它们的使用方法:
  1. LIKE(模糊匹配):
    LIKE运算符用于在查询中进行模糊匹配,可以使用通配符 % 来表示任意字符(包括零个字符)或使用 _ 来表示单个字符。与模式匹配相关的特殊字符使用时需要进行转义。

    示例使用方式:

    SELECT * FROM table_name WHERE column_name LIKE 'pattern';
    

    示例:

    SELECT * FROM customers WHERE last_name LIKE 'Sm%';
    
  2. IN(多个值匹配):
    IN运算符用于在查询中匹配多个固定的值,并且可以与其他查询操作符(如=<>等)结合使用。可以使用逗号分隔多个值。

    示例使用方式:

    SELECT * FROM table_name WHERE column_name IN (value1, value2, value3, ...);
    

    示例:

    SELECT * FROM customers WHERE country IN ('USA', 'Canada', 'Mexico');
    
  3. BETWEEN(范围匹配):
    BETWEEN运算符用于在查询中匹配一个范围内的值,包括指定的最小值和最大值。

    示例使用方式:

    SELECT * FROM table_name WHERE column_name BETWEEN value1 AND value2;
    

    示例:

    SELECT * FROM orders WHERE order_date BETWEEN '2022-01-01' AND '2022-12-31';
    

此外,这些运算符也可以与其他条件运算符(如ANDOR等)一起使用,以构建更复杂的查询条件。

需要注意的是,不同数据库系统对于特殊情况下处理比较运算符的方式可能有所差异,例如对于空值(NULL)的处理等。因此,在使用比较运算符时,建议查阅相关数据库的官方文档以确保正确使用。

--oracle中:  <   <=   >   >=    =    !=    <>
--查询员工非SA_REP和非SH_CLERK职位的员工
SELECT FIRST_NAME,JOB_ID FROM EMPLOYEES WHERE JOB_ID<>'SA_REP' AND JOB_ID<>'SH_CLERK'
SELECT FIRST_NAME,JOB_ID FROM EMPLOYEES WHERE JOB_ID!='SA_REP' AND JOB_ID!='SH_CLERK'

6.逻辑运算符

--查询月薪大于1W并且职位是FI_MGR员工信息
SELECT * FROM EMPLOYEES WHERE SALARY>=10000 AND JOB_ID='FI_MGR'
--查询薪资大于1W或者是位置为PU_MAN的员工信息
SELECT * FROM EMPLOYEES WHERE SALARY>=10000 OR JOB_ID='PU_MAN'
--不属于SA_REP的员工信息
SELECT * FROM EMPLOYEES WHERE JOB_ID!='SA_REP'
SELECT * FROM EMPLOYEES WHERE NOT JOB_ID='SA_REP'

在MySQL和Oracle中,逻辑运算符用于对布尔表达式进行逻辑操作,常见的逻辑运算符包括ANDORNOT

  1. AND运算符:

    • 在MySQL和Oracle中,AND运算符可用于同时满足多个条件的情况。当所有条件都为真时,AND运算符返回真;只要有一个条件为假,AND运算符返回假。
    • 示例使用方式:
    SELECT * FROM table_name WHERE condition1 AND condition2;
    
  2. OR运算符:

    • 在MySQL和Oracle中,OR运算符用于满足多个条件中的至少一个条件的情况。只要有一个条件为真,OR运算符返回真;只有所有条件都为假,OR运算符才返回假。
    • 示例使用方式:
    SELECT * FROM table_name WHERE condition1 OR condition2;
    
  3. NOT运算符:

    • 在MySQL和Oracle中,NOT运算符用于取反条件的结果。如果条件为真,则NOT运算符返回假;如果条件为假,则NOT运算符返回真。
    • 示例使用方式:
    SELECT * FROM table_name WHERE NOT condition;
    

MySQL和Oracle在使用逻辑运算符时没有太大的区别。它们的语法和行为基本相同,可以在查询语句中灵活应用这些运算符来满足特定的需求。

7.BETWEEN AND

--查询薪资在1W到1W5之间的员工姓名和薪资
SELECT FIRST_NAME,SALARY FROM EMPLOYEES WHERE SALARY BETWEEN 10000 AND 15000
SELECT FIRST_NAME,SALARY FROM EMPLOYEES WHERE SALARY>=10000 AND SALARY<=15000
--查询员工的第2条到第5条数据
-- ROWNUM可以添加编号
SELECT ROWNUM,FIRST_NAME,SALARY FROM EMPLOYEES 
-- ROWNUM R  :ROWNUM的别名是R
-- 子查询
SELECT * FROM (SELECT ROWNUM R,FIRST_NAME,SALARY FROM EMPLOYEES) WHERE R BETWEEN 2 AND 5

8.ORDER BY排序

在SQL中,升序(ascending)和降序(descending)用于指定查询结果的排序方式。升序表示按照指定列的值从小到大进行排序,而降序则表示按照指定列的值从大到小进行排序。

以下是在SELECT语句中使用升序和降序排序的示例:

  1. 升序排序(ASC,默认排序方式):

    • 示例使用方式:
    SELECT column1, column2, ... FROM table_name ORDER BY column_name ASC;
    

    示例:

    SELECT name, age FROM customers ORDER BY age ASC;
    

    上述查询将按照age列的值从小到大进行升序排序。

  2. 降序排序(DESC)

    • 示例使用方式:
    SELECT column1, column2, ... FROM table_name ORDER BY column_name DESC;
    

    示例:

    SELECT name, age FROM customers ORDER BY age DESC;
    

    上述查询将按照age列的值从大到小进行降序排序。

需要注意的是,ORDER BY子句通常用于SELECT语句的末尾,以便在查询结果返回之前对其进行排序。可以对多个列进行排序,并按照多个列的顺序指定排序方式。

示例:

SELECT name, age, salary FROM employees
ORDER BY age ASC, salary DESC;

上述查询将先按照age列的升序排序,然后对于相同age值的行,再按照salary列的降序排序。

--根据薪资对员工进行排序
--ASC 升序  默认的 DESC 降序
SELECT * FROM EMPLOYEES ORDER BY SALARY DESC
--求公司薪资的前五名的员工信息
SELECT * FROM (SELECT ROWNUM R,EMP.* FROM (SELECT * FROM EMPLOYEES ORDER BY SALARY DESC) EMP) WHERE R BETWEEN 3 AND 5 

-- LIMIT 2, 3表示从结果集的第3行开始(从0开始计数),取出后面的3行数据。
-- 所以,这个查询语句的含义是:从EMP表中选择所有的列,按照EMPSALARY列的降序对结果进行排序,然后从第3行开始取出后面的3行数据。前面的数据是索引位置,后面面代表查几个数据
SELECT * FROM 
    (SELECT * FROM EMP ORDER BY EMPSALARY DESC) AS 新的
LIMIT 2, 3;

9.IN和NOT IN

--查询薪资不是1w1 1w7  2200的员工信息
SELECT * FROM EMPLOYEES WHERE SALARY NOT IN (11000,17000,2200)
--查询薪资和 David Bernstein以及Steven Markle一样的员工信息
SELECT * FROM EMPLOYEES WHERE SALARY IN (SELECT SALARY FROM EMPLOYEES WHERE (FIRST_NAME='David' AND LAST_NAME='Bernstein') OR (FIRST_NAME='Steven' AND LAST_NAME='Markle'))
--查询薪资和 David Bernstein以及Steven Markle一样的员工信息并且不包含此两位
SELECT * FROM (
    SELECT * FROM EMPLOYEES WHERE SALARY IN (
        SELECT SALARY FROM EMPLOYEES 
        WHERE (FIRST_NAME='David' AND LAST_NAME='Bernstein') 
        OR
        (FIRST_NAME='Steven' AND LAST_NAME='Markle'))) 
    WHERE NOT 
        (FIRST_NAME='Steven' AND LAST_NAME='Markle') 
    AND NOT 
        (FIRST_NAME='David' AND LAST_NAME='Bernstein')

-- 查询薪资和 张三以及李四一样的员工信息并且不包含此两位
SELECT * FROM EMP WHERE EMPSALARY IN
		(SELECT EMPSALARY FROM EMP WHERE EMPNAME IN('张三','李四') )-- 8000,10000
-- 	以上两句找到了所有薪水和张三李四一样的人的信息
 AND EMPNAME NOT IN('张三','李四')-- 排除张三和李四

10.模糊查询

模糊查询在MySQL和Oracle两个数据库中的语法有一些区别。下面将介绍MySQL和Oracle中的模糊查询语法及其区别:

MySQL模糊查询:
在MySQL中,我们可以使用LIKE关键字配合通配符进行模糊查询。通配符包括百分号 % 和下划线 _

SELECT * FROM table_name
WHERE column_name LIKE pattern;

在上述语法中,table_name是表名,column_name是要匹配的列名,pattern是要匹配的模式。通配符%代表任意字符序列,下划线_代表任意单个字符。

例如,在MySQL中搜索包含"张"的名字:

SELECT * FROM EMP 
WHERE EMPNAME LIKE '%张%';

Oracle模糊查询:
在Oracle中,我们可以使用LIKE关键字配合通配符进行模糊查询。通配符包括百分号 % 和下划线 _

SELECT * FROM table_name
WHERE column_name LIKE pattern ESCAPE 'escape_character';

%:匹配任意字符任意次; _ : 匹配任意字符一次

在上述语法中,table_name是表名,column_name是要匹配的列名,pattern是要匹配的模式,escape_character是可选的转义字符。

在Oracle中,还引入了转义字符(escape character)的概念。转义字符用于转义通配符本身。默认情况下,反斜杠 \ 是转义字符,但您可以使用ESCAPE关键字指定其他字符作为转义字符。

例如,在Oracle中搜索包含"张"的名字:

SELECT * FROM EMP 
WHERE EMPNAME LIKE '%张%' ESCAPE '\';

尽管在模糊查询方面,MySQL和Oracle使用相似的语法,但在其他方面仍然存在一些差异。这些差异可能涉及功能、性能和优化方面的细节,因此请根据所使用的数据库类型进行相应的查询语法和优化。

-- 查询姓王的并且名字长度为2的信息
SELECT * FROM EMP WHERE EMPNAME LIKE '王_'
-- 注意:varchar类型的数据会自动识别字符长度,char类型的数据不会

五、函数

--获取字符的ASCII的值,DUAL是oracle数据库中的虚拟表
SELECT ASCII('A') FROM DUAL;
--字符串拼接
SELECT CONCAT('有博园','是个大怨种') FROM DUAL;
--INSTR(x,y) 从x中查找y的位置。 从1开始计算, 不存在返回0
SELECT EMPLOYEE_ID,INSTR(FIRST_NAME,'s') FROM EMPLOYEES;
--获取长度
SELECT EMPLOYEE_ID,FIRST_NAME,LENGTH(FIRST_NAME) FROM EMPLOYEES;
--转换小写
SELECT LOWER(FIRST_NAME) FROM EMPLOYEES
--转换大写
SELECT UPPER(FIRST_NAME) FROM EMPLOYEES
--TRIM( X FROM Y) 去除y首尾的x
SELECT TRIM(' ' FROM '    HHEELOHH    ') FROM DUAL
--下面这个用法是oracle为了兼容其他数据库提供的用法
SELECT TRIM('   HHEELOHH  ') FROM DUAL
--LTRIM(X,Y) 去除x的头部的y
SELECT LTRIM('  HELLO ',' ') FROM DUAL
--RTRIM(X,Y) 去除x的尾部的y
SELECT RTRIM('  HELLO ',' ') FROM DUAL
--替换
SELECT REPLACE('有博园是硬汉', '硬汉', '狗熊') FROM DUAL
--截取
SELECT SUBSTR('有博园是硬汉', 2, 3) FROM DUAL
SELECT SUBSTR('有博园是硬汉', 2) FROM DUAL
--NVL() 为null的时候的替换展示
SELECT S.STUID,S.STUNAME,S.STUPHONE,S.STUAGE,NVL(S.STUCLASSES, '班级未知') FROM STUDENT S

数学函数和时间函数

----数学的函数
-- abs(num) // 求绝对值
SELECT ABS(-89) FROM DUAL
-- sqrt(num) // 开平方根
SELECT SQRT(9) FROM DUAL
-- pow(x, y)/power // 幂次方:x的y次方
SELECT POW(2,3) FROM DUAL
-- mod(x, y) // 求余
SELECT MOD(10,4) FROM DUAL -- 2
-- ceil(num)/ceiling() // 向上取整
SELECT CEIL(2.6) FROM DUAL
-- floor(num) //向下取整
SELECT FLOOR(2.9) FROM DUAL
-- round(num,[n]) //四舍五入,n就是保留的小数位
SELECT ROUND(3.1415,1) FROM DUAL
SELECT ROUND(3.8415) FROM DUAL
-- rand() // 随机数
SELECT RAND() FROM DUAL


-----日期函数
--获取当前日期
SELECT SYSDATE FROM DUAL
SELECT CURRENT_DATE FROM DUAL
SELECT CURRENT_TIMESTAMP FROM DUAL
--获取1个月后的时间
SELECT ADD_MONTHS(SYSDATE, 1) FROM DUAL -- oracle数据库
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);-- mysql数据库
SELECT TO_DATE('2022-05-20 08:21:21', 'yyyy-mm-dd hh24:mi:ss') FROM DUAL  -- oracle数据库
SELECT STR_TO_DATE('2022-05-20 08:21:21', '%Y-%m-%d %H:%i:%s') AS converted_date;-- mysql数据库

mysql与oracle中不通用的函数

-- TRIM( X FROM Y) 去除y首尾的x
SELECT TRIM('A' FROM 'ABCDA') FROM DUAL
-- 下面这个用法是oracle为了兼容其他数据库提供的用法
SELECT TRIM('   HHEELOHH  ') FROM DUAL

-- LTRIM(X,Y) 去除x的头部的y
SELECT LTRIM(' ADSFGSS   ') FROM DUAL
SELECT LTRIM('  HELLO ',' ') FROM DUAL  -- 报错:Incorrect parameter count in the call to native function 'LTRIM'

-- RTRIM(X,Y) 去除x的尾部的y
SELECT RTRIM('  ADSFGSS   ') FROM DUAL
SELECT RTRIM('  HELLO ',' ') FROM DUAL -- 报错:Incorrect parameter count in the call to native function 'RTRIM'

-- 替换,把23 替换为李四
SELECT REPLACE('123指数677','23','李四') FROM DUAL
-- 截取:SUBSTR(str FROM pos FOR len),下标从1算起,从4开始截取长度为5的字符
SELECT SUBSTR('123指数677' FROM 4 FOR 5) FROM DUAL -- 指数677

-- ORACLE数据库 : NVL() 为null的时候的替换展示
SELECT E.EMPID,E.EMPNAME,E.EMPPHONE,E.EMPAGE,NVL(E.EMPSALARY,'未知薪资') FROM emp
SELECT EMPID,EMPNAME,EMPPHONE,EMPAGE,NVL(EMPSALARY,'未知薪资') FROM emp

-- MYSQL中为null的时候的替换展示
SELECT EMPID,EMPNAME,EMPPHONE,EMPAGE,IFNULL(EMPSALARY,'未知薪资') FROM emp

--获取1个月后的时间
SELECT ADD_MONTHS(SYSDATE, 1) FROM DUAL -- oracle数据库
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH);-- mysql数据库
SELECT TO_DATE('2022-05-20 08:21:21', 'yyyy-mm-dd hh24:mi:ss') FROM DUAL  -- oracle数据库
SELECT STR_TO_DATE('2022-05-20 08:21:21', '%Y-%m-%d %H:%i:%s') AS converted_date;-- mysql数据库

⭐聚合函数(很重要)

-----聚合函数
--AVG(列名)
--获取公司的平均薪资
SELECT AVG(SALARY) FROM EMPLOYEES
--获取公司SA_REP职位的平均薪资
SELECT AVG(SALARY) FROM EMPLOYEES WHERE JOB_ID='SA_REP'
--COUNT(*)
--统计公司总人数
SELECT COUNT(*) FROM EMPLOYEES
--统计公司薪资一万以上的人数
SELECT COUNT(*) FROM EMPLOYEES WHERE SALARY>=10000
--MAX()
--求公司的最高薪资
SELECT MAX(SALARY) FROM EMPLOYEES
--MIN()
--求公司的最低薪资
SELECT MIN(SALARY) FROM EMPLOYEES
--SUM()
--求公司月支出
SELECT SUM(SALARY) FROM EMPLOYEES
--分组查询 GROUP BY
SELECT JOB_ID,COUNT(*),MAX(SALARY) FROM EMPLOYEES GROUP BY JOB_ID 
--查询每个班级中的最高分数
SELECT STUCLASSES,MAX(SCORE),MIN(SCORE) FROM STUDENT GROUP BY STUCLASSES
--求每个年龄的最高和最低成绩
SELECT STUAGE,MAX(SCORE),MIN(SCORE) FROM STUDENT GROUP BY STUAGE
--求每个年龄段的人数
SELECT STUAGE,COUNT(*) FROM STUDENT GROUP BY STUAGE
--求每个班级的平均年龄和平均分数
SELECT STUCLASSES,AVG(SCORE),AVG(STUAGE) FROM STUDENT GROUP BY STUCLASSES

--联合分组
SELECT STUCLASSES,STUAGE,COUNT(*) FROM STUDENT GROUP BY STUCLASSES,STUAGE
--使用分组后的查询结果集只能是分组的字段(聚合不受限制)
--求每个班级平均分并且降序排列
SELECT STUCLASSES,AVG(SCORE) FROM STUDENT GROUP BY STUCLASSES ORDER BY AVG(SCORE) DESC
--分组查询的where和having,where是对原始数据筛选,having是对分组后的数据进行筛选
--查询各个年龄段及格的人数
--使用where对原始数据进行筛选 然后再进行分组
SELECT STUAGE,COUNT(*) FROM STUDENT  WHERE SCORE>=60  GROUP BY STUAGE 
--查询27以上年龄段及格的人数
SELECT STUAGE,COUNT(*) FROM STUDENT  WHERE SCORE>=60  GROUP BY STUAGE HAVING STUAGE>=27

--查询27以上年龄段及格的人数存在多个的
SELECT STUAGE,COUNT(*) FROM STUDENT  WHERE SCORE>=60  GROUP BY STUAGE HAVING STUAGE>=27 AND COUNT(*)>1

where和having的总结:
1.当一条sql语句中同时出现了where和group和having 执行顺序是 where—>group by ------>having
2.where子句是作用于原始数据的 having是作用于组的。 并且having必须在group by的后面出现

六、多表查询

mysql:

-- 创建学生表
CREATE TABLE STUDENT
(SNO VARCHAR(3) NOT NULL, -- 学生编号
SNAME VARCHAR(4) NOT NULL,  -- 学生姓名
SSEX VARCHAR(2) NOT NULL,    -- 学生性别
CLASS VARCHAR(5));      -- 班级编号
-- 创建科目表
CREATE TABLE COURSE
(CNO VARCHAR(5) NOT NULL,    -- 科目编号
CNAME VARCHAR(10) NOT NULL,   -- 科目名称
TNO VARCHAR(10) NOT NULL) ;     -- 科目老师编号
-- 创建成绩表
CREATE TABLE SCORE
(SNO VARCHAR(3) NOT NULL,     -- 成绩编号
CNO VARCHAR(5) NOT NULL,      -- 科目编号
DEGREE INT(3) NOT NULL);   -- 成绩分数
-- 创建老师表
CREATE TABLE TEACHER
(TNO VARCHAR(3) NOT NULL,    -- 教师编号
TNAME VARCHAR(4) NOT NULL,     -- 教师名称
TSEX VARCHAR(2) NOT NULL,    -- 教师性别
PROF VARCHAR(6),          -- 教师职称
DEPART VARCHAR(10) NOT NULL);     -- 教师所属学院
-- 添加学生信息
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (108 ,'曾华'
,'男' ,95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (105 ,'匡明'
,'男' ,95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (107 ,'王丽'
,'女' ,95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (101 ,'李军'
,'男' ,95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (109 ,'王芳'
,'女' ,95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (103 ,'陆君'
,'男' ,95031);
-- 添加科目信息
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-105' ,'计算机导论',825);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系统' ,804);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('6-166' ,'数据电路' ,856);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('9-888' ,'高等数学' ,100);
-- 添加成绩信息
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-245',75);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-245',68);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-105',92);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-105',88);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-105',76);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'3-105',64);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'3-105',91);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'3-105',78);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'6-166',85);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'6-106',79);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81);
-- 添加老师信息
INSERT INTO TEACHER(TNO,TNAME,TSEX,PROF,DEPART)
VALUES (804,'李诚','男','副教授','计算机系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,PROF,DEPART)
VALUES (856,'张旭','男','讲师','电子工程系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,PROF,DEPART)
VALUES (825,'王萍','女','助教','计算机系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,PROF,DEPART)
VALUES (831,'刘冰','女','助教','电子工程系');

oracle:

--创建学生表
CREATE TABLE STUDENT
(SNO VARCHAR2(3) NOT NULL, --学生编号
SNAME VARCHAR2(4) NOT NULL,  --学生姓名
SSEX VARCHAR2(2) NOT NULL,    --学生性别
CLASS VARCHAR2(5))      --班级编号
--创建科目表
CREATE TABLE COURSE
(CNO VARCHAR2(5) NOT NULL,    --科目编号
CNAME VARCHAR2(10) NOT NULL,   --科目名称
TNO VARCHAR2(10) NOT NULL)      --科目老师编号
--创建成绩表
CREATE TABLE SCORE
(SNO VARCHAR2(3) NOT NULL,     --成绩编号
CNO VARCHAR(5) NOT NULL,      --科目编号
DEGREE NUMBER(3) NOT NULL)   --成绩分数
--创建老师表
CREATE TABLE TEACHER
(TNO VARCHAR2(3) NOT NULL,    --教师编号
TNAME VARCHAR2(4) NOT NULL,     --教师名称
TSEX VARCHAR2(2) NOT NULL,    --教师性别
PROF VARCHAR2(6),          --教师职称
DEPART VARCHAR2(10) NOT NULL)     --教师所属学院
--添加学生信息
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (108 ,'曾华'
,'男' ,95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (105 ,'匡明'
,'男' ,95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (107 ,'王丽'
,'女' ,95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (101 ,'李军'
,'男' ,95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (109 ,'王芳'
,'女' ,95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,CLASS) VALUES (103 ,'陆君'
,'男' ,95031);
--添加科目信息
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-105' ,'计算机导论',825);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('3-245' ,'操作系统' ,804);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('6-166' ,'数据电路' ,856);
INSERT INTO COURSE(CNO,CNAME,TNO)VALUES ('9-888' ,'高等数学' ,100);
--添加成绩信息
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-245',86);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-245',75);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-245',68);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,'3-105',92);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,'3-105',88);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,'3-105',76);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'3-105',64);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'3-105',91);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'3-105',78);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,'6-166',85);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,'6-106',79);
INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,'6-166',81);
--添加老师信息
INSERT INTO TEACHER(TNO,TNAME,TSEX,PROF,DEPART)
VALUES (804,'李诚','男','副教授','计算机系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,PROF,DEPART)
VALUES (856,'张旭','男','讲师','电子工程系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,PROF,DEPART)
VALUES (825,'王萍','女','助教','计算机系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,PROF,DEPART)
VALUES (831,'刘冰','女','助教','电子工程系');
--链接查询
--内联接 INNER JOIN   ON (SQL99标准)
SELECT * FROM STUDENT INNER JOIN SCORE ON STUDENT.SNO = SCORE.SNO
--外联接 OUTER JOIN 
--左外 LEFT [OUTER] JOIN
--以lefe关键字坐标的表位主表
SELECT * FROM STUDENT LEFT JOIN SCORE ON STUDENT.SNO = SCORE.SNO
--右外 RIGHT JOIN 以JOIN后的表位主表
SELECT * FROM  SCORE RIGHT JOIN STUDENT ON STUDENT.SNO = SCORE.SNO
--查询所有男学生70以上的成绩并且按照成绩降序排列
SELECT S.*,SC.CNO,SC.DEGREE FROM STUDENT S INNER JOIN SCORE SC ON S.SNO=SC.SNO WHERE S.SSEX='男' AND SC.DEGREE>70 ORDER BY SC.DEGREE DESC
--内联接(SQL92标准)
SELECT * FROM STUDENT S,SCORE SC WHERE S.SNO=SC.SNO AND S.SSEX='男' AND SC.DEGREE>70 ORDER BY SC.DEGREE DESC
--左外  右外  (+),SC.SNO=S.SNO(+):以sc表为主表,SC.SNO(+)=S.SNO : 以s表为主表
SELECT * FROM STUDENT S,SCORE SC WHERE SC.SNO=S.SNO(+) -- (+)是Oracle数据库中的用法
-- --------------------------------------------------------------
-- --三表的查询
-- --SQL92标准
SELECT * FROM STUDENT S,SCORE SC,COURSE C WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO -- CNO 和 SNO 会出现两次
-- --SQL99标准
-- 把SELECT * FROM STUDENT S INNER JOIN SCORE SC ON S.SNO=SC.SNO 看作一个整体与COURSE进行关联
SELECT * FROM STUDENT S INNER JOIN SCORE SC ON S.SNO=SC.SNO INNER JOIN COURSE C ON SC.CNO=C.CNO
-- --USING
SELECT * FROM student S JOIN score SC USING(SNO) JOIN course C USING(CNO)
SELECT * FROM student S INNER JOIN score SC USING(SNO) INNER JOIN course C USING(CNO)
-- -------------------------------------------------------------------
--全连接
SELECT * FROM STUDENT S FULL JOIN SCORE SC ON S.SNO=SC.SNO -- Oracle数据库
-- 与上述语句等同
SELECT * FROM STUDENT S LEFT JOIN SCORE SC ON S.SNO=SC.SNO
UNION
SELECT * FROM STUDENT S RIGHT JOIN SCORE SC ON S.SNO=SC.SNO

Mysql

1.安装和卸载

2.基本命令

show databases; --查看所有的数据库
use 数据库名字; --打开指定的数据库
show tables; --查看当前库下所有的表
desc 表名; --查看指定的表的表结构
create database 数据库名;--创建数据库
exit;退出界面

3.操作数据库

--1.创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名;
--2.删除数据库
DROP DATABASE [IF EXISTS] 数据库名;
--3.使用数据库  如果数据库名字存在特殊字符 最好使用单引号把数据名括起来
USE 数据库名

4.数据库类型

数值:

数据类型描述大小
tinyint最小的数值1字节
smallint数值2
mediumint数值3
int标准的整型4
bigint超大的整形8
float浮点型4
double浮点型8
decimal字符串形式的浮点数

字符:

数据类型描述大小
char固定长度字符串0-255
varchar可变字符串0-65535
tinytext微型文本2的8次方-1
text文件2的16次方-1

日期:

数据类型描述格式
date日期格式YYYY-MM-DD
time时间格式HH:mm:ss
datetime日期时间格式YYYY-MM-DD HH:mm:ss
timestamp时间戳1970.1.1到现在的毫秒数
year年份

null:

没有值。

5.字段属性

属性描述
UNSIGNED声明该列不能为负数
ZEROFILL不足的位数用0填充。 int(4) 存储的是12则为0012
auto_increment自增。在上一条的基础上+1.一般用来设置主键列。
null和not null设置是否可以为空
defaule用于设置默认值

6.创建表

create table student(
	id int(4) not null auto_increment COMMENT '学号',
	name VARCHAR(20) not null DEFAULT '匿名' COMMENT '姓名',
	gender VARCHAR(2) not null DEFAULT '女' COMMENT '性别',
	birthday datetime DEFAULT null COMMENT '出生日期',
	address VARCHAR(100) DEFAULT null COMMENT '家庭地址',
	age int(3)  DEFAULT null COMMENT '年龄',
	PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET =UTF8
--注意点:
--主表和字段名尽量使用``括起来
--主键声明一般放在最后一行
--标准语法:CREATE TABLE IF NOT EXISTS 表名(
	字段名	数据类型 [属性][索引][注释]...
)表的存储引擎 字符集设置

7.数据库存储引擎

INNODB:默认使用。安全性比较高,支持事务的机制。

MYISAM:过时的。节约空间,速度较快。

MYISAMINNODB
事务支持不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
空间大小比较小大概是前者的2倍

8.修改表操作

修改表名:ALTER TABLE 旧表明 RENAME AS 新表名
添加字段:ALTER TABLE 表名 ADD 字段名 数据类型 [属性]
修改字段的数据类型:ALTER TABLE 表名 MODIFY 字段名 数据类型
修改字段名称:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型 [属性]
删除字段:ALTER TABLE 表名 DROP 字段名
删除表:DROP TABLE [if EXISTS]  表名
--尽量创建和删除的时候加上判断

9.DML

添加:INSERT INTO 表名(字段名...) VALUES(...)
添加多条:INSERT INTO 表名(字段名...) VALUES(...),(...),(...)
修改:UPDATE 表名 SET 字段名=字段值 [WHERE条件]
删除:DELETE FROM 表名 [WHERE条件]
删除所有:DELETE FROM 表名(尽量不要这么写)
--不属于DML的删除
TRUNCATE:清空一张表。表的结构不会变。

DELETE FROM 表名和 TRUNCATE 表名的区别:
1.DELETE可以局部删除(使用where子句进行定向删除)。而TRUNCATE只能删除整个表的数据
2.TRUNCATE会重置自增列,计数器归零。而DELETE不会。
3.DELETE属于DML。操作的数据可以回滚。TRUNCATE属于DDL,操作不会进行存储。不能回滚。

10.DQL

SELECT [ALL|DISTINCT] 
{*|TABLENAME.*|ALIAS.*|TABLENAME.FILED1,TABLENAME.FRILED2...}
FROM TABLENAME [AS TABLE_ALIAS]
[LEFT|RIGHT|INNER JOIN TABLENAME2] --联合查询
[WHERE ...]--判断条件
[GROUP BY...] --分组
[HAVING]--筛选
[ORDER BY]--排序
[LIMIT OFFSET,SIZE]--从offset的位置查询size个数据

11.总结练习

12.MD5加密

#密码是不能明文显示的  所有需要加密
#1.Java代码进行加密,把加密后的密文存储在数据库中
#2.数据库加密
INSERT INTO user(user_pwd) values('lxk0520')
#后期修改密码
UPDATE user SET user_pwd = MD5(user_pwd)
#插入数据的时候直接加密
INSERT INTO user(user_pwd) values(MD5('linli'))
SELECT count(*) FROM user WHERE user_id=2 AND user_pwd = MD5('lxk0520')

13.事务

事务就是数据库中一组最小的运行单位,其中不管包含了多少SQL都具备要么一起成功,要不一起失败的特点。

13.1 事务特性

ACID

名称描述
原子性(A)原子性就是指事务是一个不可以分割的工作单元,事务中的操作要不都发生,要不都不发生
一致性©事务前后数据的完整性必须保持一致
隔离性(I)事务的隔离性发生在多线程高并发的情况下。数据库会给每个用户开启一个事务,A用户的对数据库的操作不会被其他用户干扰。各个事务之间相互隔离。
持久性(D)事务一旦提交就成为了不可逆状态。就算此时服务器出现故障也不会影响到数据,因为此时数据已经存储在磁盘中。
13.2 事务并发的问题
问题名称描述
脏读一个事务读取到了另外一个事务未提交的数据
不可重复读在一个事务中读取表内的一行数据,多次读取的结果不同。
幻读(虚读)一个事务中读取了其他事务插入的数据源,导致前后读取不一致。
13.3 隔离级别

在数据库中为了保证并发情况下读取数据的正确性,数据库本身提出了事务隔离级别。

读未提交:一个事务可以读取到其他事务未提交的数据,在这种隔离级别下,所有的查询不会加锁,一致性最差。

​ 如果设置成此种隔离级别那么上述的三种问题都会出现。

读已提交:一个事务只能读取其他事务已经提交的数据。这次隔离级别会解决脏读的问题,但是不可重复读和幻读还是可能出现。

​ 注意:此种隔离级别是绝大部分数据都默认使用的隔离级别。ORACLE。但是Mysql不使用这种隔离级别。

可重复读:事务在执行过程中可以读取其他事务已经提交的数据,但是不能读取其他事务对数据的修改。这种隔离级别可以解决脏读,不可重复读的问题,但是还是会出现幻读的问题。

​ 注意:Mysql默认使用的就是此种隔离级别

串行化:并发时事务使用串行化执行,一个事务执行的时候,其他事务等待。此种隔离级别不会出现上述的三种问题。但是并发能力很差。

13.4 事务的操作

在后期的开发中事务交由后台Java代码解决。

默认情况下每一条sql都是一个单独的事务。

1.关闭自动提交事务

SET autocommit=0;

2.开启事务

START TRANSACTION

3.提交事务

COMMIT

4.回滚

ROLLBACK

5.设置回滚点

SAVEPOINT 回滚点名

ROLLBACK TO SAVEPOINT 回滚点名

14.索引

索引:使Mysql提高获取数据速度的数据结构。

索引的好处:

​ 提高查询的速度

​ 确保数据的唯一性

​ 联合查询的时候加速表与表之间的链接。

​ 使用分组,排序的时候加速效率

​ 全文检索加速

14.1 主键索引

PRIMARY KEY:唯一标识,不可重复。数据库中最常见的索引类型,不允许为空值。确保数据记录在数据库中的位置

14.2 普通索引

普通索引的作用一般就是用于条件查询,可以快速的定位到指定数据。根据项目的需求在查询比较频繁的字段上可以添加普通索引,但是并不是索引越多越好。如果一张表中存在了过多的索引还会造成查询效率的地下。所以索引不适合在频繁修改数据的字段上。

CREATE INDEX indexName ON tableName (columName)

14.3 唯一索引

UNIQUE KEY:此索引和普通索引相似,区别就是此索引具备唯一性,此索引允许为NULL

和主键索引的区别是:主键索引只能有一个,唯一索引可以有多个

14.4全文索引

可以快速的定位到指定数据。

但是只能在MyISAM存储引擎下使用。而且只能检索CHAR,VARCHAR,TEXT类型的数据。适合大数据量的数据集

14.5 索引命令
#查看索引
SHOW INDEX FROM user
#删除指定索引
DROP INDEX index_pwd ON user

15.存储过程

存储过程:使用多表sql语句完成一个业务需求的执行链。

存储过程:一条或者多条SQL语句的集合,结构和子查询,但是子查询属于一条sql,而存储过程是一组完成特性功能的SQL语句集合。经过编译之后存储在数据库中,在需要的时候直接调用,原理和脚本语言的函数一样。

优点:

​ 1.可以把一些复杂的sql进行封装,简化单条sql

​ 2.简单的变动只需要更改存储过程代码就可以

​ 3.存储过程在一定情况下效率比较高,因为预先编译

缺点:

​ 1.语句复杂

​ 2.一般用户没有创建存储过程的权限,只能调用存储过程

实际开发场景:

​ 在实际开发中业务逻辑不会封装到数据库中的,业务逻辑交给应用程序处理。

​ 数据库在开发体系中作用就是存储数据和查询数据源,其他所有的行为都需要避免,尽可能减少数据库资源的浪费

​ 由于存储过程维护麻烦,大量的业务逻辑的处理交给了存储过程,如果后期业务发生了改变维护特别麻烦

​ 电信公司,银行,金融这些行业会用到存储过程,但是在互联网行业基本没人使用

CREATE PROCEDURE addDate()
BEGIN
	SET @i=0;
	WHILE @i<10 do
		INSERT INTO user(user_pwd) values(MD5('linli'));
		SET @i=@i+1;
	END WHILE;
END;

CALL addDate();

16.触发器

触发器:Mysql中响应(增,修,删操作的时候自动的执行一条或者多条的Sql语句。

语法:

CREATE TRIGGER 触发器的名字 触发时间 触发事件 ON 表名 FOR EACH ROW 触发处理的SQL语句
触发时间(time):BEFORE,AFTER
触发事件(even):INSERT,UODATE,DELETE
触发处理的SQL语句:一个或多个sql语句

触发器在现在同样被后端语言取代,基本不用

17.视图

视图:数据库中虚拟的表。和普通表不同的是,视图的数据都来自于普通表。只是用来查询使用

CREATE VIEW v_grade_student AS SELECT s.*,g.grade_name FROM student s LEFT JOIN grade g ON s.grade_id=g.grade_id;


SELECT * FROM v_grade_student

作用:复用sql。 保护数据。

使用特点:视图不能有索引。并且视图不能有关联的触发器和默认值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

misz†

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值