本次測試使用的是world數據庫,由mysql官方提供下載地址:html
world文件導入方法,官方說明:web
下載sqlyog 軟件,用於以後的數據庫管理用:shell
建立用戶,可以讓sqlyog登陸數據庫便可,注意權限控制。服務器
mysql> grant all on *.* to root@'%' identified by '123'; Query OK, 0 rows affected (0.00 sec)
受權用戶後參看ide
mysql> select user,host from mysql.user where user like 'root'; +------+-----------+ | user | host | +------+-----------+ | root | % | | root | 10.0.0.1 | | root | 127.0.0.1 | | root | localhost | +------+-----------+ 4 rows in set (0.00 sec)
mysql> help select; Name: 'SELECT' Description: Syntax: SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [, select_expr ...] [FROM table_references [PARTITION partition_list] [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}] [PROCEDURE procedure_name(argument_list)] [INTO OUTFILE 'file_name' [CHARACTER SET charset_name] export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]] [FOR UPDATE | LOCK IN SHARE MODE]]
SELECT *|{[DISTINCT] column|select_expr [alias], ...]} [FROM [database.]table] [WHERE conditions];
where 條件的說明:函數
WHERE條件又叫作過濾條件,它從FROM子句的中間結果中去掉全部條件conditions不爲TRUE(而爲FALSE或者NULL)的行。測試
WHERE子句跟在FROM子句後面,不能在WHERE子句中使用列別名。
【示例一】where字句的基本使用
SELECT * FROM world.`city` WHERE CountryCode='CHN'; or SELECT * FROM world.`city` WHERE CountryCode='chn';
sql說明:從數據庫中查找是中國的城市。
注意:
WHERE中出現的字符串和日期字面量必須使用引號括起來
這裏,字符串字面量寫成大寫或小寫結果都同樣,即不區分大小寫進行查詢。
這和ORACLE不一樣,ORACLE中WHERE條件中的字面量是區分大小寫的
【示例二】where字句中的邏輯操做符
SELECT * FROM world.`city` WHERE CountryCode='chn' AND district = 'shanxi';
sql說明: 從數據庫中查找是中國的而且是山西的城市
邏輯操做符介紹:
邏輯操做符 |
說明 |
and |
邏輯與。只有當全部的子條件都爲true時,and才返回true。不然返回false或null |
or |
邏輯或。只要有一個子條件爲true,or就返回true。不然返回false或null |
not |
邏輯非。若是子條件爲true,則返回false;若是子條件爲false,則返回true |
xor |
邏輯異或。當一個子條件爲true而另外一個子條件爲false時,其結果爲true; 當兩個條件都爲true或都爲false時,結果爲false。不然,結果爲null |
【示例三】:where字句中的範圍比較
SELECT * FROM world.`city` WHERE population BETWEEN 100000 AND 200000 ;
sql說明: 從數據庫中查找人口數量在 100000-200000 之間的城市
【示例四】:where字句中的IN
SELECT * FROM city WHERE countrycode IN ('CHN','JPN');
sql說明: 查詢中國和日本的全部城市
【示例五】:where字句中的like
USE world; SELECT * FROM city WHERE countrycode LIKE 'ch%';
sql說明: 從city表中找到國家是一ch開頭的。
like的語法:
like ‘匹配模式字符串’
實現模式匹配查詢或者模糊查詢:測試一個列值是否匹配給出的模式
在‘匹配模式字符串’中,能夠有兩個具備特殊含義的通配字符:
%:表示0個或者任意多個字符 _:只表示一個任意字符
ORDER BY子句用來排序行
若是SELECT語句中沒有ORDER BY子句,那麼結果集中行的順序是不可預料的
語法:
SELECT expr FROM table [WHERE condition(s)] [ORDER BY {column, expr, numeric_position} [Asc|DEsc]];
部分參數說明:
參數 |
參數說明 |
Asc |
執行升序排序。默認值 |
DEsc |
執行降序排序 |
使用方法 |
ORDER BY子句通常在SELECT語句的最後面 |
1.3.2 order by 示例
【示例一】Order by基本使用
SELECT * FROM city ORDER BY population;
sql說明:將城市表按照人口數量升序排列
【示例二】多個排序條件
SELECT * FROM city ORDER BY population,countrycode;
sql說明: 按照人口和國家進行排序
【示例三】以select字句列編號排序
SELECT * FROM city ORDER BY 5;
sql說明:按照第5列進行排序
【示例四】desc實踐
SELECT * FROM city ORDER BY 5 DESC;
sql說明: 按照第列進行逆序排列
說明:NULL值的排序
在MySQL中,把NULL值當作一列值中的最小值對待。
所以,升序排序時,它出如今最前面。
特色說明:
MySQL特有的子句。
它是SELECT語句中的最後一個子句(在order by後面)。
它用來表示從結果集中選取最前面或最後面的幾行。
偏移量offset的最小值爲0。
語法:
limit <獲取的行數> [OFFSET <跳過的行數>] 或者 limit [<跳過的行數>,] <獲取的行數>
查詢示例
SELECT * FROM city ORDER BY 5 DEsc LIMIT 4;
sql說明: 獲取排序後的前4行
注:先按照人口數量進行降序排序,而後使用limit從中挑出最前面的4行。
若是沒有order by子句,返回的4行就是不可預料的。
SELECT NAME,ci.countrycode ,cl.language ,ci.population FROM city ci , countrylanguage cl WHERE ci.`CountryCode`=cl.countrycode;
sql說明: city定別名爲ci ,國家定別名問爲cl,進行連表查詢,NAME是共同的鍵值,使用where條件進行鏈接。
注意:一旦給表定義了別名,那麼原始的表名就不能在出如今該語句的其它子句中了
自動到兩張表中查找全部同名同類型的列拿來作鏈接列,進行相等鏈接
SELECT NAME,countrycode ,LANGUAGE ,population FROM city NATURAL JOIN countrylanguage WHERE population > 1000000 ORDER BY population;
sql說明:使用natural join 進行相等鏈接,兩個表,條件爲人口大於1000000的,進行升序排列。
注意:在select子句只能出現一個鏈接列
SELECT NAME,countrycode ,LANGUAGE ,population FROM city JOIN countrylanguage USING(countrycode);
sql說明:使用join進行兩表的來鏈接,using指定countrycode爲關聯列。
UNION [DISTINCT] UNION ALL
語法:
SELECT ... UNION [ALL | DISTINCT] SELECT ... [UNION [ALL | DISTINCT] SELECT ...]
⛳ UNION用於把兩個或者多個select查詢的結果集合併成一個
⛳ 進行合併的兩個查詢,其SELECT列表必須在數量和對應列的數據類型上保持一致
⛳ 默認會去掉兩個查詢結果集中的重複行
⛳ 默認結果集不排序
⛳ 最終結果集的列名來自於第一個查詢的SELECT列表
「Group By」從字面意義上理解就是根據「By」指定的規則對數據進行分組,所謂的分組就是將一個「數據集」劃分紅若干個「小區域」,而後針對若干個「小區域」進行數據處理。
Having與Where的區別
where 子句的做用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組以前過濾數據,where條件中不能包含聚組函數,使用where條件過濾出特定的行。
having 子句的做用是篩選知足條件的組,即在分組以後過濾數據,條件中常常包含聚組函數,使用having 條件過濾出特定的組,也可使用多個分組標準進行分組。
SELECT CONCAT("mysqldump ","-uroot ","-p123 ",table_schema," ",table_name,">/tmp/",table_schema,"_",table_name,".sql") FROM information_schema.tables WHERE table_schema='world' INTO OUTFILE '/tmp/world_bak.sh'
使用concat進行拼接數據備份腳本。
-- 顯示信息,可直接進行運算
SELECT CONCAT("132"); SELECT CONCAT("132+123"); SELECT CONCAT("132+123");
-- 查看引擎是innodb的表
SELECT TABLE_NAME FROM TABLES WHERE ENGINE='innodb'; SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATIONS WHERE IS_DEFAULT = 'Yes';
-- 顯示每一個庫下有多少表
SELECT TABLE_SCHEMA ,COUNT(*) FROM information_schema.`TABLES` GROUP BY TABLE_SCHEMA;
子查詢定義
在一個表表達中能夠調用另外一個表表達式,這個被調用的表表達式叫作子查詢(subquery),我麼也稱做子選擇(subselect)或內嵌選擇(inner select)。子查詢的結果傳遞給調用它的表表達式繼續處理。
子查詢(inner query)先執行,而後執行主查詢(outer query)
子查詢按對返回結果集的調用方法,可分爲:where型子查詢,from型子查詢及exists型子查詢。
使用子查詢原則
一個子查詢必須放在圓括號中。
將子查詢放在比較條件的右邊以增長可讀性。
子查詢不包含 ORDER BY 子句。對一個 SELECT 語句只能用一個 ORDER BY 子句,而且若是指定了它就必須放在主 SELECT 語句的最後。
在子查詢中可使用兩種比較條件:單行運算符(>, =, >=, <, <>, <=) 和多行運算符(IN, ANY, ALL)。
不相關子查詢
子查詢中沒有使用到外部查詢的表中的任何列。先執行子查詢,而後執行外部查詢
相關子查詢(correlated subquery)
子查詢中使用到了外部查詢的表中的任何列。先執行外部查詢,而後執行子查詢
以上兩種類型之下又能夠分爲:
行子查詢(row subquery):返回的結果集是 1 行 N 列 列子查詢(column subquery):返回的結果集是 N 行 1列 表子查詢(table subquery):返回的結果集是 N 行 N 列 標量子查詢(scalar subquery):返回1行1列一個值
子查詢示例
建立數據表
1 CREATE TABLE PLAYERS 2 (PLAYERNO INTEGER NOT NULL, 3 NAME CHAR(15) NOT NULL, 4 INITIALS CHAR(3) NOT NULL, 5 BIRTH_DATE DATE , 6 SEX CHAR(1) NOT NULL, 7 JOINED SMALLINT NOT NULL, 8 STREET VARCHAR(30) NOT NULL, 9 HOUSENO CHAR(4) , 10 POSTCODE CHAR(6) , 11 TOWN VARCHAR(30) NOT NULL, 12 PHONENO CHAR(13) , 13 LEAGUENO CHAR(4) , 14 PRIMARY KEY (PLAYERNO)); 15 16 CREATE TABLE PENALTIES 17 (PAYMENTNO INTEGER NOT NULL, 18 PLAYERNO INTEGER NOT NULL, 19 PAYMENT_DATE DATE NOT NULL, 20 AMOUNT DECIMAL(7,2) NOT NULL, 21 PRIMARY KEY (PAYMENTNO)); 22 23 INSERT INTO PLAYERS VALUES (2, 'Everett', 'R', '1948-09-01', 'M', 1975, 'Stoney Road','43', '3575NH', 'Stratford', '070-237893', '2411'); 24 INSERT INTO PLAYERS VALUES (6, 'Parmenter', 'R', '1964-06-25', 'M', 1977, 'Haseltine Lane','80', '1234KK', 'Stratford', '070-476537', '8467'); 25 INSERT INTO PLAYERS VALUES (7, 'Wise', 'GWS', '1963-05-11', 'M', 1981, 'Edgecombe Way','39', '9758VB', 'Stratford', '070-347689', NULL); 26 INSERT INTO PLAYERS VALUES (8, 'Newcastle', 'B', '1962-07-08', 'F', 1980, 'Station Road','4', '6584WO', 'Inglewood', '070-458458', '2983'); 27 INSERT INTO PLAYERS VALUES (27, 'Collins', 'DD', '1964-12-28', 'F', 1983, 'Long Drive','804', '8457DK', 'Eltham', '079-234857', '2513'); 28 INSERT INTO PLAYERS VALUES (28, 'Collins', 'C', '1963-06-22', 'F', 1983, 'Old Main Road','10', '1294QK', 'Midhurst', '010-659599', NULL); 29 INSERT INTO PLAYERS VALUES (39, 'Bishop', 'D', '1956-10-29', 'M', 1980, 'Eaton Square','78', '9629CD', 'Stratford', '070-393435', NULL); 30 INSERT INTO PLAYERS VALUES (44, 'Baker', 'E', '1963-01-09', 'M', 1980, 'Lewis Street','23', '4444LJ', 'Inglewood', '070-368753', '1124'); 31 INSERT INTO PLAYERS VALUES (57, 'Brown', 'M', '1971-08-17', 'M', 1985, 'Edgecombe Way','16', '4377CB', 'Stratford', '070-473458', '6409'); 32 INSERT INTO PLAYERS VALUES (83, 'Hope', 'PK', '1956-11-11', 'M', 1982, 'Magdalene Road','16A', '1812UP', 'Stratford', '070-353548', '1608'); 33 INSERT INTO PLAYERS VALUES (95, 'Miller', 'P', '1963-05-14', 'M', 1972, 'High Street','33A', '5746OP', 'Douglas', '070-867564', NULL); 34 INSERT INTO PLAYERS VALUES (100, 'Parmenter', 'P', '1963-02-28', 'M', 1979, 'Haseltine Lane','80', '6494SG', 'Stratford', '070-494593', '6524'); 35 INSERT INTO PLAYERS VALUES (104, 'Moorman', 'D', '1970-05-10', 'F', 1984, 'Stout Street','65', '9437AO', 'Eltham', '079-987571', '7060'); 36 INSERT INTO PLAYERS VALUES (112, 'Bailey', 'IP', '1963-10-01', 'F', 1984, 'Vixen Road','8', '6392LK', 'Plymouth', '010-548745', '1319'); 37 38 INSERT INTO PENALTIES VALUES (1, 6, '1980-12-08',100); 39 INSERT INTO PENALTIES VALUES (2, 44, '1981-05-05', 75); 40 INSERT INTO PENALTIES VALUES (3, 27, '1983-09-10',100); 41 INSERT INTO PENALTIES VALUES (4,104, '1984-12-08', 50); 42 INSERT INTO PENALTIES VALUES (5, 44, '1980-12-08', 25); 43 INSERT INTO PENALTIES VALUES (6, 8, '1980-12-08', 25); 44 INSERT INTO PENALTIES VALUES (7, 44, '1982-12-30', 30); 45 INSERT INTO PENALTIES VALUES (8, 27, '1984-11-12', 75);
例1、獲取和100號球員性別相同而且居住在同一城市的球員號碼。
select playerno from players where (sex, town) = ( select sex, town from players where playerno = 100);
例2、獲取和27號球員出生在同一年的球員的號碼
select playerno from players where year(birth_date) = (select year(birth_date) from players where playerno = 27) and playerno <> 27;
例3、獲取那些至少支付了一次罰款的球員的名字和首字母。
select name, initials from players where exists (select * from penalties where playerno = players.playerno);
例4、獲取那些歷來沒有罰款的球員的名字和首字母。
select name, initials from players where not exists (select * from penalties where playerno = players.playerno);
查詢 INFORMATION_SCHEMA 數據庫表。其中包含 MySQL 數據庫服務器所管理的全部對象的相關數據
使用 SHOW 語句。用於獲取數據庫和表信息的 MySQL 專用語句
使用 DESCRIBE(或 DESC)語句。用於檢查表結構和列屬性的快捷方式
使用 mysqlshow 客戶端程序。SHOW 語法的命令行程序
INFORMATION_SCHEMA 數據庫優勢介紹
充當數據庫元數據的中央系統信息庫,模式和模式對象,服務器統計信息(狀態變量、設置、鏈接) 。
採用表格式以實現靈活訪問,使用任意 SELECT 語句。是「虛擬數據庫」,表並不是「真實」表(基表),而是「系統視圖」,根據當前用戶的特權動態填充表。
列出 INFORMATION_SCHEMA 數據庫中全部的表:
mysql> USE information_schema; Database changed mysql> SHOW TABLES; +---------------------------------------+ | Tables_in_information_schema | +---------------------------------------+ | CHARACTER_SETS | | COLLATIONS | | COLLATION_CHARACTER_SET_APPLICABILITY | | COLUMNS | | COLUMN_PRIVILEGES |
示例一:
查找引擎是innodb的表。
SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE= 'innodb';
示例二:
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE = 'set';
sql說明:查找數據類型是set的表
示例三:
SELECT CHARACTER_SET_NAME, COLLATION_NAME,IS_DEFAULT FROM INFORMATION_SCHEMA.COLLATIONS WHERE IS_DEFAULT = 'Yes';
sql說明:查看找默認爲yes的表
示例四:
SELECT TABLE_SCHEMA, COUNT(*) FROM INFORMATION_SCHEMA.TABLES GROUP BY TABLE_SCHEMA;
sql說明:查看每一個數據庫下表的個數
使用 INFORMATION_SCHEMA 表獲取有關建立 shell 命令的信息。
SELECT CONCAT("mysqldump -uroot -p ", TABLE_SCHEMA," ", TABLE_NAME, " >> ", TABLE_SCHEMA,".bak.sql") FROM TABLES WHERE TABLE_NAME LIKE 'Country%'
mysql -uroot -p123 --silent --skip-column-names -e "SELECT CONCAT('CREATE TABLE ', TABLE_SCHEMA, '.',TABLE_NAME, '_backup LIKE ', TABLE_SCHEMA, '.',TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'world_innodb';"
SOHW databases:列出全部數據庫 SHOW TABLES:列出默認數據庫中的表 SHOW TABLES FROM <database_name>:列出指定數據庫中的表 SHOW COLUMNS FROM <table_name>:顯示錶的列結構 SHOW INDEX FROM <table_name>:顯示錶中有關索引和索引列的信息 SHOW CHARACTER SET:顯示可用的字符集及其默認整理 SHOW COLLATION:顯示每一個字符集的整理 SHOW STATUS:列出當前數據庫狀態 SHOW VARIABLES:列出數據庫中的參數定義值 SHOW PROCESSLIST 查看當前的鏈接數量
DESCRIBE 語句 等效於 SHOW COLUMNS
通常語法:
mysql> DESCRIBE <table_name>;
顯示 INFORMATION_SCHEMA 表信息
mysql> DESCRIBE INFORMATION_SCHEMA.CHARACTER_SETS; +----------------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------------+-------------+------+-----+---------+-------+ | CHARACTER_SET_NAME | varchar(32) | NO | | | | | DEFAULT_COLLATE_NAME | varchar(32) | NO | | | | | DESCRIPTION | varchar(60) | NO | | | | | MAXLEN | bigint(3) | NO | | 0 | | +----------------------+-------------+------+-----+---------+-------+ 4 rows in set (0.00 sec)
有關數據庫和表的結構的信息與 SHOW 語句類似
通常語法:
shell> mysqlshow [options] [db_name [table_name[column_name]]]
顯示全部數據庫或特定數據庫、表和/或列的相關信息:
[root@db02 ~]# mysqlshow -uroot -p123 Warning: Using a password on the command line interface can be insecure. +--------------------+ | Databases | +--------------------+ | information_schema | | clsn | | haha | | mysql | | oldboy | | performance_schema | | world | +--------------------+
查看數據庫下的表
[root@db02 ~]# mysqlshow -uroot -p123 world Warning: Using a password on the command line interface can be insecure. Database: world +-----------------+ | Tables | +-----------------+ | PENALTIES | | PLAYERS | | city | | country | | countrylanguage | +-----------------+
查看數據庫下表記錄
[root@db02 ~]# mysqlshow -uroot -p123 world city Warning: Using a password on the command line interface can be insecure. Database: world Table: city +-------------+----------+-------------------+------+-----+---------+----------------+---------------------------------+---------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +-------------+----------+-------------------+------+-----+---------+----------------+---------------------------------+---------+ | ID | int(11) | | NO | PRI | | auto_increment | select,insert,update,references | | | Name | char(35) | latin1_swedish_ci | NO | | | | select,insert,update,references | | | CountryCode | char(3) | latin1_swedish_ci | NO | MUL | | | select,insert,update,references | | | District | char(20) | latin1_swedish_ci | NO | | | | select,insert,update,references | | | Population | int(11) | | NO | | 0 | | select,insert,update,references | | +-------------+----------+-------------------+------+-----+---------+----------------+---------------------------------+---------+
查看記錄信息
[root@db02 ~]# mysqlshow -uroot -p123 world city CountryCode Warning: Using a password on the command line interface can be insecure. Database: world Table: city Wildcard: CountryCode +-------------+---------+-------------------+------+-----+---------+-------+---------------------------------+---------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +-------------+---------+-------------------+------+-----+---------+-------+---------------------------------+---------+ | CountryCode | char(3) | latin1_swedish_ci | NO | MUL | | | select,insert,update,references | | +-------------+---------+-------------------+------+-----+---------+-------+---------------------------------+---------+
查看數據庫相似like。
[root@db02 ~]# mysqlshow -uroot -p123 "w%" Warning: Using a password on the command line interface can be insecure. Wildcard: w% +-----------+ | Databases | +-----------+ | world | +-----------+
https://dev.mysql.com/doc/refman/5.6/en/select.html SELECT語法官方說明