use RUNOOB; 命令用于选择数据库。
show tables;展示数据库
set names utf8; 命令用于设置使用的字符集。
1 SELECT TOP 子句用于规定要返回的记录的数目:
sql server
SELECT TOP number|percent column_name(s)/* FROM table_name
SELECT TOP 2 * FROM Persons:从上面的 "Persons" 表中选取头两条记录
SELECT TOP 50 PERCENT * FROM Persons:从上面的 "Persons" 表中选取 50% 的记录
mysql:
SELECT column_name(s) FROM table_name LIMIT number;
oracle:
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number
2 列名拼接
我们把三个列(url、alexa 和 country)结合在一起,并创建一个名为 "site_info" 的别名
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;
3 UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集(不重复)
UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型
4 UNION ALL:来选取重复的值
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;
5 SELECT INTO 语句:您可以从一个表复制信息到另一个表(自动生成新表),不复制表结构
可以复制所有的列插入到新表中
SELECT *
INTO newtable
FROM table1
where 条件;
只复制希望的列插入到新表中:
SELECT column_name(s)
INTO newtable
FROM table1;
复制多个表中的数据插入到新表中:
SELECT Websites.name, access_log.count, access_log.date
INTO WebsitesBackup2016
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id;
拷贝表结构及数据:
CREATE TABLE table_name(新表)
AS
SELECT * FROM 旧表
6 INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中(已存在的表),不复制表结构
我们可以从一个表中复制所有的列插入到另一个已存在的表中:
INSERT INTO table2
SELECT * FROM table1;
或者我们可以只复制希望的列插入到另一个已存在的表中:
INSERT INTO table2
(column_name1,column_name2,..)
SELECT column_name(s)
FROM table1;
总结:
select into from 和 insert into select 都是用来复制表
两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建;insert into select from 要求目标表存在。
7 创建数据库:CREATE DATABASE dbname;删除数据库: DROP DATABASE database_name
8 创建表:
CREATE TABLE 语法:
CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
column_name 参数规定表中列的名称。
data_type 参数规定列的数据类型(例如 varchar、integer、decimal、date 等等)。
size 参数规定表中列的最大长度。
删除表
DROP TABLE table_name:删除表,包括表结构包括表数据
TRUNCATE TABLE table_name:需要删除表内的数据,但并不删除表本身
9 CREATE INDEX 语句用于在表中创建索引:作用以便更加快速高效地查询数据
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name
ON table_name (column_name)
如果您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开:
CREATE INDEX index_name
ON Persons (column_name1, column_name2)
CREATE UNIQUE INDEX 语法:在表上创建一个唯一的索引。不允许使用重复的值:唯一的索引意味着两个行不能拥有相同的索引值
CREATE UNIQUE INDEX index_name
ON table_name (column_name)
删除索引:DROP INDEX index_name/DROP INDEX index_name ON table_name
alter table table_name drop index index_name
10 SQL 约束(Constraint)
约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)
CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name(索引名称),
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
NOT NULL - 指示某列不能存储 NULL 值。--------->null空值约束,ALTER TABLE Persons MODIFY Age int NOT NULL;ALTER TABLE Persons MODIFY Age int NULL;
SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NULL:查询地址是空的数据
SELECT LastName,FirstName,Address FROM Persons WHERE Address IS NOT NULL:查询地址不是空的数据
UNIQUE - 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
CHECK - 保证列中的值符合指定的条件。
DEFAULT - 规定没有给列赋值时的默认值。
My SQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)
修改约束:
ALTER TABLE Persons
MODIFY Age int NULL;
添加约束:
ALTER TABLE Persons
ADD UNIQUE (P_Id)
MySQL:数据库添加约束
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)------1
)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,------------2
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
如需命名UNIQUE 约束,并定义多个列的UNIQUE 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)--------------并定义多个列的UNIQUE 约束
)
===>
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
alter table table_name drop constraint constraint_name/primary key/check/unique/default/foreign key/not null
drop database daatbase_name;用于删除数据库
drop table tablename:删除表内的数据,也删除表本身
TRUNCATE TABLE table_name;仅需要删除表内的数据,但并不删除表本身
ALTER TABLE 语句用于在已有的表中添加、删除或修改列:add(添加)/modify(修改)/drop(删除)/alter(修改)
如需在表中添加列,请使用下面的语法:
ALTER TABLE table_name
ADD column_name datatype,
modify/alter column column_name datatype,
alter table table_name
drop column(必要字段) column_name:删除列
Auto-increment 会在新记录插入表中时生成一个唯一的数字,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1
要让 AUTO_INCREMENT 序列以其他的值起始,请使用下面的 SQL 语法:
ALTER TABLE Persons AUTO_INCREMENT=100,默认值从100开始
视图是基于SQL语句的结果集的可视化的表:视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
SQL CREATE VIEW 语法:
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
select * from view_name:查询视图
删除视图:DROP VIEW view_name
SQL 函数:聚合函数
AVG() - 返回数值列平均值:SELECT AVG(column_name) FROM table_name
SELECT site_id, count FROM access_log WHERE count > (SELECT AVG(count) FROM access_log);子嵌套查询
COUNT() - 返回函数返回指定列的值的行数
COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入):SELECT COUNT(column_name) FROM table_name;SELECT COUNT(*) FROM table_name:统计所有数量
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:SELECT COUNT(DISTINCT column_name) FROM table_name;
FIRST() - 返回列第一个记录的值:SELECT FIRST(column_name) FROM table_name;
LAST() - 返回列最后一个记录的值
MAX() - 返回指定列最大值
MIN() - 返回指定列最小值
SUM() - 返回数值列总和
标注函数( Scalar)
UCASE() - 将某个字段转换为大写
LCASE() - 将某个字段转换为小写
MID() - 从某个文本字段提取字符,MySql 中使用
SubString(字段,1,end) - 从某个文本字段提取字符
LEN() - 返回某个文本字段的长度
ROUND() - 对某个数值字段进行指定小数位数的四舍五入
NOW() - 返回当前的系统日期和时间
FORMAT() - 格式化某个字段的显示方式
GROUP BY 语句:GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
SQL GROUP BY 语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
having aggregate_function(column_name) operator value
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
例子:SELECT site_id, SUM(count) AS num FROM access_log GROUP BY site_id----统计 access_log 各个 site_id 的访问量
EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
查找总访问量(count 字段)大于 200 的网站是否存在。
SELECT Websites.name, Websites.url
FROM Websites
WHERE EXISTS (SELECT count FROM access_log WHERE Websites.id = access_log.site_id AND count > 200);
INNER JOIN on:如果表中有至少一个匹配,则返回行
LEFT JOIN on:即使右表中没有匹配,也从左表返回所有的行,没有匹配的用null代替
RIGHT JOIN on:即使左表中没有匹配,也从右表返回所有的行,没有匹配的用null代替
FULL JOIN on:只要其中一个表中存在匹配,则返回行