注意:/*
SELECT - 從資料庫中提取資料
UPDATE - 更新資料庫中的資料
DELETE - 從資料庫中洗掉資料
INSERT INTO - 向資料庫中插入新資料
CREATE DATABASE - 創建新資料庫
ALTER DATABASE - 修改資料庫
CREATE TABLE - 創建新表
ALTER TABLE - 變更(改變)資料庫表
DROP TABLE - 洗掉表
CREATE INDEX - 創建索引(搜索鍵)
DROP INDEX - 洗掉索引
*/
/* 一.創建資料庫
SQL CREATE TABLE 陳述句
CREATE TABLE 陳述句用于創建資料庫中的表。
表由行和列組成,每個表都必須有個表名。
SQL 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 引數規定表中列的最大長度。
提示:如需了解 MS Access、MySQL 和 SQL Server 中可用的資料型別,請訪問我們完整的 資料型別參考手冊。
*/
--
create database lw
use lw
-- 二.創建表
create table lwweb
(id varchar(100) not null,
namecode varchar(100),
name varchar(100),
vip varchar(100),
price varchar(100),
PRIMARY KEY (ID) --約束 主鍵
)
-- 三.修改資料庫
/*
ALTER TABLE 陳述句
ALTER TABLE 陳述句用于在已有的表中添加、洗掉或修改列。
SQL ALTER TABLE 語法
如需在表中添加列,請使用下面的語法:
ALTER TABLE table_name
ADD column_name datatype
如需洗掉表中的列,請使用下面的語法(請注意,某些資料庫系統不允許這種在資料庫表中洗掉列的方式):
ALTER TABLE table_name
DROP COLUMN column_name
要改變表中列的資料型別,請使用下面的語法:
SQL Server / MS Access:
ALTER TABLE table_name
ALTER COLUMN column_name datatype
My SQL / Oracle:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype
Oracle 10G 之后版本:
ALTER TABLE table_name
MODIFY column_name datatype;
*/
alter table lwweb add vipname varchar(100)
alter table lwweb alter column id int
/* 四.插入資料
1.INSERT INTO 陳述句可以有兩種撰寫形式。
第一種形式無需指定要插入資料的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,...);
第二種形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
2.insert into select 和select into from 的區別
insert into scorebak select * from socre where neza='neza' --插入一行,要求表scorebak 必須存在
select * into scorebak from score where neza='neza' --也是插入一行,要求表scorebak 不存在
*/
insert into lwweb values (1,101,'黑米',100,10,'小王')
insert into lwweb values (2,102,'白米',100,10,'小黑')
insert into lwweb values (3,103,'黃米',100,10,'小白')
insert into lwweb values (4,104,'花米',100,10,'小杜')
insert into lwweb values (5,103,'黃豆',100,10,'大白')
insert into lwweb values (6,104,'花米',100,10,'大杜')
select distinct vip from lwweb -- distinct 去重
Select * from lwweb where vip is null; --空值判斷: is null
Select * from lwweb where vip between 1 and 100; --between and (在 之間的值)
/*
1.Like模糊查詢
Select * from emp where ename like 'M%';
查詢 EMP 表中 Ename 列中有 M 的值,M 為要查詢內容中的模糊資訊。
% 表示多個字值,_ 下劃線表示一個字符;
M% : 為能配符,正則運算式,表示的意思為模糊查詢資訊為 M 開頭的。
%M% : 表示查詢包含M的所有內容。
%M_ : 表示查詢以M在倒數第二位的所有內容。
2.where
不帶比較運算子的 WHERE 子句:
WHERE 子句并不一定帶比較運算子,當不帶運算子時,會執行一個隱式轉換。當 0 時轉化為 false,1 轉化為 true。例如:
SELECT studentNO FROM student WHERE 0
則會回傳一個空集,因為每一行記錄 WHERE 都回傳 false。
SELECT studentNO FROM student WHERE 1
回傳 student 表所有行中 studentNO 列的值。因為每一行記錄 WHERE 都回傳 true
3.ORDER BY
ORDER BY 多列的時候,先按照第一個column name排序,在按照第二個column name排序;如上述教程最后一個例子:
1)、先將country值這一列排序,同為CN的排前面,同屬USA的排后面;
2)、然后在同屬CN的這些多行資料中,再根據alexa值的大小排列。
3)、ORDER BY 排列時,不寫明ASC DESC的時候,默認是ASC。
ALLE
ORDER BY 多列的時候,eg:
order by A,B 這個時候都是默認按升序排列
order by A desc,B 這個時候 A 降序,B 升序排列
order by A ,B desc 這個時候 A 升序,B 降序排列
即 desc 或者 asc 只對它緊跟著的第一個列名有效,其他不受影響,仍然是默認的升序。
*/
select * from lwweb order by id desc --倒序排序
select * from lwweb order by id asc --正序排序
update lwweb set vip=200,price=20 where id=2
update lwweb set vip=300,price=30 where id=3
update lwweb set vip=400,price=40 where id=4
/*
SELECT TOP 子句用于規定要回傳的記錄的數目。
SELECT TOP 子句對于擁有數千條記錄的大型表來說,是非常有用的。
注意:并非所有的資料庫系統都支持 SELECT TOP 陳述句。 MySQL 支持 LIMIT 陳述句來選取指定的條數資料, Oracle 可以使用 ROWNUM 來選取。
*/
SELECT TOP 50 PERCENT * FROM lwweb;--percent 表示百分比(%)
--SQL LIKE 語法
--SELECT column_name(s)FROM table_name WHERE column_name LIKE pattern;
/*
通配符 描述
1.% 替代 0 個或多個字符
2._ 替代一個字符
3.[charlist] 字符列中的任何單一字符
4.[^charlist]或[!charlist] 不在字符列中的任何單一字符
MySQL 中使用 REGEXP 或 NOT REGEXP 運算子 (或 RLIKE 和 NOT RLIKE) 來操作正則運算式。
例如;下面的 SQL 陳述句選取 name 以 A 到 H 字母開頭的網站:
實體
SELECT * FROM Websites WHERE name REGEXP '^[A-H]';
*/
/*
IN 運算子
IN 運算子允許您在 WHERE 子句中規定多個值。
SQL IN 語法
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
IN 與 = 的異同
相同點:均在WHERE中使用作為篩選條件之一、均是等于的含義
不同點:IN可以規定多個值,等于規定一個值
IN
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
=
SELECT column_name(s)
FROM table_name
WHERE column_name=value1;
in 與 = 的轉換
select * from Websites where name in ('Google','菜鳥教程');
可以轉換成 = 的表達:
select * from Websites where name='Google' or name='菜鳥教程';
*/
/*
SQL SELECT INTO 語法
我們可以復制所有的列插入到新表中:
SELECT *
INTO newtable [IN externaldb]
FROM table1;
或者只復制希望的列插入到新表中:
SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1;
*/
select * into lwweb1 from lwweb
/*
通過 SQL,您可以從一個表復制資訊到另一個表。
INSERT INTO SELECT 陳述句從一個表復制資料,然后把資料插入到一個已存在的表中。
SQL INSERT INTO SELECT 陳述句
INSERT INTO SELECT 陳述句從一個表復制資料,然后把資料插入到一個已存在的表中。目標表中任何已存在的行都不會受影響。
SQL INSERT INTO SELECT 語法
我們可以從一個表中復制所有的列插入到另一個已存在的表中:
INSERT INTO table2
SELECT * FROM table1;
或者我們可以只復制希望的列插入到另一個已存在的表中:
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;
select into from 和 insert into select 都是用來復制表
兩者的主要區別為: select into from 要求目標表不存在,因為在插入時會自動創建;insert into select from 要求目標表存在。
1. 復制表結構及其資料:
create table table_name_new as select * from table_name_old
2. 只復制表結構:
create table table_name_new as select * from table_name_old where 1=2;
或者:
create table table_name_new like table_name_old
3. 只復制表資料:
如果兩個表結構一樣:
insert into table_name_new select * from table_name_old
如果兩個表結構不一樣:
insert into table_name_new(column1,column2...) select column1,column2... from table_name_old
稍微整理一下 select into from 和 insert into select 的理解層面的區別
select into from :將查詢出來的資料整理到一張新表中保存,表結構與查詢結構一致。
select *(查詢出來的結果) into newtable(新的表名)form where (后續條件)
即,查詢出來結果--->復制一張同結構的空表--->將資料拷貝進去。
insert into select :為已經存在的表批量添加新資料。
insert into (準備好的表) select *(或者取用自己想要的結構)frome 表名 where 各種條件
即,指定一張想要插入資料的表格--->對資料進行加工篩選--->填入一張準備好的表格。
*/
insert into lwweb1 select * from lwweb
/*
不同的 SQL JOIN
在我們繼續講解實體之前,我們先列出您可以使用的不同的 SQL JOIN 型別:
INNER JOIN:如果表中有至少一個匹配,則回傳行
LEFT JOIN:即使右表中沒有匹配,也從左表回傳所有的行
RIGHT JOIN:即使左表中沒有匹配,也從右表回傳所有的行
FULL JOIN:只要其中一個表中存在匹配,則回傳行
left join : 左連接,回傳左表中所有的記錄以及右表中連接欄位相等的記錄。
right join : 右連接,回傳右表中所有的記錄以及左表中連接欄位相等的記錄。
inner join : 內連接,又叫等值連接,只回傳兩個表中連接欄位相等的行。
full join : 外連接,回傳兩個表中的行:left join + right join。
cross join : 結果是笛卡爾積,就是第一個表的行數乘以第二個表的行數。
關鍵字 on
資料庫在通過連接兩張或多張表來回傳記錄時,都會生成一張中間的臨時表,然后再將這張臨時表回傳給用戶。
在使用 left jion 時,on 和 where 條件的區別如下:
1、 on 條件是在生成臨時表時使用的條件,它不管 on 中的條件是否為真,都會回傳左邊表中的記錄。
2、where 條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有 left join 的含義(必須回傳左邊表的記錄)了,條件不為真的就全部過濾掉
*/
select * from lwweb as a join lwweb1 as b on a.id=b.id
select * from lwweb as a full join lwweb1 as b on a.id=b.id
/*
SQL UNION 運算子
UNION 運算子用于合并兩個或多個 SELECT 陳述句的結果集。
請注意,UNION 內部的每個 SELECT 陳述句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每個 SELECT 陳述句中的列的順序必須相同。
SQL UNION 語法
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
注釋:默認地,UNION 運算子選取不同的值。如果允許重復的值,請使用 UNION ALL。
SQL UNION ALL 語法
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
注釋:UNION 結果集中的列名總是等于 UNION 中第一個 SELECT 陳述句中的列名。
*/
--union
select * from lwweb
union
select * from lwweb1
--union all
select * from lwweb
union all
select * from lwweb1
/*SQL 約束(Constraints)
SQL 約束用于規定表中的資料規則。
如果存在違反約束的資料行為,行為會被約束終止。
約束可以在創建表時規定(通過 CREATE TABLE 陳述句),或者在表創建之后規定(通過 ALTER TABLE 陳述句)。
SQL CREATE TABLE + CONSTRAINT 語法
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,
....
);
在 SQL 中,我們有如下約束:
NOT NULL - 指示某列不能存盤 NULL 值。
UNIQUE - 保證某列的每行必須有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的結合。確保某列(或兩個列多個列的結合)有唯一標識,有助于更容易更快速地找到表中的一個特定的記錄。
FOREIGN KEY - 保證一個表中的資料匹配另一個表中的值的參照完整性。
CHECK - 保證列中的值符合指定的條件。
DEFAULT - 規定沒有給列賦值時的默認值。
例如:
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P) //PRIMARY KEY約束
)
CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY, //PRIMARY KEY約束
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
---------------------------------------------------------
SQL NOT NULL 約束
在默認的情況下,表的列接受 NULL 值。
SQL NOT NULL 約束
NOT NULL 約束強制列不接受 NULL 值。
NOT NULL 約束強制欄位始終包含值。這意味著,如果不向欄位添加值,就無法插入新記錄或者更新記錄。
下面的 SQL 強制 "ID" 列、 "LastName" 列以及 "FirstName" 列不接受 NULL 值:
實體
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);
添加 NOT NULL 約束
在一個已創建的表的 "Age" 欄位中添加 NOT NULL 約束如下所示:
實體
ALTER TABLE Persons
MODIFY Age int NOT NULL;
洗掉 NOT NULL 約束
在一個已創建的表的 "Age" 欄位中洗掉 NOT NULL 約束如下所示:
實體
ALTER TABLE Persons
MODIFY Age int NULL;
-----------------------------------------------------------
SQL UNIQUE 約束
SQL UNIQUE 約束
UNIQUE 約束唯一標識資料庫表中的每條記錄。
UNIQUE 和 PRIMARY KEY 約束均為列或列集合提供了唯一性的保證。
PRIMARY KEY 約束擁有自動定義的 UNIQUE 約束。
請注意,每個表可以有多個 UNIQUE 約束,但是每個表只能有一個 PRIMARY KEY 約束。
CREATE TABLE 時的 SQL UNIQUE 約束
下面的 SQL 在 "Persons" 表創建時在 "P_Id" 列上創建 UNIQUE 約束:
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)
)
SQL Server / Oracle / MS Access:
CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
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)
)
ALTER TABLE 時的 SQL UNIQUE 約束
當表已被創建時,如需在 "P_Id" 列創建 UNIQUE 約束,請使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD UNIQUE (P_Id)
如需命名 UNIQUE 約束,并定義多個列的 UNIQUE 約束,請使用下面的 SQL 語法:
MySQL / SQL Server / Oracle / MS Access:
ALTER
uj5u.com熱心網友回復:
感謝分享, 基礎知識建議發到個人博客。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/41511.html
標籤:基礎類
上一篇:求助
下一篇:求教一個sql查詢相關語法
