SQL简介

SQL是什么

  • SQL (Structured Query Language:结构化查询语言) ,是一门语言,专门管理数据库的语言。

  • 这个语言有若干版本,但是要与ANSI标准兼容(美国国家标准化组织),所以各种版本的SQL必须要用相似的方式执行主要命令,比如SELECT、UPDATE、DELETE、INSERT、WHERE 等等

可以操作管理哪些数据库?

MySQL、SQL Server、Access、Oracle、Sybase、DB2 等等

基本操作

增删改查


一个用到SQL的网站,一般是数据库(RDBMS关系型数据库管理系统)+SQL+脚本语言(php,asp)+前端(html、css)

教程:https://www.runoob.com/sql/sql-intro.html

SQL初级

SQL语法

  • SQL 对大小写不敏感。
  • 某些数据库系统要求在每条 SQL 语句的末端使用分号。分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的同一请求中执行一条以上的 SQL 语句。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use database_name; 命令用于选择数据库,返回Database changed
set names utf8; 命令用于设置使用的字符集。返回Query OK, 0 rows affected (0.00 sec)
SELECT * FROM Websites; 读取数据表的信息。

重要的SQL语句
SELECT - 从数据库中提取数据
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引

select

  • 用于从数据库中选取数据,结果被存储在一个结果表中,称为结果集
1
2
SELECT column_name,column_name FROM table_name;
SELECT * FROM table_name;
  • 大多数数据库软件系统都允许使用编程函数在结果集中进行导航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record 等等

https://www.runoob.com/sql/sql-select.html

select distinct

  • 在表中,一个列可能会包含多个重复值,有时希望仅仅列出不同(distinct)的值。distinct关键词用于返回唯一不同的值
1
2
3
4
SELECT DISTINCT column_name,column_name FROM table_name;

SELECT DISTINCT country FROM Websites; 表websites中所有contry只显示一遍

where子句

  • 用于过滤提取那些满足指定条件的记录。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
SELECT column_name,column_name
FROM table_name
WHERE column_name operator value;

字符串与数字
SELECT * FROM tablex WHERE username='xy';
字符串单引号包裹
SELECT * FROM tablex WHERE id=1;

运算符:= > < >= ,<=, !=,<> 表示(不等于)

逻辑运算 优先级() not and or
Select * from emp where sal > 2000 and sal < 3000;
Select * from emp where sal > 2000 or comm > 500;
select * from emp where not sal > 1500;
查询EMP表中 sal 小于等于 1500 的值。

特殊条件
Select * from emp where comm is null;
查询 emp 表中 comm 列中的空值。
Select * from emp where sal between 1500 and 3000;
查询 emp 表中 SAL 列中大于 1500 的小于 3000 的值。下限在前,上限在后,闭区间
Select * from emp where sal in (5000,3000,1500);
等于 500030001500 的值。
Select * from emp where ename like 'M%';
查询 EMP 表中 Ename 列中有 M 的值,M 为要查询内容中的模糊信息。

不带比较运算符的where子句
当不带运算符时,会执行一个隐式转换。当 0 时转化为 false1 转化为 true
SELECT studentNO FROM student WHERE 0;
则会返回一个空集,因为每一行记录 WHERE 都返回 false
SELECT studentNO FROM student WHERE 1;
返回 student 表所有行中 studentNO 列的值。因为每一行记录 WHERE 都返回 true

and & or

  • 用于基于一个以上的条件对记录进行过滤
  • and 需要都成立,or只需一个成立即可
  • 可以把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式)
1
2
3
4
5
6
7
8
9
10

SELECT * FROM Websites WHERE country='CN' AND alexa > 50;
从 "Websites" 表中选取国家为 "CN" 且alexa排名大于 "50" 的所有网站:


SELECT * FROM Websites WHERE country='USA' OR country='CN';
从 "Websites" 表中选取国家为 "USA" 或者 "CN" 的所有客户

SELECT * FROM Websites WHERE alexa > 15 AND (country='CN' OR country='USA');
从 "Websites" 表中选取 alexa 排名大于 "15" 且国家为 "CN" 或 "USA" 的所有网站:

order by

  • 对结果集按照一个列或者多个列进行排序。

  • 默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,可以使用 DESC 关键字

1
SELECT column_name,column_name FROM table_name ORDER BY column_name,column_name ASC|DESC;

https://www.runoob.com/sql/sql-orderby.html

insert into

  • 用于向表中插入新记录。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
INSERT INTO table_name VALUES (value1,value2,value3,...);
直接插
INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);
指定列名再插



INSERT INTO Websites (name, url, alexa, country) VALUES ('百度','https://www.baidu.com/','4','CN');
向 "Websites" 表中插入一个新行,需要列出插入行的每一列数据:,id列一般是自动更新的,表中的每条记录都有一个唯一的数字。


INSERT INTO Websites (name, url, country) VALUES ('stackoverflow', 'http://stackoverflow.com/', 'IND');
只在 "name"、"url" 和 "country" 列插入数据(id 字段会自动更新)

拓展:insert into selectselect into from 的区别
insert into scorebak select * from socre where neza='neza' --插入一行,要求表scorebak 必须存在
select * into scorebak from score where neza='neza' --也是插入一行,要求表scorebak 不存在

update

  • 用于更新表中已存在的记录。
  • 执行没有 WHERE 子句的 UPDATE 要慎重,再慎重。
1
2
3
4
5
6
7
8
UPDATE table_name SET column1=value1,column2=value2,... WHERE some_column=some_value;
此处注意WHERE 子句规定哪条记录或者哪些记录需要更新。如果省略了 WHERE 子句,所有的记录都将被更新!

UPDATE table1 SET data='5000', country='CN' WHERE name='xiaoyao';

在 MySQL 中可以通过设置 sql_safe_updates 这个自带的参数来解决,当该参数开启的情况下,你必须在update 语句后携带 where 条件,否则就会报错
set sql_safe_updates=1; 表示开启该参数

delete

  • 用于删除表中的行。
  • 如果省略了 WHERE 子句,所有的记录都将被删除!
  • 可以在不删除表的情况下,删除表中所有的行。这意味着表结构、属性、索引将保持不变
1
2
3
4
5
6
7
DELETE FROM table_name
WHERE some_column=some_value;

DELETE FROM Websites WHERE name='Facebook' AND country='USA';

DELETE FROM table_name;或DELETE * FROM table_name;
不删除表的情况下,删除表中所有的行

SQL高级

in

  • 在 WHERE 子句中规定多个值
1
2
3
4
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...);

SELECT * FROM vector WHERE name IN ('xiaoyao','逍遥');
从vector表中选取name为xiaoyao或“逍遥”的所有获奖者

between

  • 选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
  • 注意,不同数据库between左右区间开闭不同
1
2
3
4
5
6
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2;

SELECT * FROM Websites WHERE alexa BETWEEN 1 AND 20;

SELECT * FROM Websites WHERE alexa NOT BETWEEN 1 AND 20;
不在 not between
  • 带有in的between
1
SELECT * FROM Websites WHERE (alexa BETWEEN 1 AND 20) AND country NOT IN ('USA', 'IND'); 
  • 带有文本值的between
1
2
3
4
SELECT * FROM Websites WHERE name BETWEEN 'A' AND 'H'; 
选取 name 以介于 'A''H' 之间字母开始的所有网站

SELECT * FROM Websites WHERE name NOT BETWEEN 'A' AND 'H';
  • 带有日期的between
1
2
SELECT * FROM access_log WHERE date BETWEEN '2016-05-10' AND '2016-05-14'; 
选取 date 介于 '2016-05-10''2016-05-14' 之间的所有访问记录:

union

  • 合并两个或多个 SELECT 语句的结果
  • UNION 内部的每个 SELECT 语句必须拥有相同数量的列。
  • 列也必须拥有相似的数据类型。
  • 每个 SELECT 语句中的列的顺序必须相同
  • UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
1
2
3
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
  • 默认地,UNION 操作符只会选取不同的值。如果允许重复的值,使用 UNION ALL。
1
2
3
4
SELECT country FROM Websites
UNION ALL
SELECT country FROM apps
ORDER BY country;
  • 带有where的union语句
1
2
3
4
5
6
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;

https://www.runoob.com/sql/sql-union.html

SQL函数

count()函数

  • 返回匹配指定条件的行数

  • COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入)

  • COUNT(*) 函数返回表中的记录数

    1
    SELECT COUNT(*) FROM table_name;
  • COUNT(DISTINCT column_name) 函数返回指定列的不同值数目COUNT(DISTINCT) 适用于 ORACLE 和 Microsoft SQL Server,但是无法用于 Microsoft Access。

https://www.runoob.com/sql/sql-func-count.html

len()函数

  • 返回文本字段中值的长度。
1
2
3
4
5
6
7
8
SQL中len语法
SELECT LEN(column_name) FROM table_name;

mysql中函数为length()
SELECT LENGTH(column_name) FROM table_name;

SELECT name, LENGTH(url) as LengthOfURL FROM Websites;
从websites表中用length函数得到url列各个值的长度,结果作为一个叫lengthofurl的新列,返回name和length(url)结果;

group_concat() 函数

  • 用来一次性全部得到所有username和password的结果,省去limit一个个看
1
select 1, group_concat(username),group_concat(password) from users limit 0,1 --+

从曾老师处学的