1、SQL是一种语言,结构化查询语言(Structured Query Language)。
简单地说,SQL就是访问和处理关系数据库的计算机标准语言。
2、MySql,Oracle和SQL Server是指数据库系统,此外还有Access等数据库。
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。
3、联机事务处理(On-line Transaction Processing,OLTP);
联机分析处理(On-line Analysis Processing,OLAP)。

mysql可以创建数据库,而oracle没有这个操作,oracle只能创建实例;
sql数据库操作:database
🐖 SQL语言关键字不区分大小写!!!但是,对于表名和列名,针对不同的数据库,有的区分,有的不区分。

mysql和oracle的区别有哪些

四个基本概念

数据(data)
数据库(DataBase,DB)
数据库管理系统(DataBase Management System,DBMS)
数据库系统(DataBase System,DBS)

一、基本SQL语句

创建表:

# 先建被参照关系表
CREATE TABLE PROFESSION(
PNO CHAR(4) PRIMARY KEY,
PNAME CHAR(10));

CREATE TABLE STUDENT(
	SNO CHAR(8) PRIMARY KEY, #列级
	SNAME CHAR(10),
	SEX CHAR(7),
	SAGE SMALLINT,
	MAJOR CHAR(20),
	# PRIMARY KEY (SNO),#表级
	FOREIGN KEY(PNO) REFERENCES PROFESSION(PNO));

二、MySQL学习

MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

  • MySQL 是开源的,目前隶属于Oracle 旗下产品。
  • MySQL 使用标准的SQL 数据语言形式。
  • 要在一个网站上运行 MySQL ,你需要一种脚本语言来和数据库进行交互。

廖雪峰-MySQL
菜鸟教程-MySQL

1、RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:

  • 1.数据以表格的形式出现
  • 2.许多的行和列组成一张表单
  • 3.若干的表单组成数据库(database)

2、NoSQL数据库
NoSQL数据库,也就是非SQL的数据库,包括MongoDB、Cassandra、Dynamo等等,它们都不是关系数据库。

3、数据模型
数据库按照数据结构来组织、存储和管理数据,实际上,数据库一共有三种模型:

  • 层次模型:树状
  • 网状模型:网状
  • 关系模型:表格

4、数据类型

🐖 字段(Column)为NULL, 表示字段数据不存在。一个整型字段如果为NULL不表示它的值为0,同样的,一个字符串型字段为NULL也不表示它的值为空串’。

在关系数据库中,关系是通过主键和外键来维护的。
5、主键
选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。我们一般把这个字段命名为id。常见的可作为id字段的类型有:
(1)自增整数类型: 数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键;
(2)全局唯一GUID类型: 使用一种全局唯一的字符串作为主键,类似8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。
🐖 通常来说,BIGINT能满足整数存储的需求,VARCHAR(N)能满足字符串存储的需求,这两种类型是使用最广泛的。
🐖 身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。

6、联合主键
关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。
对于联合主键,允许一列有重复,只要不是所有主键列都重复即可,但并不常用。

7、外键
关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。
🐖 外键并不是通过列名实现的,而是通过定义外键约束实现的:

ALTER TABLE students
ADD CONSTRAINT fk_class_id
FOREIGN KEY (class_id)
REFERENCES classes (id);

删除一个外键约束,也是通过ALTER TABLE实现的:

ALTER TABLE students
DROP FOREIGN KEY fk_class_id;

🐖 注意:删除外键约束并没有删除外键这一列。删除列是通过DROP COLUMN ...实现的。
🐖 多对多关系实际上是通过两个一对多关系实现的,即通过一个中间表,关联两个一对多关系,就形成了多对多关系。

8、索引
索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度

创建索引
使用ADD INDEX idx_score (score)就创建了一个名称为idx_score,使用列score的索引。索引名称是任意的,索引如果有多列,可以在括号里依次写上,例如:

ALTER TABLE students
ADD INDEX idx_name_score (name, score);

🐖

  • 索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。
  • 对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。
  • 可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。

9、唯一索引
在设计关系数据表的时候,看上去唯一的列,但不宜作为主键的,可以通过UNIQUE关键字给该列添加一个唯一索引。
例如,我们假设students表的name不能重复

ALTER TABLE students
ADD UNIQUE INDEX uni_name (name);

也可以只对某一列添加一个唯一约束而不创建唯一索引,这种情况下,name列没有索引,但仍然具有唯一性保证。

ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);

三、MySQL–查询数据

基本查询

使用SELECT *可以查询一个表的所有行和所有列的数据。查询的结果是一个二维表

SELECT * FROM <表名>

不带FROM子句的SELECT语句的用途:

  • 判断当前到数据库的连接是否有效。许多检测工具会执行一条SELECT 1;来测试数据库连接。
  • SELECT可以用作计算,但它并不是SQL的强项,如SELECT 100+200; 会直接计算出表达式的结果。

条件查询

条件查询的语法就是:

SELECT * FROM <表名> WHERE <条件表达式>

🐖 条件表达式:

  • <条件1> AND <条件2>表达满足条件1并且满足条件2。
  • <条件1> OR <条件2>表达满足条件1或者满足条件2。
  • NOT条件:NOT class_id = 2其实等价于class_id <> 2,因此,NOT查询不是很常用。
  • 如果不加括号,条件运算按照NOT、AND、OR的优先级进行,即NOT优先级最高,其次是AND,最后是OR
  • 加上括号可以改变优先级。
  • 使用LIKE判断相似,如name LIKE '%bc%',其中 %表示任意字符.。
  • 字符串比较:英文根据ASCII码,中文字符比较根据数据库设置,如name > 'abc'
  • 是否为空:用IS NULL; IS NOT NULL,不能用==!=

🐖 如果某列存储的是字符串,其值需要用单引号括起来。
🐖 要组合三个或者更多的条件,就需要用小括号()表示如何进行条件运算。

例子:查询分数在60分(含)~90分(含)之间的学生可以使用的WHERE语句是:

 WHERE score >= 60 AND score <= 90;
#或者
 WHERE score BETWEEN 60 AND 90;

投影查询

如果我们只希望返回某些列的数据,而不是所有列的数据,我们可以用SELECT 列1, 列2, 列3 FROM ...,让结果集仅包含指定列。这种操作称为投影查询
🐖 结果集的列的顺序和原表可以不一样。
🐖 对结果集的列进行重命名(给某列起别名),它的语法是SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM ...
🐖 投影查询同样可以接WHERE条件,实现复杂的查询。

排序

查询结果集通常是按照id排序的,也就是根据主键排序。这也是大部分数据库的做法。如果我们要根据其他条件排序, 可以加上ORDER BY子句

  • 默认按照从低到高排序,ASC可以省略,也可以加ASC表示 “升序” ;即ORDER BY score ASCORDER BY score效果一样。
  • 按照从高到底排序,我们可以加上DESC表示“降序”:
  • 可以对多列进行升序、倒序排序;按列的出现顺序决定先按哪一列排序。
    🐖 如果有WHERE子句,那么ORDER BY子句要放到WHERE子句后面。

分页查询

分页实际上就是从结果集中 “截取”出第M~N条记录 。这个查询可以通过LIMIT <M> OFFSET <N>子句实现。
首先要确定每页需要显示的结果数量pageSize,然后根据当前页的索引pageIndex从1开始),确定LIMITOFFSET应该设定的值:

LIMIT总是设定为pageSize;
OFFSET计算公式为pageSize * (pageIndex - 1)

这样就能正确查询出第N页的记录集。
🐖 注意SQL记录集的索引从0开始

# 查询第1页
LIMIT 3 OFFSET 0;

🐖

  • OFFSET超过了查询的最大数量并不会报错,而是得到一个空的结果集。
  • OFFSET是可选的,如果只写LIMIT 15,那么相当于LIMIT 15 OFFSET 0
  • 在MySQL中,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15
  • 使用LIMIT <M> OFFSET <N>分页时,随着N越来越大,查询效率也会越来越低。

聚合查询

对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。
🐖 COUNT(*)表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT(*)
🐖 COUNT(*)COUNT(id)实际上是一样的效果。
🐖 通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果,如SELECT COUNT(*) num FROM students;
🐖 聚合查询同样可以使用WHERE条件

SQL还提供了如下聚合函数:

函数名函数说明
COUNT查询某一列的行数
SUM计算某一列的合计值,该列必须为数值类型
AVG计算某一列的平均值,该列必须为数值类型
MAX计算某一列的最大值
MIN计算某一列的最小值
ROUND遵循四舍五入把原值转化为指定小数位数,如:round(1.45,0)= 1;round(1.55,0)=2
FLOOR向下舍入为指定小数位数,如:floor(1.45,0)= 1;floor(1.55,0) = 1
CEILING向上舍入为指定小数位数,如:ceiling(1.45,0) = 2;ceiling(1.55,0)=2

🐖 注意,MAX()MIN()函数并不限于数值类型。如果是字符类型MAX()MIN()会返回排序最后和排序最前的字符。
🐖 如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL
🐖 聚合查询的列中,只能放入分组的列。如:

SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;
# 下面这个语句错误,因为分组中没有name
SELECT name, class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;

多表查询:又称笛卡尔查询

查询多张表的语法是:
SELECT * FROM <表1> <表2>

举例:SELECT * FROM students, classes;
这种多表查询,查询的结果也是一个二维表,它是students表和classes表的“乘积”,即students表的每一行与classes表的每一行都两两拼在一起返回。结果集的列数是students表和classes表的列数之和行数是students表和classes表的行数之积
🐖 多表查询的结果集可能非常巨大,要小心使用。

结果集的列名重复问题:(当多表里列名重复时)
(1)要使用表名.列名这样的方式来引用列和设置别名—很麻烦

SELECT
    students.id sid,
    students.name,
    students.gender,
    students.score,
    classes.id cid,
    classes.name cname
FROM students, classes;

(2)给表设置一个别名----稍微简洁一点:

SELECT
    s.id sid,
    s.name,
    s.gender,
    s.score,
    c.id cid,
    c.name cname
FROM students s, classes c;

连接查询

连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表结果集上。

(1) 内连接(INNER JOIN)查询的写法是:

  • 先确定主表,仍然使用FROM <表1>的语法;
  • 再确定需要连接的表,使用INNER JOIN <表2>的语法;
  • 然后确定连接条件,使用ON <条件...>,这里的条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接;
  • 可选:加上WHERE子句、ORDER BY等子句。
    🐖 使用别名不是必须的,但可以更好地简化查询语句。
    INNER JOIN只返回同时存在于两张表的行数据

(2) 外连接( OUTER JOIN)

RIGHT OUTER JOIN返回右表都存在的行。如果某一行仅在右表存在,那么结果集就会以NULL填充剩下的字段。
LEFT OUTER JOIN则返回左表都存在的行。如果某一行仅在左表存在,那么结果集就会以NULL填充剩下的字段。
FULL OUTER JOIN则是选出左右表都存在的记录。

(3)JOIN查询的选择
假设查询语句是:

SELECT ... FROM tableA ??? JOIN tableB ON tableA.column1 = tableB.column2;

修改数据

关系数据库的基本操作就是增删改查,即CRUD:Create、Retrieve(检索)、Update、Delete。

对于增、删、查、改,对应的SQL语句分别是:

INSERT:插入新记录;
DELETE:删除已有记录
SELECT:查询已有记录
UPDATE:更新已有记录

INSERT

INSERT语句的基本语法是:

INSERT INTO <表名> (字段1, 字段2, ...) VALUES (1,2, ...);
  • 如果一个字段有默认值,比如id字段是一个自增主键,它的值可以由数据库自己推算出来, 那么在INSERT语句中也可以不出现。
  • 字段顺序不必和数据库表的字段顺序一致,但值的顺序必须和字段顺序一致。
  • 可以一次性添加多条记录,只需要在VALUES子句中指定多个记录值,每个记录是由(...)包含的一组值。

举例:

INSERT INTO students (class_id, name, gender, score) VALUES
  (1, '大宝', 'M', 87),
  (2, '二宝', 'M', 81);
SELECT * FROM students;

UPDATE

UPDATE语句的基本语法是:

UPDATE <表名> SET 字段1=1, 字段2=2, ... WHERE ...;

🐖 如果WHERE条件没有匹配到任何记录,UPDATE语句不会报错,也不会有任何记录被更新。
🐖 UPDATE语句可以没有WHERE条件,但这时,整个表的所有记录都会被更新。⭐所以,在执行UPDATE语句时要非常小心,最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用UPDATE更新。

DELETE

DELETE语句的基本语法是:

DELETE FROM <表名> WHERE ...;

🐖 特别小心的是,和UPDATE类似,不带WHERE条件的DELETE语句会删除整个表的数据。这时,整个表的所有记录都会被删除。⭐所以,在执行DELETE语句时也要非常小心,最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用DELETE删除。

四、MySQL安装

(1) 要在WindowsMac上安装MySQL,首先从MySQL官方网站下载最新的MySQL Community Server版本:
https://dev.mysql/downloads/mysql/
选择对应的操作系统版本,下载安装即可。在安装过程中,MySQL会自动创建一个root用户,并提示输入root口令。
(2) 要在Linux上安装MySQL,可以使用发行版的包管理器。例如,Debian和Ubuntu用户可以简单地通过命令apt-get install mysql-server安装最新的MySQL版本。
(3) 运行MySQL
MySQL安装后会自动在后台运行。为了验证MySQL安装是否正确,

  • MySQL Client中输入SQL语句mysql -u root -p,填入MySQL的root口令,如果正确,就通过TCP连接发送到MySQL Server,同时提示符变为mysql>:
  • 输入exit断开与MySQL Server的连接并返回到命令提示符。🐖注意,MySQL服务器仍在后台运行。
  • 连接到远程MySQL Server。假设远程MySQL Server的IP地址是10.0.1.99,那么就使用-h指定IP或域名:
mysql -h 10.0.1.99 -u root -p

🐖 MySQL Client的可执行程序是mysqlMySQL Server的可执行程序是mysqld
🐖 命令行程序mysql实际上是MySQL客户端,真正的MySQL服务器程序是mysqld,在后台运行。

五、MySQL管理

1、可视化图形界面MySQL Workbench

MySQL Workbench是一个图形客户端,可以用可视化的方式查询、创建和修改数据库表。它对MySQL的操作仍然是发送SQL语句并执行。

2、在MySQL Client中输入SQL语句,用命令管理

(1)数据库

  • 列出所有数据库:mysql> SHOW DATABASES;
    🐖 其中,information_schema、mysql、performance_schema和sys系统库,不要去改动它们。其他的是用户创建的数据库。
  • 创建一个新数据库:mysql> CREATE DATABASE test;
  • 要删除一个数据库:mysql> DROP DATABASE test;
    🐖 注意:删除一个数据库将导致该数据库的所有表全部被删除。
  • 对一个数据库进行操作时,要首先将其切换为当前数据库:mysql> USE 当前数据库名;

(2)表

  • 列出当前数据库的所有表:mysql> SHOW TABLES;
  • 查看一个表的结构:mysql> DESC 表名;
  • 查看创建该表的SQL语句:mysql> SHOW CREATE TABLE 表名;
  • 创建表:mysql> CREATE TABLE 表名;
  • 删除表:mysql> DROP TABLE 表名;
  • 修改表就比较复杂。

如果要给students表新增一列birth,使用:

ALTER TABLE students ADD COLUMN birth VARCHAR(10) NOT NULL;

要修改birth列,例如把列名改为birthday,类型改为VARCHAR(20):

ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL;

要删除列,使用:

ALTER TABLE students DROP COLUMN birthday;

更多推荐

数据库笔记