Mysql------SQL語句

關係型數據庫的常見組件
 數據庫:database 表:table   行:row #能夠叫記錄   列:column #字段,屬性,域 索引:index 視圖:view 用戶:user 權限:privilege 存儲過程:procedure,無返回值 存儲函數:function有返回值 #與bash裏的函數有區別 觸發器:trigger 事件調度器:event scheduler,任務計劃 

 SQL語句分類 mysql

DDL: Data Defination Language 數據定義語言 正則表達式

CREATE(增,建立表),DROP(刪),ALTER(修改數據庫的具體資源的架構,如表的結構,不是改數據庫中的數據)sql

DML: Data Manipulation Language 數據操縱語言,#是對數據庫中數據的操做數據庫

INSERT,DELETE,UPDATE,SELECT vim

DCL:Data Control Language 數據控制語言,#權限問題centos

GRANT,REVOKE,COMMIT,ROLLBACK 安全

DQL:Data Query Language 數據查詢語言 #主要用來查詢語句的
bash

  SELECT架構

SQL語句構成:socket

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:若是隻想模仿查詢舊錶建立一個無記錄的表咱們能夠加入條件 


(3) 經過複製現存的表的表結構建立,但不復制數據 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE   old_tbl_name | (LIKE old_tbl_name) }

經過複製現存的表的表結構建立,但不復制數據
CREATE TABLE user3 LIKE mysql.user;

WHERE 0=1;

:注意:

  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更難優化

一、整型

  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值視爲真

二、浮點型(float和double),近似值

三、定點數

在數據庫中存放的是精確值,存爲十進制

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

四、字符串(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 對數據的操做語言,就是對數據的,增,改,刪,

一、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   |
+----+------+------+-----------+

二、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   |
+----+-------+------+-----------+


三、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   |
+--------+--------+

一、選擇

複製代碼
MariaDB [testdb]> SELECT * FROM students WHERE name='maria';  #查詢maria的信息
MariaDB [testdb]> SELECT * FROM students WHERE id BETWEEN 2 AND 5;  #查詢2到5號學生的信息
MariaDB [testdb]> SELECT * FROM students WHERE name IN ('jerry','xiaolongnv');  #查詢jerry和xiaolongnv的信息
MariaDB [testdb]> SELECT * FROM students WHERE gender IS NOT NULL;  #查詢年齡不爲空的信息
MariaDB [testdb]> SELECT * FROM students WHERE name LIKE '%o%';  #查詢姓名中包含'o'的信息
複製代碼
 
 

二、投影

MariaDB [testdb]> SELECT user AS 用戶,host AS 主機,password AS 密碼 FROM mysql.user;
 
 

三、分組

MariaDB [testdb]> SELECT gender,AVG(ages) FROM students GROUP BY gender;  #查詢男生、女生年齡的平均值
MariaDB [testdb]> SELECT gender,AVG(ages) FROM students GROUP BY gender HAVING gender='M';  #只顯示男生的平均年齡信息

四、排序

MariaDB [testdb]> SELECT * FROM students ORDER BY ages DESC;  #按年齡排序,倒序顯示
MariaDB [testdb]> SELECT * FROM students WHERE ages > 0 ORDER BY ages LIMIT 3;  #按年齡排序,過濾年齡大於0的,正序排序,取前三條記錄

多表查詢

JOIN ON:交叉鏈接

INNER JOIN ON:內鏈接

LEFT OUTER JOIN ON:左外鏈接

RIGHT OUTER JOIN ON:右外鏈接

UNION ON:徹底外鏈接

相關文章
相關標籤/搜索