SQL学习笔记

·SQL语法
SQL语句在数据库中执行的大部分工作,如select * from abc;
sql语句对大小写不敏感,语句后面的分号一定要有
SELECT - 从数据库中提取数据
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
返回唯一不同的值,即不搜索重复的值:SQL select distinct
select distinct column_name from abc;

过滤记录:SQL where
select * from abc where column_name='中国';
文本字段使用单引号,数值字段不需要引号

运算符:= <>(不等于) > < >= <= between like(搜索某种模式) in(指定针对某个列的多个可能值)
逻辑运算 and or not
特殊条件 is null, between and, in,
Select * from emp where sal in (5000,3000,1500);查询 EMP 表 SAL 列中等于 5000,3000,1500 的值。

Select * from emp where ename like 'M%';
查询 EMP 表中 Ename 列中有 M 的值,M 为要查询内容中的模糊信息。
% 表示多个字值,_ 下划线表示一个字符;
M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
%M% : 表示查询包含M的所有内容。
%M_ : 表示查询以M在倒数第二位的所有内容。

对结果集排序 order by 默认会按照升序进行排序ASC,若按照降序使用DESC
select * from abc order by column_name_number DESC;
order by 多列,这个也好理解:select * from abc order by country,column_name_number


插入新纪录 SQL insert into
第一种只需提供插入的值,第二中提供插入的值和对应的列名
插入新行
INSERT INTO Websites (name, url, alexa, country)
VALUES ('百度','https://www.baidu.com/','4','CN');
id 列是自动更新的,表中的每条记录都有一个唯一的数字
在指定的列插入数据
INSERT INTO Websites (name, url, country)VALUES ('stackoverflow', 'http://stackoverflow.com/', 'IND');
没有指定的列按照默认值

更新表中的记录SQL update
UPDATE Websites SET alexa='5000', country='USA' WHERE name='菜鸟教程';
如果不设置where则代表每行都进行更新,没有where的更新语句慎用
在 MySQL 中可以通过设置 sql_safe_updates 这个自带的参数来解决

删除表中记录SQL delete
delete from abc where column_name='百度';
三个删除的语句区别:delete,drop,truncate
drop删除表,并释放表空间。删的一干二净
truncate删除表里的内容并释放表空间,但是表的结构仍在,数据不可回滚恢复
delete删除表里的内容,不释放表空间,表结构仍在,数据可以回滚恢复

delete 语句是 dml, 这个操作会放到 rollback segement 中, 事务提交之后才生效; 如果有相应的 trigger, 执行的时候将被触发。 truncate, drop 是 ddl, 操作立即生效, 原数据不放到 rollback segment 中, 不能回滚。 操作不触发 trigger。
速度:drop>truncate>delete
安全性:没有备份时小心使用drop和truncate

返回的记录的数目:SQL select top, limit(Mysql),rownum(Oracle)
SELECT * FROM Persons LIMIT 5;mysql中
select * from persons where rownum <=5;oracle中
select Top 50 percent * from websites;Sql server中

模糊查询Sql like
选取name以字母G开始的所有客户 select * from websites where name like 'G%';
select * from websites where name like 'G_'两位且开头字母是G

通配符 % - [] [^] [!]
规定操作符 IN 可以规定多个值,而=只能规定一个,转换的话可以通过or拆开 select * from websites where name IN ('Google','草鸟继承');

区间查询 between and,可以配合IN使用
SELECT * FROM Websites WHERE (alexa BETWEEN 1 AND 20) AND country NOT IN ('USA', 'IND');

别名:让列名称的可读性更强 通过as进行别名指定 select column_name as Cname from abc;
SELECT w.name, w.url, a.count, a.date FROM Websites AS w, access_log AS a
WHERE a.site_id=w.id and w.name="菜鸟教程";

多表连接(join)
SQL join基于这些表之间的共同字段,常见的SQL inner join
SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites INNER JOIN access_log ON Websites.id=access_log.site_id;
不同的join
INNER JOIN:如果表中有至少一个匹配,则返回行,如果在匹配的那个表中没有这个表的佩佩,则不显示在最后join的那个表
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行(右边的表没匹配左边的表所有字段也要添加到join中)
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行,与left join相反,右边的字段都加入join中
FULL JOIN:只要其中一个表中存在匹配,则返回行

Union操作符:合并两个或多个select语句的结果,每个select语句必须有相同数量的列,。列也必须有相似的数据类型,同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT country FROM Websites UNION SELECT country FROM apps
ORDER BY country;
这里不包含重复的值

SELECT country FROM Websites
UNION ALL SELECT country FROM apps
ORDER BY country;
这里包含重复的值

复制一个表的信息到另一个表(新表)
select into(部分数据库支持这样的写法)
SELECT Websites.name, access_log.count, access_log.date
INTO WebsitesBackup2016
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id;

insert into select 是复制一个表的数据插入到一个已经存在的表中,与上面的不同
INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps;

创建数据库CREATE DATABASE my_db;
创建表:
CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

约束:规定表中的数据规则,创建表示可以规定,表创建之后也可以规定
create table+constraint,包括not null, unique,primary key,check,default
UNIQUE (P_Id),
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)表也存在
定义多个列的primary key的约束
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
撤销约束:Alter table persons drop constraint uc_personId

foreign key约束
只能说一个表(persons)的列是另一个(orders)的外键,预防破坏表之间连接的行为。
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)
cascade在删除表的时候很有用
ALTER TABLE 表名
ADD CONSTRAINT 外键约束名
FOREIGN KEY (column1, column2,...column_n)
REFERENCES 外键所依赖的表 (column1,column2,...column_n)
ON DELETE CASCADE;--级联删除

限制列中的值得范围:check
P_id int not null check(P_id>0);
撤销check约束 alter table persons drop check chk_person

默认值:default
撤销default约束 alter table persons alter column city drop default

创建索引:create index 加快查询,尽在需要搜索的列上创建索引
删除索引,表,数据库,仅仅删除数据使用truncate

添加修改删除列
add drop alter
改变字段的数据类型,alter persons alter date year,将date字段的数据类型改为了year

AUTO_INCREMENT 关键字来执行自动递增主键字段的值,id得值就是这样的,每个数据写法不同,不一一列出了


创建视图create view
CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName

在视图中添加某列
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No
撤销视图:drop view view_name;


通用数据类型:Date 存储年月日
time存储小时分秒
timestamp 存储年月日时分秒
interval 存储整数字段,代表时间取决于区间的类型
xml存储xml数据
http://www.runoob.com/sql/sql-datatypes-general.html

sql內建函数
Aggregate函数从列中取得值,返回一个单一的值
如AVG();Count();Max()
Scalar函数基于输入值,返回一个单一的值
Ucase(转化为大写)Lcase(转换为小写)Len(返回字段长度)
SELECT AVG(count) AS CountAverage FROM access_log;
SELECT COUNT(count) AS nums FROM access_log
WHERE site_id=3;
SELECT name AS FirstSite FROM Websites LIMIT 1;选择第一个记录的值
SELECT name FROM Websites ORDER BY id DESC LIMIT 1;选择最后一个记录的值,通过 order by 字段 desc

结合聚合函数,根据一个或多个列对结果集进行分组
Group by
统计 access_log 各个 site_id 的访问量:
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,where关键字无法和聚合函数一起使用
这个是筛选的条件,之前得使用Group by进行分组,他俩同时出现
SELECT Websites.name, SUM(access_log.count) AS nums FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
WHERE Websites.alexa < 200
GROUP BY Websites.name
HAVING SUM(access_log.count) > 200;

从文本字段中提取字符
Mid();
select MID(name,1,4)as shortTitle from websites;
name 和start起始位置必须有,返回字符数可以选择或者不选
oracle中没有这个,代替的是substr();

返回当前系统给的日期和时间
now();
SELECT name, url, Now() AS date
FROM Websites;

对字段的显示进行格式化
format();
SELECT name, url, DATE_FORMAT(Now(),'%Y-%m-%d') AS date
FROM Websites;格式化了日期和时间,只显示年月日

posted on 2019-01-09 15:54  莫林李忠利  阅读(243)  评论(0编辑  收藏  举报

导航