SQL语言与SQL在线实验工具的使用【修订版】
首先简要介绍SQL,然后介绍SQL在线实验工具的使用。
SQL语言介绍
首先提醒两点:
☆标准SQL由ANSI标准委员会管理,从而称为ANSI SQL——因此SQL通常都有相当一致的实现,非常基本的语句往往是相通的,所有主要的DBMS,都支持ANSI SQL,但你不能想当然地认为它总是这样,因为几乎所有的实现有自己的扩展,这种扩展的目的是提供执行特定操作的额外功能或简化方法,很少有两个厂商同时支持这种扩展,例如,对数据库定义、访问权限和安全方面,不同的数据库不同。
☆SQL语句不区分大小写,因此SELECT与select、Select是相同的。许多SQL开发人员喜欢对SQL关键字使用大写,而对列名和表名使用小写,这样做代码更易于阅读和调试。不过,一定要明确虽然SQL关键字是不区分大小写的,但是表名、列名和值可能有所不同(这有赖于具体的DBMS及其如何配置)。
SQL (Structured Query Language 结构化查询语言)是基于关系代数和元组关系演算,用于对数据库的数据定义和数据操纵的语言。
数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。数据库是通过DBMS创建和操纵的容器——保存有组织的数据——通常是一个文件或一组文件。
数据库管理系统(Database Management System:DBMS)是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。广泛的数据库管理系统是关系型DBMS(relational DBMS),在关系型数据模型中,用二维表格表示数据库中的数据。这些表格称为关系。
数据表:数据表是关系数据库的基本存储结构,二维数据表有行(Row)——也叫作记录、列(Column)——也叫作字段。
数据类型
允许什么类型的数据。每个表的列(column)都有相应的数据类型,它限制(或允许)该列中存储的数据。
数据类型限定了可存储在列中的数据种类(例如,防止在数值字段中录入字符值),并在优化磁盘使用方面起重要的作用。因此,在创建表(table)时必须特别关注所用的数据类型。
注意:数据类型兼容问题
数据类型及其名称是SQL不兼容的一个主要原因。虽然大多数基本数据类型得到了一致的支持,但也有些数据类型不尽相同,甚至有相同的数据类型在不同的DBMS中具有不同的名称。MySQL数据库数据类型概述 MySQL数据库数据类型概述_软件技术爱好者的博客-CSDN博客 Oracle数据库常用数据类型概述 Oracle数据库数据类型概述_oracle 数据类型官网-CSDN博客 SQL Server数据库数据类型概述 SQL Server数据库数据类型概述_sql serserver 列类型_软件技术爱好者的博客-CSDN博客
SQL是在关系数据库上执行数据操作、检索及维护所使用的标准语言,可以用来查询数据,操纵数据,定义数据,控制数据。
先简要介绍SQL语言,SQL是用于访问和处理数据库的标准的计算机语言,这些数据库系统包括 MS SQL Server、Oracle、MySQL 等。
通过 SQL 创建数据库、表、索引,及其删除它们。
通过SQL 可以在数据库中执行查询、获取数据、插入新的记录、删除记录以及更新记录。
SQL 语言通常按照功能划分成以下的 4 个部分:
DDL (Data Definition Language):数据定义语言,用来定义数据库对象,包括库、表、视图和索引等。
DML (Data Manipulation Language):数据操作语言,用来操作和业务相关的记录。
DQL (Data Query Language):数据查询语言,用来查询经过条件筛选的记录。
DCL (Data Control Language):数据控制语言,用来定义访问权限和安全级别。
常见的相关语句可见下表:
语句 | 语法 |
AND / OR | SELECT column_name(s) |
ALTER TABLE (add column) | ALTER TABLE table_name |
ALTER TABLE (drop column) | ALTER TABLE table_name |
AS (alias for column) | SELECT column_name AS column_alias |
AS (alias for table) | SELECT column_name |
BETWEEN | SELECT column_name(s) |
CREATE DATABASE | CREATE DATABASE database_name |
CREATE INDEX | CREATE INDEX index_name |
CREATE TABLE | CREATE TABLE table_name |
CREATE UNIQUE INDEX | CREATE UNIQUE INDEX index_name |
CREATE VIEW | CREATE VIEW view_name AS |
DELETE FROM | DELETE FROM table_name or DELETE FROM table_name |
DROP DATABASE | DROP DATABASE database_name |
DROP INDEX | DROP INDEX table_name.index_name |
DROP TABLE | DROP TABLE table_name |
GROUP BY | SELECT column_name1,SUM(column_name2) |
HAVING | SELECT column_name1,SUM(column_name2) |
IN | SELECT column_name(s) |
INSERT INTO | INSERT INTO table_name or INSERT INTO table_name |
LIKE | SELECT column_name(s) |
ORDER BY | SELECT column_name(s) |
SELECT | SELECT column_name(s) |
SELECT * | SELECT * |
SELECT DISTINCT | SELECT DISTINCT column_name(s) |
SELECT INTO | SELECT * or SELECT column_name(s) |
TRUNCATE TABLE | TRUNCATE TABLE table_name |
UPDATE | UPDATE table_name |
WHERE | SELECT column_name(s) |
SQL语句以分号结尾。SQL关键字是不区分大小写(SELECT,FROM,WHERE等)。但是,在某些设置中,表名和字段(列)名区分大小写。
不同的数据库对字段(列)名等标识符、字符串大小写处理情况有点麻烦,如:
默认情况下,Oracle标识符(表名,列名等)不区分大小写。 您可以使用引号将它们区分大小写(例如:dba_tables
)。 SQL关键字('STRING'
、NLS_COMP
、NLS_SORT
等)始终不区分大小写。在标识符周围使用引号,将区分带小写。
WHERE 子句条件运算符简介
WHERE子句可包括各种条件运算符:
比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
范围运算符(表达式值是否在指定的范围):BETWEEN…AND…
NOT BETWEEN…AND…
列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)
NOT IN (项1,项2……)
模式匹配符(判断值是否与指定的字符通配格式相符)LIKE、NOT LIKE
空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR
1)、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
2)、列表运算符例:country IN ('Germany','China')
3)、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、
varchar、text、ntext、datetime和smalldatetime等类型查询。
可使用以下通配字符:
在 SQL 中,可使用以下通配符:
通配符 | 描述 |
---|---|
% | 替代零个或多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或者 [!charlist] | 不在字符列中的任何单一字符 |
如
SELECT * FROM Persons
WHERE PersonID=2;
☆删除表
语法:
drop table 表名称;
如
drop table Persons;
注意 、对数据库定义、访问权限和安全方面,不同的数据库不同,举例如下:
☆对MySQL和SQL Server创建数据库,若数据库名为mybase;
CREATE DATABASE mybase;
mysql和sqlserver用起来比较类似简便,通过 “create database 数据库名” 就可以创建数据库了,Oracle虽然也有create database语句,但相当不同,需要一些比较繁琐的前期工作(编写初始化参数文件、创建实例等),使用起来比较繁琐。
☆对 MySQL查看所有数据库
SHOW DATABASES;
对SQL Server 查看所有数据库使用
SELECT name, database_id, create_date
FROM sys.databases ;
☆对MySQL和SQL Server删除数据库,若数据库名为mybase;
DROP DATABASE mybase1;
☆对MySQL和SQL Server切换数据库,若数据库名为mybase
USE mybase;
SQL在线实验工具
想练习SQL又不想安装数据库环境,可以使用使用SQL在线实验工具,原来介绍的几个,今日测试发现有的不能用了,故进行了修订。
★ 廖雪峰的在线SQL
https://www.liaoxuefeng.com/wiki/1177760294764384/1179611432985088 此乃廖雪峰的在线SQL网址,参见下图:
廖雪峰的在线SQL比较易用,你可以试试不多言了。
练习语句
☆创建表dept
CREATE TABLE dept(
deptno INT PRIMARY KEY,
dname VARCHAR(20),
loc VARCHAR(20)
);
☆添加数据
INSERT INTO VALUES
(10,'餐饮部','上海'),
(20,'销售部','浙江'),
(30,'财务部','北京'),
(40,'技术部','深圳');
☆查询数据
SELECT * FROM dept
☆创建表emp
CREATE TABLE emp(
empno INT PRIMARY KEY AUTO_INCREMENT,--主键约束
ename VARCHAR(20),
job VARCHAR(20),
mgr int,
hiredate DATE,
sal DOUBLE(7,2),
comm double(5,2),
deptno INT NOT NULL, -- 非空约束
CONSTRAINT fk_emp_dept FOREIGN KEY(deptno) REFERENCES dept(deptno) --加外键
);
【如果上面的语句中,未使用CONSTRAINT子句,之后可以用下句为从表emp加外键
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(deptno) REFERENCES dept(deptno);】
☆添加数据
INSERT INTO emp VALUES
(2004,'张伟','clerk',2002,'1994-10-12',8000.00,500.00,20),
(2005,'曾小贤','clerk',2002,'1993-05-10',9000.00,700.00,20),
(3001,'刘梅','leader',null,'1968-08-08',9000.00,NULL,30),
(3002,'夏冬梅','manger',3001,'1968-09-21',10000.00,600.00,30),
(3003,'夏雪','clerk',3002,'1989-09-21',8000.00,300.00,30)
☆删除表,表名emp
drop table emp;
☆查询数据
SELECT * FROM emp
☆查询显示指定字段: SELECT 字段,字段,字段... FROM 表名;
SELECT ename,hiredate,sal FROM emp;
☆使用DISTINCT可以过滤重复字段行:
SELECT DISTINCT sal FROM emp;
☆查询指定条件
SELECT * FROM emp WHERE sal =8000;
☆使用表达式+、-、*、/
SELECT ename, sal+comm FROM emp;
☆模糊查询
SELECT * FROM emp WHERE ename LIKE '夏%';
☆使用and,or
SELECT * FROM emp WHERE sal >= 9000 AND sal <=10000;
☆使用in,not in
SELECT * FROM emp where job IN('leader','manger');
☆使用between...and []
SELECT * FROM emp WHERE sal BETWEEN 9000 AND 10000;
☆使用聚合函数SUM()、COUNT()、MAX()、MIN()、AVG()
SELECT MAX(sal) FROM emp;
☆等值链接(SELECT * FROM A,B WHERE A.主键=B.外键;) 如:
SELECT *
FROM emp,dept WHERE dept.deptno = emp.deptno;
☆内连接(SELECT * FROM A INNER JOIN B ON A.主键=B.外键;) 如:
SELECT *
FROM emp INNER JOIN dept ON dept.deptno = emp.deptno;
☆外连接:
1左外连接:(SELECT * FROM A LEFT OUTER JOIN B ON 条件;) 如:
SELECT *
FROM emp LEFT OUTER JOIN dept ON dept.deptno=emp.deptno;
2右外连接:(SELECT * FROM A right OUTER JOIN B ON 条件;) 如:
SELECT *
FROM emp RIGHT OUTER JOIN dept ON dept.deptno=emp.deptno;
☆子查询:
SELECT *
FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE loc ='北京');
★SQL Fiddle
SQL Fiddle 支持 MySQL、Oracle、PostgreSQL、SQLite、MS SQL Server等主流数据库,不需要注册即可使用。
具体使用可参见“在线 SQL 模拟器SQL Fiddle使用简介” https://blog.csdn.net/cnds123/article/details/134666895 一文