SQL簡單使用-進階篇
先從《基礎篇》中提到的where子句裏面的通配符講起。
1.like 用於在where子句中搜索列中的指定模式
示例:select * from websites where name like ‘%oo%‘;
註:(%分號表示任意數據,_表示任意一個數據,動手練兩邊就能熟悉)
‘%G‘ 搜索以G結尾的數據
‘%g%‘ 搜索包含g的數據
‘G‘ 搜索以G開頭的兩位數據
‘G‘ 搜索以G結尾的兩位數據
‘G‘ 搜索包含G的三位數據
1.1 通配符還有一種(%、_和[charlist])
示例:[charlist]使用select * from websites where name REGEXP ‘^[A-H]‘;
2.between 用於選取介於兩個值之間的數據範圍內的值
示例:select * from websites where alexa between 1 and 20;
示例:添加not使用select * from websites where alexa not between 1 and 20;
示例:結合IN使用
select * from websites where ( alexa BETWEEN 1 and 20) and country in (‘USA‘,‘CN‘);
示例:文本
select * from websites where name between ‘A‘ and ‘H‘; 不包含H
3.top 用於規定返回記錄的數據,實用
示例:SQL server (SELECT TOP number|percent column_name(s) FROM table_name;)select top 50 percent * from websites;
示例:Oracle(SELECT column_name(s) FROM table_name WHERE ROWNUM <= number;)
select * from websites where ROWNUM <5;
示例:MYSQL (SELECT column_name(s) FROM table_name LIMIT number;)
select * from websites limit 3;
4.IN 操作符允許在where子句中規定多個值
示例:查看表websites中name列的多條數據select * from websites where name in(‘baidu‘,‘Google‘);
5.別名 可以為表名稱或列名稱指定別名。
語法:列名稱語法
SELECT column_name AS alias_name FROM table_name;
示例:select name AS n,country AS c from websites;
語法:表名稱語法
SELECT column_name(s) FROM table_name AS alias_name;
示例:select w.name,w.url,a.count,a.date from websites AS w ,access_log AS a where w.id=a.site_id and w.name=‘菜鳥教程‘;
註:
1.在查詢中涉及超過一個表
2.在查詢中都是用了函數
3.列名稱很長或者可讀性差 都需要把兩個列或者多個列結合在一起。
6.join 子句用於把來自兩個表或者多個表的行結合起來,基於這些表之間的共同字段
join類型有一下幾種:
INNER JOIN:如果表中有至少一個匹配,則返回行
LEFT JOIN:即使右表中沒有匹配,也從左表返回所有的行
RIGHT JOIN:即使左表中沒有匹配,也從右表返回所有的行
FULL JOIN:只要其中一個表中存在匹配,則返回行(MYSQL不支持)
首先,連接的結果可以在邏輯上看作是由SELECT語句指定的列組成的新表。
左連接與右連接的左右指的是以兩張表中的哪一張為基準,它們都是外連接。
外連接就好像是為非基準表添加了一行全為空值的萬能行,用來與基準表中找不到匹配的行進行匹配。假設兩個沒有空值的表進行左連接,左表是基準表,左表的所有行都出現在結果中,右表則可能因為無法與基準表匹配而出現是空值的字段。
來源:《數據庫系統原理教程》,王珊,陳紅編著,P86
示例: 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;
7.union 用於合並兩個或多個select語句的結果集
語法:
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
示例: union 去重
SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;
示例:union all 顯示所有包括重復部分
select country from websites
union all
select country from apps;
示例:帶有where的union all
select country,name from websites where country=‘CN‘
union all
select country,app_name from apps where country=‘CN‘ order by country;
- into 從一個表復制數據,把數據插入到另一個新表中
註:MySQL 數據庫不支持 SELECT ... INTO 語句,但支持 INSERT INTO ... SELECT 。
語法: 復制所有的列插入新表中SELECT * INTO newtable [IN externaldb] FROM table1;
語法:只復制希望的列插入到新表中SELECT column_name(s) INTO newtable [IN externaldb] FROM table1;
8.1 insert into select
示例:復制 "apps" 中的數據插入到 "Websites" 中:INSERT INTO websites (name,country) select app_name,country from apps;
- create 用於創建數據庫或者數據表
語法:創建數據庫create database db_name;
語法:創建數據表create table table_name ( column_name1 data_type(size), column_name2 data_type(size), column_name3 data_type(size), ... ... ); date_type 數據類型,size參數規定表中列的最大長度
示例:創建名稱為runoob的數據庫create database runoob;
示例:創一個student_informaton表,包含五列:student_id,student_name,student_class,student_tele,student_add
create table student_infomation
(
student_id int(10),
student_name char(4),
student_class char(10),
student_tele int(11),
student_add varchar(255)
);
前面是列名,後面跟的是對於列名的數據類型
10.約束 用於規定表中的數據規則
約束可以在創建表的時候通過create table語句規定,或者在表創建之後通過alter table語句規定
語法:crate table + constraint
create table table_name
(
column_name1 type_data(size) constraint,
column_name2 type_data(size) constraint,
column_name3 type_data(size) constraint,
... ...
);
在SQL中,我們有如下約束:
NOT NULL 指示某列不能存儲 NULL 值,強制字段始終包含值,否則就無法插入新記錄或者更新記錄。
UNIQUE 保證某列的每行必須有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的結合。確保某列(或兩個列多個列的結合)有唯一標識,有助於更容易更快速地找到表中的一個特定的記錄。
FOREIGN KEY 保證一個表中的數據匹配另一個表中的值的參照完整性。
CHECK 保證列中的值符合指定的條件。
DEFAULT 規定沒有給列賦值時的默認值。
10.1 not null約束 約束強制不接受到任何null值
示例: student_tele不能為空
create table student_information (
student_id INT (10) ,
student_name CHAR (4),
student_class CHAR (10),
student_tele INT (11) NOT NULL,
student_add VARCHAR (255)
);
10.2 UNIQUE 約束唯一標識數據庫表中的每條記錄。
UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。
PRIMARY KEY 約束擁有自動定義的 UNIQUE 約束。
請註意,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。
示例:MYSQL
create table student_information (
student_id INT (10),
student_name CHAR (4),
student_class CHAR (10),
student_tele INT (11),
student_add VARCHAR (255),
unique (student_id)
);
示例:SQL server/oracle
create table student_information (
student_id int (10) NOT NULL UNIQUE,
student_name CHAR (4),
student_class CHAR (10),
student_tele INT (11),
student_add VARCHAR (255),
);
示例:SQL mysql/server/oracle 定義過個列的unique約束。
create table student_information (
student_id int (10) NOT NULL UNIQUE,
student_name CHAR (4),
student_class CHAR (10),
student_tele INT (11),
CONSTRAINT stu_inf UNIQUE (student_id,student_name)
); 這裏的 stu_inf 為約束名稱constraint_name,自定義。
alter table時的unique約束
示例:
alter table student_information
add unique (student_id);
示例:添加多個unique,
alter table student_information
add constraint stu_inf unique (student_id,student_add);
撤銷unique約束
示例:mysql
alter table student_information
drop index stu_inf;
示例:SQL
alter table student_information
drop constraint stu_inf;
10.3 primary key 主鍵必須包含唯一的值,主鍵不能為null,每個表都應該有一個主鍵,並且是唯一的。
示例:參照unique,將其中的unique替換為 primary key即可。 上述有添加多個unique示例,如果改為primary 可以意思就是主鍵由添加的幾個列組成。
10.4 foreign key 約束
a.可以用來預防破壞表之間連接的行為
b.防止非法數據插入外鍵列,因為它必須是指向的那個表中的值之一
示例:MYSQL
create table websites(
id int(11) NOT NULL,
name char(20) NOT NULL,
url varchar(255) NOT NULL,
alexa int(11) NOT NULL,
country char(10) NOT NULL,
primary key (id),
foreign KEY (id) references apps(id)
);
示例:SQL server/oracle
CREATE TABLE websites
(
Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id int FOREIGN KEY REFERENCES apps(Id)
);
示例:MySQL/SQL Server/Oracle
CREATE TABLE websites
(
Id int NOT NULL,
OrderNo int NOT NULL,
Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id)
REFERENCES apps(Id)
);
alter table 使用foreign key約束
示例:
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
示例:如需命名 FOREIGN KEY 約束,並定義多個列的 FOREIGN KEY 約束
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
撤銷FOREIGN KEY約束
示例:mysql
alter table Orders drop index fk_PerOrders;
示例:SQL
alter table Orders drop constraint fk_PerOrders;
10.5 CHECK 約束
用於限制列中的值的範圍
示例:MYSQL
create table websites(
id int(11) NOT NULL,
name char(20) NOT NULL,
url varchar(255) NOT NULL,
alexa int(11) NOT NULL,
country char(10) NOT NULL,
check (id>0)
);
alter table 使用check約束alter table websites add check (id>0);
撤銷check約束(參照unique約束中的alter table)alter table websites drop check constraint_name;
10.6 DEFAULT 約束
1.用於向列中插入默認值
2.如果沒有規定其它值,那麽將默認值添加到所有的記錄
示例:MYSQL
create table student_information (
student_id INT (10) NOT NULL,
student_name CHAR (4),
student_class CHAR (10) DEFAULT ‘‘ comment ‘班級‘,
student_tele INT (11),
student_add VARCHAR (255)
); comment 是為 字段或列的屬性添加註釋用的
alter table 使用 default
示例:MYSQL
alter table websites
alter country set default ‘CN‘;
示例:SQL serveralter table websites add constraint ad_c default ‘CN‘ for country;
示例:oraclealter table websites modify country default ‘CN‘;
撤銷default約束
示例:MYSQL
alter table websites
alter country drop default;
示例:SQL server/oracle
alter tables websites
alter column country drop default;
- create index 用於在表中創建索引
在表中創建索引可以更高效的查詢數據,用戶無法查看到索引,他們只能被用來加速搜索/查詢。
註:更新一個包含索引的表所耗費的時間比沒有索引表的時間更長,這是由於索引本身也需要更新。因此,理想的做法是僅僅在嘗嘗被所有的列(及表)上面創建索引。
語法:創建一個簡單的索引,允許使用重復的值create index index_name ON table_name (column_name);
語法:在表中創建唯一的索引,不允許使用重復的值(create unique table):唯一的索引意味著兩個行不能擁有相同的索引值。create UNIQUE index index_name ON table_name (column_name);
示例:將websites表中name列中創建名為web_index的索引。create index web_index ON websites (name);
12.drop 可以刪除表,索引和數據庫
DROP INDEX 語句用於刪除表中的索引。
用於 SQL Server 的 DROP INDEX 語法:DROP INDEX table_name.index_name
用於 DB2/Oracle 的 DROP INDEX 語法:DROP INDEX index_name
用於 MySQL 的 DROP INDEX 語法:ALTER TABLE table_name DROP INDEX index_name
DROP TABLE 語句用於刪除表。
DROP DATABASE 語句用於刪除數據庫。
僅僅需要刪除表內的數據,但並不刪除表本身TRUNCATE TABLE table_name
13.ALTER TABLE 用於在已有的表中添加、刪除或修改列。
添加列的語法:ALTER TABLE table_name ADD column_name datatype;
刪除表中的列語法:ALTER TABLE table_name DROP COLUMN column_name datatype;
改變表中數據類型語法:ALTER TABLE table_name MODIFY COLUMN column_name datatype;
示例: 在website表中添加名為column_date的列,然後修改列的數據類型,刪除添加的列
alter table websites add column_date date; 添加
alter table websites modify column column_date year;修改
alter table websites drop column column_date; 刪除
參考菜鳥教程請添加鏈接描述整理的筆記
SQL簡單使用-進階篇