溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SQL語句簡介及練習(xí)

發(fā)布時間:2020-02-24 12:04:58 來源:網(wǎng)絡(luò) 閱讀:3294 作者:化澄風(fēng) 欄目:MySQL數(shù)據(jù)庫

SQL語句簡介及練習(xí)

SQL語言的興起與語法標(biāo)準

20世紀70年代,IBM開發(fā)出SQL,用于DB2

1981年,IBM推出SQL/DS數(shù)據(jù)庫

業(yè)內(nèi)標(biāo)準微軟和SybaseT-SQL,OraclePL/SQL

SQL作為關(guān)系型數(shù)據(jù)庫所使用的標(biāo)準語言,最初是基于IBM的實現(xiàn)在1986年被批準的。1987年,“國際標(biāo)準化組織(ISO)”ANSI(美國國家標(biāo)準化組織) SQL作為國際標(biāo)準。

SQLANSI SQL

SQL-86, SQL-89, SQL-92, SQL-99, SQL-03

 

SQL語言規(guī)范

在數(shù)據(jù)庫系統(tǒng)中,SQL語句不區(qū)分大小寫(建議用大寫)

但字符串常量區(qū)分大小寫

SQL語句可單行或多行書寫,以“;”結(jié)尾

關(guān)鍵詞不能跨多行或簡寫

用空格和縮進來提高語句的可讀性

子句通常位于獨立行,便于編輯,提高可讀性

注釋:

SQL標(biāo)準:

/*注釋內(nèi)容*/ 多行注釋

-- 注釋內(nèi)容 單行注釋,注意有空格

MySQL注釋:

除了SQL標(biāo)準外還可以用#

 

數(shù)據(jù)庫對象

數(shù)據(jù)庫的組件(對象)

數(shù)據(jù)庫、表、索引、視圖、用戶、存儲過程、函數(shù)、觸發(fā)器、事件調(diào)度器等

命名規(guī)則:

必須以字母開頭

可包括數(shù)字和三個特殊字符(# _ $#$盡量別用)

不要使用MySQL的保留字

同一database(Schema)下的對象不能同名,即使是不同類型的對象

 

SQL語句分類

SQL語句分類:

DDL: Data Defination Language

CREATE, DROP, ALTER

DML: Data Manipulation Language

INSERT, DELETE, UPDATE

DCLData Control Language

GRANT, REVOKE

DQLData Query Language

SELECT

 

SQL語句構(gòu)成

SQL語句構(gòu)成:

Keyword組成clause(子句)

多條clause組成語句

示例:

SELECT * SELECT子句

FROM products FROM子句

WHERE price>400 WHERE子句

說明:此為一組SQL語句,由三個子句構(gòu)成,SELECT,FROMWHERE是關(guān)鍵字

 

數(shù)據(jù)庫操作

創(chuàng)建數(shù)據(jù)庫:

CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME'; #創(chuàng)建數(shù)據(jù)庫

CHARACTER SET 'character set name' #指定字符集

COLLATE 'collate name' #指定排序方式

刪除數(shù)據(jù)庫

DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';

查看支持所有字符集:SHOW CHARACTER SET;

查看支持所有排序規(guī)則:SHOW COLLATION;

獲取命令使用幫助:

mysql> HELP KEYWORD;

例:HELP CREATE DATABASE;

看到基本用法及幫助文檔的鏈接,可以去看

URL: http://dev.mysql.com/doc/refman/5.5/en/create-database.html

查看數(shù)據(jù)庫列表:

mysql> SHOW DATABASES;

[root@centos7 ~]#cat /var/lib/mysql/db1/db.opt

default-character-set=latin1

default-collation=latin1_swedish_ci

 

表:二維關(guān)系

設(shè)計表:遵循規(guī)范

定義:字段,索引

字段:字段名,字段數(shù)據(jù)類型,修改符

約束,索引:應(yīng)該創(chuàng)建在經(jīng)常用作查詢條件的字段上

 

創(chuàng)建表

創(chuàng)建表:CREATE TABLE

(1) 直接創(chuàng)建

(2) 通過查詢現(xiàn)存表創(chuàng)建;新表會被直接插入查詢而來的數(shù)據(jù)

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options]

[partition_options] select_statement

(3) 通過復(fù)制現(xiàn)存的表的表結(jié)構(gòu)創(chuàng)建,但不復(fù)制數(shù)據(jù)

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }

注意:

Storage Engine是指表類型,也即在表創(chuàng)建時指明其使用的存儲引擎,同一庫中不同表可以使用不同的存儲引擎

同一個庫中表建議要使用同一種存儲引擎類型

 

創(chuàng)建表

CREATE TABLE [IF NOT EXISTS] 'tbl_name' (col1 type1 修飾符, col2 type2 修飾符, ...) #[IF NOT EXISTS]字段在腳本中一般要加

字段信息

?col type1

?PRIMARY KEY(col1,...)

?INDEX(col1, ...)

?UNIQUE KEY(col1, ...)

表選項:

?ENGINE [=] engine_name

SHOW ENGINES;查看支持的engine類型

?ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}

獲取幫助:mysql> HELP CREATE TABLE;

 

表操作

查看所有的引擎:SHOW ENGINES

查看表:SHOW TABLES [FROM db_name]

查看表結(jié)構(gòu):DESC [db_name.]tb_name

刪除表:DROP TABLE [IF EXISTS] tb_name

查看表創(chuàng)建命令:SHOW CREATE TABLE tbl_name

查看表狀態(tài):SHOW TABLE STATUS LIKE 'tbl_name'

查看庫中所有表狀態(tài):SHOW TABLE STATUS FROM db_name

 

數(shù)據(jù)類型

數(shù)據(jù)類型:

數(shù)據(jù)長什么樣?

數(shù)據(jù)需要多少空間來存放?

系統(tǒng)內(nèi)置數(shù)據(jù)類型和用戶定義數(shù)據(jù)類型

MySql支持多種列類型:

數(shù)值類型

日期/時間類型

字符串(字符)類型

https://dev.mysql.com/doc/refman/5.5/en/data-types.html

選擇正確的數(shù)據(jù)類型對于獲得高性能至關(guān)重要,三大原則:

更小的通常更好,盡量使用可正確存儲數(shù)據(jù)的最小數(shù)據(jù)類型

簡單就好,簡單數(shù)據(jù)類型的操作通常需要更少的CPU周期

盡量避免NULL,包含為NULL的列,對MySQL更難優(yōu)化(可填個默認值)

 

數(shù)據(jù)類型

SQL語句簡介及練習(xí)

 

數(shù)據(jù)類型

1、整型

tinyint(m) 1個字節(jié) 范圍(-128~127)

smallint(m) 2個字節(jié) 范圍(-32768~32767)

mediumint(m) 3個字節(jié) 范圍(-8388608~8388607)

int(m) 4個字節(jié) 范圍(-2147483648~2147483647)

bigint(m) 8個字節(jié) 范圍(+-9.22*1018次方)

取值范圍如果加了unsigned,則最大值翻倍,如tinyint unsigned的取值范圍為(0~255)

int(m)里的m是表示SELECT查詢結(jié)果集中的顯示寬度,并不影響實際的取值范圍,規(guī)定了MySQL的一些交互工具(例如MySQL命令行客戶端)用來顯示字符的個數(shù)。對于存儲和計算來說,Int(1)Int(20)是相同的

BOOLBOOLEAN:布爾型,是TINYINT(1)的同義詞。zero值被視為假。非zero值視為真

 

2、浮點型(floatdouble),近似值

float(m,d) 單精度浮點型 8位精度(4字節(jié)) m總個數(shù),d小數(shù)位

double(m,d) 雙精度浮點型16位精度(8字節(jié)) m總個數(shù),d小數(shù)位

設(shè)一個字段定義為float(6,3),如果插入一個數(shù)123.45678,實際數(shù)據(jù)庫里存的是123.457,但總個數(shù)還以實際為準,即6

 

3、定點數(shù)

在數(shù)據(jù)庫中存放的是精確值,存為十進制

decimal(m,d) 參數(shù)m<65 是總個數(shù),d<30 d<m 是小數(shù)位

MySQL5.0和更高版本將數(shù)字打包保存到一個二進制字符串中(每4個字節(jié)存9個數(shù)字)。例如,decimal(18,9)小數(shù)點兩邊將各存儲9個數(shù)字,一共使用9個字節(jié):小數(shù)點前的數(shù)字用4個字節(jié),小數(shù)點后的數(shù)字用4個字節(jié),小數(shù)點本身占1個字節(jié)

浮點類型在存儲同樣范圍的值時,通常比decimal使用更少的空間。float使用4個字節(jié)存儲。double占用8個字節(jié)

因為需要額外的空間和計算開銷,所以應(yīng)該盡量只在對小數(shù)進行精確計算時才使用decimal——例如存儲財務(wù)數(shù)據(jù)。但在數(shù)據(jù)量比較大的時候,可以考慮使用bigint代替decimal

 

4、字符串(char,varchar,_text)

char(n) 固定長度,最多255個字符

varchar(n)可變長度,最多65535個字符

tinytext 可變長度,最多255個字符

text 可變長度,最多65535個字符

mediumtext 可變長度,最多224次方-1個字符

longtext 可變長度,最多232次方-1個字符

BINARY(M) 固定長度,可存二進制或字符,長度為0-M字節(jié)

VARBINARY(M) 可變長度,可存二進制或字符,允許長度為0-M字節(jié)

內(nèi)建類型:ENUM枚舉, SET集合

 

charvarchar

?1.char(n) 若存入字符數(shù)小于n,則以空格補于其后,查詢之時再將空格去掉。所以char類型存儲的字符串末尾不能有空格,varchar不限于此。

?2.char(n) 固定長度,char(4)不管是存入幾個字符,都將占用4個字節(jié),varchar是存入的實際字符數(shù)+1個字節(jié)(n< n>255),所以varchar(4),存入3個字符將占用4個字節(jié)。

?3.char類型的字符串檢索速度要比varchar類型的快

varchartext

?1.varchar可指定n,text不能指定,內(nèi)部存儲varchar是存入的實際字符數(shù)+1個字節(jié)(n< n>255),text是實際字符數(shù)+2個字節(jié)。

?2.text類型不能有默認值

?3.varchar可直接創(chuàng)建索引,text創(chuàng)建索引要指定前多少個字符。varchar查詢速度快于text

 

5.二進制數(shù)據(jù):BLOB

?BLOBtext存儲方式不同,TEXT以文本方式存儲,英文存儲區(qū)分大小寫,而Blob是以二進制方式存儲,不分大小寫

?BLOB存儲的數(shù)據(jù)只能整體讀出

?TEXT可以指定字符集,BLOB不用指定字符集

6.日期時間類型

?date 日期 '2008-12-2'

?time 時間 '12:25:36'

?datetime 日期時間 '2008-12-2 22:06:44'

?timestamp 自動存儲記錄修改時間

?YEAR(2), YEAR(4):年份

timestamp字段里的時間數(shù)據(jù)會隨其他字段修改的時候自動刷新,這個數(shù)據(jù)類型的字段可以存放這條記錄最后被修改的時間

 

修飾符

所有類型:

?NULL 數(shù)據(jù)列可包含NULL

?NOT NULL 數(shù)據(jù)列不允許包含NULL

?DEFAULT 默認值

?PRIMARY KEY 主鍵

?UNIQUE KEY 唯一鍵

?CHARACTER SET name 指定一個字符集

數(shù)值型

?AUTO_INCREMENT 自動遞增,適用于整數(shù)類型

?UNSIGNED 無符號

 

示例

CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,
name VARCHAR(20)NOT NULL,age tinyint UNSIGNED);

DESC students;

CREATE TABLE students2 (id int UNSIGNED NOT NULL ,
name VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));

 

表操作

DROP TABLE [IF EXISTS] 'tbl_name'; [CASCADE](級聯(lián)刪除)

ALTER TABLE 'tbl_name'

字段:

添加字段:add

ADD col1 data_type [FIRST|AFTER col_name]

刪除字段:drop

修改字段:

alter(默認值), change(字段名), modify(字段屬性)

索引:

添加索引:add index

刪除索引: drop index

表選項

修改:

查看表上的索引:SHOW INDEXES FROM [db_name.]tbl_name;

查看幫助:Help ALTER TABLE

 

修改表示例

ALTER TABLE students RENAME s1;
ALTER TABLE s1 ADD phone varchar(11) AFTER name;
ALTER TABLE s1 MODIFY phone int;
ALTER TABLE s1 CHANGE COLUMN phone mobile char(11);
ALTER TABLE s1 DROP COLUMN mobile;
Help ALTER TABLE 查看幫助

 

修改表示例

ALTER TABLE students ADD gender ENUM('m','f')(enum單選/枚舉,set多選)
ALETR TABLE students CHANGE id sid int UNSIGNED NOT NULL PRIMARY KEY;
ALTER TABLE students ADD UNIQUE KEY(name);
ALTER TABLE students ADD INDEX(age);
DESC students;
SHOW INDEXES FROM students;
ALTER TABLE students DROP age;

 

DML語句

DML:INSERT, DELETE, UPDATE, SELECT

INSERT

一次插入一行或多行數(shù)據(jù)

語法

INSERT [L OW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]

{VALUES | VALUE} ({expr | DEFAULT},...),(...),...

[ ON DUPLICATE KEY UPDATE 如果重復(fù)更新之

col_name=expr

[, col_name=expr] ... ]

簡化寫法:

INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)

 

DML語句

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name

SET col_name={expr | DEFAULT}, ...

[ ON DUPLICATE KEY UPDATE

col_name=expr

[, col_name=expr] ... ]

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

[INTO] tbl_name [(col_name,...)]

SELECT ...

[ ON DUPLICATE KEY UPDATE

col_name=expr

[, col_name=expr] ... ]

 

DML語句

UPDATE

UPDATE [LOW_PRIORITY] [IGNORE] table_reference

SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...

[WHERE where_condition]

[ORDER BY ...]

[LIMIT row_count]

注意:一定要有限制條件,否則將修改所有行的指定字段

限制條件:

WHERE

LIMIT

Mysql 選項:--safe-updates| --i-am-a-dummy|-U

 

DML語句

DELETE:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name

[WHERE where_condition]

[ORDER BY ...]

[LIMIT row_count]

可先排序再指定刪除的行數(shù)

注意:一定要有限制條件,否則將清空表中的所有數(shù)據(jù)

限制條件:

WHERE

LIMIT

TRUNCATE TABLE tbl_name; 清空表

 

DQL語句

SELECT

[ALL | DISTINCT | DISTINCTROW ]

[SQL_CACHE | SQL_NO_CACHE]

select_expr [, select_expr ...]

[FROM table_references

[WHERE where_condition]

[GROUP BY {col_name | expr | position}

[ASC | DESC], ... [WITH ROLLUP]]

[HAVING where_condition]

[ORDER BY {col_name | expr | position}

[ASC | DESC], ...]

[LIMIT {[offset,] row_count | row_count OFFSET offset}]

[FOR UPDATE | LOCK IN SHARE MODE]

 

SELECT

字段顯示可以使用別名:

col1 AS alias1, col2 AS alias2, ...AS可不寫)

WHERE子句:指明過濾條件以實現(xiàn)“選擇”的功能:

過濾條件:布爾型表達式

算術(shù)操作符:+, -, *, /, %

比較操作符:=, !=, <>, <=, >, >=, <, <=

BETWEEN min_num AND max_num

IN (element1, element2, ...)

IS NULL

IS NOT NULL

 

SELECT

DISTINCT 去除重復(fù)列

SELECT DISTINCT gender FROM students;

LIKE:

%: 任意長度的任意字符

_:任意單個字符

RLIKE:正則表達式,索引失效,不建議使用

REGEXP:匹配字符串可用正則表達式書寫模式,同上

邏輯操作符:

NOT

AND

OR

XOR

 

SELECT

GROUP:根據(jù)指定的條件把查詢結(jié)果進行“分組”以用于做“聚合”運算

avg(), max(), min(), count(), sum()

建議:一旦用分組,前邊select只需要寫用以分組的字段,和統(tǒng)計的函數(shù),寫別的字段沒有意義

HAVING: 對分組聚合運算后的結(jié)果指定過濾條件(在分組前做過濾用where

ORDER BY: 根據(jù)指定的字段對查詢結(jié)果進行排序

升序:ASC

降序:DESC

示例:

MariaDB [db1]> select * from students order by score; 順序,NULL在前

MariaDB [db1]> select * from students order by -score desc; 順序,但NULL在后

LIMIT [[offset,]row_count]:對查詢的結(jié)果進行輸出行數(shù)數(shù)量限制

對查詢結(jié)果中的數(shù)據(jù)請求施加“鎖”

FOR UPDATE: 寫鎖,獨占或排它鎖,只有一個讀和寫

LOCK IN SHARE MODE: 讀鎖,共享鎖,同時多個讀(但只能有一個寫)

 

示例

DESC students;
INSERT INTO students VALUES(1,'tom','m'),(2,'alice','f');
INSERT INTO students(id,name) VALUES(3,'jack'),(4,'allen');
SELECT * FROM students WHERE id < 3;
SELECT * FROM students WHERE gender='m';
SELECT * FROM students WHERE gender IS NULL;
SELECT * FROM students WHERE gender IS NOT NULL;
SELECT * FROM students ORDER BY name DESC LIMIT 2;
SELECT * FROM students ORDER BY name DESC LIMIT 1,2;
SELECT * FROM students WHERE id >=2 and id <=4
SELECT * FROM students WHERE BETWEEN 2 AND 4
SELECT * FROM students WHERE name LIKE 't%'
SELECT * FROM students WHERE name RLIKE '.*[lo].*';
SELECT id stuid,name as stuname FROM students

 

練習(xí)

練習(xí)數(shù)據(jù)庫下載鏈接:https://pan.baidu.com/s/11Qk9yI9lx6oZVCGXhvQ6PQ

下載其中的hellodb_innodb.sql,輸命令mysql < hellodb_innodb.sql生成一個hellodb數(shù)據(jù)庫:

[root@centos7 ~]#mysql  #連接mariadb
MariaDB [(none)]> use hellodb  #使用hellodb數(shù)據(jù)庫
MariaDB [hellodb]> show tables;  #共有7張表

+-------------------+

| Tables_in_hellodb |

+-------------------+

| classes           |

| coc               |

| courses           |

| scores            |

| students          |

| teachers          |

| toc               |

+-------------------+

 

M            
向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI