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;html

過濾記錄:SQL where
select * from abc where column_name='中國';
文本字段使用單引號,數值字段不須要引號mysql

運算符:= <>(不等於) > < >= <= 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 的值。web

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_numbersql


插入新紀錄 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刪除表裏的內容,不釋放表空間,表結構仍在,數據能夠回滾恢復oracle

delete 語句是 dml, 這個操做會放到 rollback segement 中, 事務提交以後才生效; 若是有相應的 trigger, 執行的時候將被觸發。 truncate, drop 是 ddl, 操做當即生效, 原數據不放到 rollback segment 中, 不能回滾。 操做不觸發 trigger。
速度:drop>truncate>delete
安全性:沒有備份時當心使用drop和truncateapp

返回的記錄的數目: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 dateFROM Websites;格式化了日期和時間,只顯示年月日

相關文章
相關標籤/搜索