1. 程式人生 > >Mysql------SQL語句

Mysql------SQL語句

任務計劃 modify rem 日期 rim beijing lte 支持 客戶

關系型數據庫的常見組件

數據庫: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,tomm),(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語句