常用的命令简介
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);