SQL语句入门总结整理

常用的命令简介

use RUSELECT - 从数据库中提取数据
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
use RUNOOB; 命令用于选择数据库。
set names utf8; 命令用于设置使用的字符集。
SELECT * FROM Websites; 读取数据表的信息。

具体的命令实例

去重查询

SELECT DISTINCT country FROM Websites; 

条件筛选,and 和or

SELECT * FROM Websites WHERE country='CN';  
SELECT * FROM Websites
WHERE country='CN'
AND alexa > 50;
SELECT * FROM Websites
WHERE country='USA'
OR country='CN';

结果排序(可多列)默认升序

多列先排第一列,第一列相同按第二列排序。
DESC只对紧邻的列影响,其他仍然保持默认。

SELECT * FROM Websites
ORDER BY country,alexa DESC;

插入行

没有指定要插入数据的列名的形式需要列出插入行的每一列数据

INSERT INTO Websites (name, url, alexa, country)
VALUES ('百度','https://www.baidu.com/','4','CN');

更新已存在的记录

执行没有where语句的UPDATE语句会将表中所有的数据修改,要慎重使用。
mysql可以设置参数使得update语句必须携带where条件,否则报错set sql_safe_updates=1

UPDATE Websites 
SET alexa='5000', country='cn' 
WHERE name='baidu';

删除

DELETE FROM Websites
WHERE name='百度' AND country='CN';

SQL关于删除的三个语句:DROP、TRUNCATE、 DELETE 的区别。
DROP test;删除表并释放空间,删除的一干二净。

DROP test;

DELETE 删除指定内容或删除整个表,保留表的定义,不释放空间(保留在表的回滚段中)。

DELETE FROM test;
DELETE  * FROM test;

TRUNCATE
删除表中的内容并释放空间(不能回滚),不删除表的定义,保留表的结构。

TRUNCATE test;

返回指定条数

Mysql

SELECT *
FROM Persons
LIMIT 5;

搜索指定的模式

搜索name以k结尾的记录

SELECT * FROM Websites
WHERE name LIKE '%k';

搜索不以k结尾的记录

SELECT * FROM Websites
WHERE name NOT LIKE '%k';

通配符

% 替代 0 个或多个字符
_ 替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]或[!charlist] 不在字符列中的任何单一字符
MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。

选取 name 不以 A 到 H 字母开头的网站

SELECT * FROM Websites
WHERE name REGEXP '^[^A-H]';

IN && NOT IN操作符

与where语句搭配 选取在一个集合中的多个值

SELECT * FROM Websites
WHERE name IN ('Google','baidu');

BETWEEN&&NOT BETWEEN操作符

可以操作数字、字符、日期

SELECT * FROM Websites
WHERE alexa BETWEEN 1 AND 20;
SELECT * FROM Websites
WHERE alexa NOT BETWEEN 1 AND 20;

别名

使sql语句更简短

SELECT name AS n, country AS c
FROM Websites;

连接

在使用 join 时,on 和 where 条件的区别如下:
1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉

INNER JOIN

SELECT Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count;

LEFT JOIN

LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

SELECT Websites.name, access_log.count, access_log.date
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;

RIGHT JOIN

RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

SELECT Websites.name, access_log.count, access_log.date
FROM access_log
RIGHT JOIN Websites
ON access_log.site_id=Websites.id
ORDER BY access_log.count DESC;

FULL JOIN

关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行

UNION

用户合并多个SELECT语句的结果集

SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;

UNION 会默认去掉重复结果 UNION ALL 保存重复的结果。

SELECT INTO

Mysql不支持
从一个表复制数据插入到另一个新表中

SELECT *
INTO WebsitesBackup2016
FROM Websites
WHERE country='CN';

INSERT INTO SELECT

要求目标表已经存在

INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps
WHERE id=1;

CREATE INDEX

可以在表上创建不止一个索引

CREATE INDEX index_name
ON table_name (column_name)

DROP(Mysql)

删除索引

ALTER TABLE table_name DROP INDEX index_name

删除表

DROP TABLE table_name
删除表,保留表结构

```sql
TRUNCATE TABLE table_name
删除数据库
```sql
DROP DATABASE database_name

ALTER TABLE

添加列

ALTER TABLE table_name
ADD column_name datatype

删除列

ALTER TABLE table_name
DROP COLUMN column_name

修改列数据类型

ALTER TABLE table_name
MODIFY COLUMN column_name datatype

视图

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。
视图创建

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No

视图查询

SELECT * FROM [Current Product List]

视图更新

CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

视图删除

DROP VIEW view_name

视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。
视图提供了一个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限)
从而加强了安全性,使用户只能看到视图所显示的数据。
视图还可以被嵌套,一个视图中可以嵌套另一个视图。

数据类型

在 MySQL 中,有三种主要的类型:Text(文本)、Number(数字)和 Date/Time(日期/时间)类型。

AVG()

SELECT site_id, count FROM access_log
WHERE count > (SELECT AVG(count) FROM access_log);

count()

计数

SELECT COUNT(count) AS nums FROM access_log
WHERE site_id=3;
SELECT COUNT(DISTINCT site_id) AS nums FROM access_log;

MAX() MIN()

SELECT MAX(alexa) AS max_alexa FROM Websites;
SELECT MIN(alexa) AS min_alexa FROM Websites;

SUM()

SELECT SUM(count) AS nums FROM access_log;

GROUP BY()

SELECT site_id, SUM(access_log.count) AS nums
FROM access_log GROUP BY site_id;
SELECT Websites.name,COUNT(access_log.aid) AS nums FROM access_log
LEFT JOIN Websites
ON access_log.site_id=Websites.id
GROUP BY Websites.name;

HAVING

SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log
INNER JOIN Websites
ON access_log.site_id=Websites.id)
GROUP BY Websites.name
HAVING SUM(access_log.count) > 200;

EXISTS

SELECT Websites.name, Websites.url 
FROM Websites 
WHERE EXISTS (SELECT count FROM access_log WHERE Websites.id = access_log.site_id AND count > 200);

猜你喜欢

转载自blog.csdn.net/tianyouououou/article/details/105306195
今日推荐