Mysql------SQL語句
關系型數據庫的常見組件
數據庫:database
表:table
行:row #可以叫記錄
列:column #字段,屬性,域
索引:index
視圖:view
用戶:user
權限:privilege
存儲過程:procedure,無返回值
存儲函數:function有返回值 #與bash裏的函數有區別
觸發器:trigger
事件調度器:event scheduler,任務計劃
SQL語句分類
DDL: Data Defination Language 數據定義語言
CREATE(增,創建表),DROP(刪),ALTER(修改數據庫的具體資源的架構,如表的結構
,不是改數據庫中的數據)DML: Data Manipulation Language 數據操縱語言,#是對數據庫中數據的操作
INSERT,DELETE,UPDATE,SELECT
DCL:Data Control Language 數據控制語言,#權限問題
GRANT,REVOKE,COMMIT,ROLLBACK
DQL:Data Query Language 數據查詢語言 #主要用來查詢語句的
SELECT
SQL語句構成:
Keyword組成clause(字句)
多條clause組成語句
示例:
SELECT * SELECT子句
FROM products(後面跟表名) FROM子句
WHERE price>400 (後面跟條件) WHERE子句
說明:一組SQL語句,由三個子句構成,SELECT,FROM和WHERE是關鍵字
數據庫操作
創建數據庫: CREATE DATABASE(關鍵字,對應的資源,如視圖,觸發器等)|SCHEMA [IF NOT EXISTS] (可有可無,如果不存 在,就創建數據庫,)‘DB_NAME(數據庫名)‘; CHARACTER SET ‘character set name‘(字符集)
COLLATE‘collate name‘(排序方式) eg:[root@centos7 ~]# mysql -uroot -S /mysqldb/3307/socket/mysql.sock -p111111 MariaDB [(none)]> show databases 查看當前的數據庫列表,默認為4個 -> ; +----------------- -+ | Database | +--------------------+ | information_schema (虛擬的數據庫,在內存裏)| | mysql | | performance_schema | | test (測試數據庫| +-------------------- + 4 rows in set (0.00 sec) MariaDB [(none)]> drop database db1
MariaDB [(none)]> show databases -> ; +--------------------+ | Database | +--------------------+ | db1 | | information_schema | | mysql | | performance_schema | | test | +--------------------+ 1:刪除數據庫 DROP DATABASE|SCHEMA [IF EXISTS] ‘DB_NAME‘; MariaDB [(none)]> drop database db1:
2:查看支持所有字符集:SHOW CHARACTER SET;
show character set; 3:查看支持所有排序規則:SHOW COLLATION;
show collation; 4:獲取命令使用幫助: mysql> HELP KEYWORD;
MYSQL>help keyword; 5:查看數據庫列表: mysql> SHOW DATABASES;
mysql>show databases;
6:MariaDB [(none)]> use db1 指定當前數據庫db1
Database changed
MariaDB [db1]> show tables; 查看表的列表
Empty set (0.00 sec)
註意:mysql 客戶的的命令結束不用加‘;’而SQL標準語句中的需加‘;’
表
1:表:二維關系:
2:設計表:遵循規範
3:定義:字段,索引
字段:字段名,字段數據類型,修飾符
約束,索引:應該創建在經常用作查詢條件的字段上
註意:表的名稱,字段名,屬性,數據類型,一旦定義了,就不要改了,改的話會影響表中的數據
創建表:CREATE TABLE
(1) 直接創建
MariaDB [db1]>create table students ( id tinyint unsigned not null primary key,name
char(10) not null,sex char(1),phone char(11) );
解釋:(第一項為創建的id,采用最小的整數,不為空,且為主鍵;第二項為姓名;給定十個字符;
第四個為性別,給一個字符;第五項為電話號碼,設定為11個字符)
(11) 直接創建
MariaDB [db1]> create table emp ( id int unsigned auto_increment primary key, name varchar(30)
not null, sex char(1) default ‘m‘, address varchar(100) ) engine=innodb charset=utf8; (id:正整數,auto_increment自動遞增, 主鍵 name:varchar長度30,性別,default ‘m‘默認值定義為m,
地址varchar(100), engine=innodb定義數據庫的存儲引擎 charset=utf8定義字符集)
(2) 通過查詢現存表創建;新表會被直接插入查詢而來的數據 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options]
[partition_options] select_statement
auto_increment:數字自動遞增; unsigned 放在int定義數字的後面
註意:一個漢字,字母數字在char裏都算一個字符。primary key放在最後;添加各種修飾符要註意前後順序,如上例中,如果將修飾符的順序更改則會報錯不能生成此表;
eg:MariaDB [db1]> create table user select user,host,password from mysql.user; 利用一個現存的表,創建一個新表,新表會被直接插入查詢而來的數據
2:如果只想模仿查詢舊表創建一個無記錄的表我們可以加入條件 WHERE 0=1;
(3) 通過復制現存的表的表結構創建,但不復制數據 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }
通過復制現存的表的表結構創建,但不復制數據
CREATE TABLE user3 LIKE mysql.user;
:註意:
Storage Engine是指表類型,也即在表創建時指明其使用的存儲引擎,同一 庫中不同表可以使用不同的存儲引擎
同一個庫中表建議要使用同一種存儲引擎類型
1:CREATE TABLE [IF NOT EXISTS] ‘tbl_name’ (col1 type1 修飾符, col2 type2 修飾符, ...)
2:字段信息
? col type1
? PRIMARY KEY(col1,...)
? INDEX(col1, ...)
? UNIQUE KEY(col1, ...)
3:表選項:
? ENGINE [=] engine_name
SHOW ENGINES;查看支持的engine類型
? ROW_FORMAT [=]
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
4:獲取幫助:mysql> HELP CREATE TABLE;
表操作
查看所有的引擎:SHOW ENGINES
查看表:SHOW TABLES [FROM db_name]
查看表結構:desc tbl_name;如:desc students
查看表創建命令:SHOW CREATE TABLE tbl_name
查看表狀態:show table status like ‘tbl_name;
查看庫中所有表狀態:SHOW TABLE STATUS FROM db_name
查看單個表狀態:show table status like ‘tbl_name’\G; (表名必須要加引號)
查看創建表的命令:show create table tbl_name;
查看指定庫中所有表狀態:show table status from dbl_name;
查看庫裏的表;(首先進入到此庫中然後查看):show tables;
刪除庫裏的某個表: (首先還是要進入到存放此表的庫裏,查看後刪除):drop table tbl_name;
數據類型
選擇正確的數據類型對於獲得高性能至關重要
三大原則
1:更小的通常更好,盡量使用可正確存儲數據的最小數據類型:
2:簡單就好,簡單數據類型的操作通常需要更少的CPU周期
3:盡量避免NULL,包含為NULL的列,對MySQL更難優化
1、整型
tinyint(m) 1個字節範圍(-128~127)
smallint(m) 2個字節 範圍(-32768~32767)
mediumint(m) 3個字節 範圍(-8388608~8388607)
int(m) 4個字節 範圍(-2147483648~2147483647)
bigint(m) 8個字節 範圍(+-9.22*10的18次方)
(無論是幾都要占用8個字節)<br><br>取值範圍如果加了unsigned,則最大值翻倍,如tinyint unsigned的取值範圍為(0~255) 取正整數。
加了unsigned,則最大值翻倍,如:tinyint unsigned的取值範圍為(0~255) int(m)裏的m是表示SELECT查詢結果集中的顯示寬度,並不影響實際的取值範 圍,規定了MySQL的一些交互工具(例如MySQL命令行客戶端)用來顯示字符 的個數。對於存儲和計算來說,Int(1)和Int(20)是相同的
BOOL,BOOLEAN:布爾型,是TINYINT(1)的同義詞。zero值被視為假, 非zero值視為真
2、浮點型(float和double),近似值
3、定點數
在數據庫中存放的是精確值,存為十進制
decimal(m,d) 參數m<65 是總個數,d<30且 d<m是小數位
MySQL5.0和更高版本將數字打包保存到一個二進制字符串中(每4個字節存 9個數字)。例如,decimal(18,9)小數點兩邊將各存儲9個數字,一共使用9 個字節:小數點前的數字用4個 字節,小數點後的數字用4個字節,小數點本 身占1個字節
浮點類型在存儲同樣範圍的值時,通常比decimal使用更少的空間。float使 用4個字節存儲。double占用8個字節
因為需要額外的空間和計算開銷,所以應該盡量只在對小數進行精確計算時 才使用decimal——例如存儲財務數據。但在數據量比較大的時候,可以考 慮使用bigint代替decimal
4、字符串(char,varchar,_text)
char(n) 固定長度,最多255個字符
varchar(n) 可變長度,最多65535個字符
tinytext 可變長度,最多255個字符
text 可變長度,最多65535個字符
mediumtext 可變長度,最多2的24次方-1個字符
longtext 可變長度,最多2的32次方-1個字符
BINARY(M) 固定長度,可存二進制或字符,長度為0-M字節
VARBINARY(M) 可變長度,可存二進制或字符,允許長度為0-M字節
內建類型:ENUM枚舉, SET集合
char和varchar:
? 1.char(n) 若存入字符數小於n,則以空格補於其後,查詢之時再將空格去掉。 所以char類型存儲的字符串末尾不能有空格,varchar不限於此。
? 2.char(n) 固定長度,char(4)不管是存入幾個字符,都將占用4個字節,varchar 是存入的實際字符數+1個字節(n< n>255),所以varchar(4),存入3個字符將 占用4個字節。
? 3.char類型的字符串檢索速度要比varchar類型的快
varchar和text:
? 1.varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個 字節(n< n>255),text是實際字符數+2個字節。
? 2.text類型不能有默認值
? 3.varchar可直接創建索引,text創建索引要指定前多少個字符。varchar查詢速 度快於text
5.二進制數據:BLOB
? BLOB和text存儲方式不同,TEXT以文本方式存儲,英文存儲區分大小寫, 而Blob是以二進制方式存儲,不分大小寫
? BLOB存儲的數據只能整體讀出
? TEXT可以指定字符集,BLOB不用指定字符集
6.日期時間類型
? date 日期 ‘2008-12-2‘
? time 時間 ‘12:25:36‘
? datetime 日期時間 ‘2008-12-2 22:06:44‘
? timestamp 自動存儲記錄修改時間 ? YEAR(2), YEAR(4):年份
timestamp字段裏的時間數據會隨其他字段修改的時候自動刷新,這個數據類 型的字段可以存放這條記錄最後被修改的時間
修飾符
所有類型:
? NULL 數據列可包含NULL值
? NOT NULL 數據列不允許包含NULL值
? DEFAULT 默認值 ? PRIMARY KEY 主鍵
? UNIQUE KEY 唯一鍵
? CHARACTER SET name 指定一個字符集
數值型
? AUTO_INCREMENT 自動遞增,適用於整數類型 (數字自動增長不需要手動在添加了)
? UNSIGNED 無符號
表操作
DROP TABLE [IF EXISTS] ‘tbl_name‘;
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
eg:
DML 對數據的操作語言,就是對數據的,增,改,刪,
1、INSERT 插入數據 數字不用加引號,但字符串一定要加引號
單條記錄插入
MariaDB [db1]> insert students values(1,‘bai‘,‘10086‘,‘m‘);
Query OK, 1 row affected (0.00 sec)
MariaDB [db1]> desc students;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id | tinyint(3) unsigned | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| phone | char(11) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
MariaDB [db1]> select * from students;
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
+----+------+-------+------+
1 row in set (0.00 sec)
單條記錄插入
MariaDB [db1]> insert students(id,name,sex) values (2,‘liui‘,‘m‘),(3,‘lin‘,‘f‘);
Query OK, 2 rows affected (0.00 sec)Records: 2 Duplicates: 0 Warnings: 0
MariaDB [db1]> select * from students;
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 70 | wang | NULL | NULL |
+----+------+-------+------+
4 rows in set (0.00 sec)
MariaDB [db1]> insert students set id=4,name=‘zhao‘;
Query OK, 1 row affected (0.00 sec)
MariaDB [db1]> select * from students;
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 4 | zhao | NULL | NULL |
| 70 | wang | NULL | NULL |
+----+------+-------+------+
5 rows in set (0.00 sec)
從其他表查詢數據保存到此表中
MariaDB [db1]> select *from user
-> ;
+------+-----------+-------------------------------------------+
| user | host | password |
+------+-----------+-------------------------------------------+
| root | localhost | *FD571203974BA9AFE270FE62151AE967ECA5E0AA |
| root | centos7 | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | centos7 | |
+------+-----------+-------------------------------------------+
MariaDB [db1]> desc emp
-> ;
+---------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(30) | NO | | NULL | |
| sex | char(1) | YES | | m | |
| address | varchar(100) | YES | | NULL | |
+---------+------------------+------+-----+---------+----------------+
MariaDB [db1]> insert emp(name,address) select user,host from user;
MariaDB [db1]> select * from emp;
+----+------+------+-----------+
| id | name | sex | address |
+----+------+------+-----------+
| 1 | root | m | localhost |
| 2 | root | m | centos7 |
| 3 | root | m | 127.0.0.1 |
| 4 | root | m | ::1 |
| 5 | | m | localhost |
| 6 | | m | centos7 |
+----+------+------+-----------+
2、UPDATE 修改數據 where是限定要改那條記錄
MariaDB [db1]> select * from emp; +----+------+------+-----------+ | id | name | sex | address | +----+------+------+-----------+ | 1 | root | m | localhost | | 2 | root | m | centos7 | | 3 | root | m | 127.0.0.1 | | 4 | root | m | ::1 | | 5 | | m | localhost | | 6 | | m | centos7 | +----+------+------+-----------+ MariaDB [db1]> update emp set name=‘admin‘,address=‘beijing‘ where id=1; MariaDB [db1]> select * from emp ; +----+-------+------+-----------+ | id | name | sex | address | +----+-------+------+-----------+ | 1 | admin | m | beijing | | 2 | root | m | centos7 | | 3 | root | m | 127.0.0.1 | | 4 | root | m | ::1 | | 5 | | m | localhost | | 6 | | m | centos7 | +----+-------+------+-----------+
MariaDB [db1]> update emp set name=‘admin‘,addre ss=‘beijing‘ where name=‘root‘ L
IMIT 2 ; LIMIT 限定修改的記錄數,,一共是三個root,,限定改2個
MariaDB [db1]> select * from emp ;
+----+-------+------+-----------+
| id | name | sex | address |
+----+-------+------+-----------+
| 1 | admin | m | beijing |
| 2 | admin | m | beijing |
| 3 | admin | m | beijing |
| 4 | root | m | ::1 |
| 5 | | m | localhost |
| 6 | | m | centos7 |
+----+-------+------+-----------+
3、DELETE 刪除數據
MariaDB [db1]> delete from emp ;
MariaDB [db1]> truncate table emp; #快速刪除,不可恢復
註意:
delete from students where id=4; (刪除id=4的哪一行)
delete from students;如果不寫where限定條件,默認會刪除此表的所有內容,如果在配置文件裏面添加
vim /etc/my.cnf.d/mysql-clients.cnf #當然加限制條件是要退出mysql
[mysql]
safe-updates
[root@centos7 ~]# mysql --safe-updates 添加此行內容就不會刪除所有的內容了。比較安全
DQL語句
SELECT
- AS:別名
- WHERE:指明過濾條件以實現“選擇”的功能
- +, -, *, /, %:算術操作符
- =, !=, <>, >, <, >=, <=:比較操作符 #=是精確匹配
- between min_num AND max_num:在min_num和max_mun之間
- IN (element1,element2,...):在element...中的
- IS NULL:為空
- IS NOT NULL:不為空
- LIKE:做匹配,像。。。RLIKE:正則表達式,不建議用
- %:任意長度的任意字符
- _:單個任意字符
- REGEXP:同上
- NOT, AND, OR, XOR:邏輯操作符
- GROUP BY:根據指定的條件把查詢結果進行“分組”以用於做“聚合”運算
- AVG() 平均數
- MAX() 最大數
- MIN() 最小數
- COUNT() 統計
- SUM() 求和
- HAVING :對分組聚合運算後的結果指定過濾條件。類似WHERE的作用,但只能在分組中使用
- ORDER BY:排序
- ASC:正序,默認
- DESC:倒序
- -KEYWORD:在排序時在關鍵字前加-可以避免把NULL排在前邊
- LIMIT [[offset,]row_count]:對查詢的結果進行輸出行數數量限制
示例 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 student
eg1:
eg2:
MariaDB [db1]> select * from students;
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 4 | zhao | NULL | NULL |
| 70 | wang | NULL | NULL |
+----+------+-------+------+
MariaDB [db1]> insert students values (5,‘wang‘,10000,‘m‘); 插入5號學員信息
MariaDB [db1]> select * from students;
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 4 | zhao | NULL | NULL |
| 5 | wang | 10000 | m |
| 70 | wang | NULL | NULL |
+----+------+-------+------+
MariaDB [db1]> select * from students where id >=2 and id<=5;#查詢2到5號學生的信息
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 4 | zhao | NULL | NULL |
| 5 | wang | 10000 | m |
+----+------+-------+------+
MariaDB [db1]> select * from students where id between 2 and 5;#查詢2到5號學生的信息
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 4 | zhao | NULL | NULL |
| 5 | wang | 10000 | m |
+----+------+-------+------+
MariaDB [db1]> select * from students where sex in (‘f‘,‘m‘);#查詢性別中包含‘m‘‘f’的信息
+----+------+-------+------+
| id | name | phone | sex |
+----+------+-------+------+
| 1 | bai | 10086 | m |
| 2 | liui | NULL | m |
| 3 | lin | NULL | f |
| 5 | wang | 10000 | m |
+----+------+-------+------+
MariaDB [db1]> select st.id as 編號,name 姓名 from students as st where sex in (
‘f‘,‘m‘);
+--------+--------+
| 編號 | 姓名 |
+--------+--------+
| 1 | bai |
| 2 | liui |
| 3 | lin |
| 5 | wang |
+--------+--------+
Mysql------SQL語句