1. 程式人生 > >MySQL入門篇

MySQL入門篇

get per tmp fin 查詢 cti 字符串比較 mysql5 同時存在

MySQL基礎語句

MySQL進階篇

1.1 SQL概述

結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關系數據庫系統;同時也是數據庫腳本文件的擴展名。
從上可以看出我們數據庫相關工作職位大概兩種:DBD和DBA
dba是數據庫管理員database administrator
dbd是數據庫開發人員database developer
SQL 是1986年10 月由美國國家標準局(ANSI)通過的數據庫語言美國標準,接著,國際標準化組織(ISO)頒布了SQL正式國際標準。1989年4月,ISO提出了具有完整性特征的SQL89標準,1992年11月又公布了SQL92標準,在此標準中,把數據庫分為三個級別:基本集、標準集和完全集。

至於什麽基本集,標準集我們不用管,看看就行,牽扯到數據庫原理和數學算法裏面了

1.2 SQL語句結構

結構化查詢語言包含6個部分:

1.2.1 數據查詢語言(DQL:Data Query Language):

其語句,也稱為“數據檢索語句”,用以從表中獲得數據,確定數據怎樣在應用程序給出。保留字SELECT是DQL(也是所有SQL)用得最多的動詞,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。這些DQL保留字常與其他類型的SQL語句一起使用。

1.2.2 數據操作語言(DML:Data Manipulation Language):

其語句包括動詞INSERT,UPDATE和DELETE。它們分別用於添加,修改和刪除表中的行。也稱為動作查詢語言。

1.2.3 事務處理語言(TPL):跟shell有點類似 由多條SQL語句組成的整體

它的語句能確保被DML語句影響的表的所有行及時得以更新。TPL語句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。

1.2.4 數據控制語言(DCL):

它的語句通過GRANT或REVOKE獲得許可,確定單個用戶和用戶組對數據庫對象的訪問。某些RDBMS可用GRANT或REVOKE控制對表單個列的訪問。

1.2.5 數據定義語言(DDL):

其語句包括動詞CREATE和DROP。在數據庫中創建新表或刪除表(CREAT TABLE 或 DROP TABLE);為表加入索引等。DDL包括許多與人數據庫目錄中獲得數據有關的保留字。它也是動作查詢的一部分。

1.2.6 指針控制語言(CCL):

它的語句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用於對一個或多個表單獨行的操作。

1.3 MySQL語句

1.3.1 關於數據庫的操作

(1)查看數據庫:

mysql> show databases;  
+--------------------+  
| Database           |  
+--------------------+  
| information_schema |  
| mysql              |  
| performance_schema |  
|  sys          |  

註:
1:information_schema這數據庫保存了MySQL服務器所有數據庫的信息。如數據庫名,數據庫的表,表欄的數據類型不訪問權限等。 [?skim?]
2:performance_schema 這是MySQL5.5新增的一個性能優化的引擎:命名PERFORMANCE_SCHEMA [p??f?:m?ns]
主要用於收集數據庫服務器性能參數。MySQL用戶是不能創建存儲引擎為PERFORMANCE_SCHEMA的表
3:mysql庫是系統庫,裏面保存有賬戶信息,權限信息等。
4:mysql5.7增加了sys 系統數據庫,通過這個庫可以快速的了解系統的元數據信息
元數據是關於數據信息的數據,如數據庫名或表名,列的數據類型,或訪問權限等。

mysql> show databases \G   #以行的方式顯示  
*************************** 1. row ***************************  
Database: information_schema  
*************************** 2. row ***************************  
Database: mysql  
*************************** 3. row ***************************  
Database: performance_schema  
[[email protected] ~]# mysql -e ‘show databases‘ -usystem -p123456  
+--------------------+  
| Database           |  
+--------------------+  
| information_schema |  
| mysql              |  
| performance_schema |  
+--------------------+  

mysql –e 後面我們接SQL語句,直接終端運行,後面寫sql 相關shell可以用到

[[email protected] ~]# mysqlshow -uroot -p123456  
+--------------------+  
|     Databases      |  
+--------------------+  
| information_schema |  
| mysql              |  
| performance_schema |  
+--------------------+  

(2)創建數據庫:
語法:create database 數據庫名;

創建數據庫註意事項:
1) 在文件系統中,MySQL的數據存儲區將以目錄方式表示MySQL數據庫。因此,上面命令中的數據庫名字必須與操作系統的約束的目錄名字一致。例如不允許文件和目錄名中有\,/,:,*,?,”,<,>,|這些符號,在MySQL數據庫名字中這些字母會被自動刪除。<遵從目錄的約束>
2) 數據庫的名字不能超過64個字符,包含特殊字符的名字或者是全部由數字或保留字組成的名字必須用單引號``包起來。
3) 數據庫不能重名。

mysql> create database HA;  #創建一個名為HA的數據庫  
mysql> create database `HA-test`;  

[[email protected] ~]# ls /var/lib/mysql/  #查看數據庫存放目錄  

選擇要操作的數據庫:
使用USE語句將會選擇一個數據庫成為當前數據庫。後面的操作默認都在被選擇的數據庫中操作。

mysql> use HA-test;  
Database changed  

查看自己所處的位置及默認所在的位置

mysql> select database();  
+------------+  
| database() |  
+------------+  
| HA-test    |  
+------------+  
1 row in set (0.00 sec)  

默認

mysql> select database();  
+------------+  
| database() |  
+------------+  
| NULL       |  
+------------+  
1 row in set (0.00 sec)  

Null意味著沒有選擇數據庫

Null在數據庫中表示 不知道的數據,主要有3種意思:
1)知道數據存在,但不知道具體值;
2)不知道數據是否存在;
3)數據不存在。

在命令行選擇默認的數據庫

mysql -uroot -p123456 HA  
mysql> select now(),user(),database();  
+---------------------+------------------+------------+  
| now()               | user()           | database() |  
+---------------------+------------------+------------+  
| 2015-10-06 10:52:48 | [email protected] | HA         |  
+---------------------+------------------+------------+  

刪除數據庫:

mysql> drop database `HA-test`;  

刪除沒有任何提示,要慎重操作

方法2:直接到數據庫存放目錄移出就行

cd /usr/local/mysql/data/  
mv [email protected] /tmp  
mysql> show databases;  

使用IF EXISTS 子句以避免刪除不存在的數據庫時出現的MySQL錯誤信息

mysql> drop database if exists `HA-test`;  

IF EXISTS:如果存在
同理我們創建數據庫時也可以使用

mysql> create database if not exists HA;  

1.3.2 關於表的操作:

(1)創建表:
語法:create table 表名 (字段名 類型, 字段名 類型, 字段名 類型);

mysql> create table student(id int(20),name char(40),age int);  

(2)查看表相關信息:
查看表:
要進入到數據庫再查看

mysql> use mysql;  
Database changed  
mysql> show tables;  
+--------------+  
| Tables_in_HA |  
+--------------+  
| student      |  

(3)查看表的結構:
Describe

mysql> desc student;  
+-------+----------+------+-----+---------+-------+  
| Field | Type     | Null | Key | Default | Extra |  
+-------+----------+------+-----+---------+-------+  
| id    | int(20)  | YES  |     | NULL    |       |  
| name  | char(40) | YES  |     | NULL    |       |  
| age   | int(11)  | YES  |     | NULL    |       |  
+-------+----------+------+-----+---------+-------+  
3 rows in set (0.00 sec)  

mysql> explain mysql.user;  
mysql> show columns from mysql.user;  
mysql> show fields from mysql.user;  
mysql> show columns from mysql.user like ‘%user‘;  

會一種常用的就行
(4)查看創建表執行了哪些命令:

mysql> show create table student \G  
*************************** 1. row ***************************  
       Table: student  
Create Table: CREATE TABLE `student` (  
  `id` int(20) DEFAULT NULL,  
  `name` char(40) DEFAULT NULL,  
  `age` int(11) DEFAULT NULL  
) ENGINE=InnoDB DEFAULT CHARSET=utf8  
mysql> create table student2(id int(20),name char(40),age int)ENGINE=MyISAM DEFAULT CHARSET=utf8;  可以指定表的默認存儲引擎和字符集  

這兩個是默認存儲引擎和默認字符集

(5)刪除表:

mysql> drop table student2;  

(6)禁止預讀表信息:
沒有禁止前的提示

mysql> use performance_schema;  
Reading table information for completion of table and column names  
You can turn off this feature to get a quicker startup with -A  

登錄的時候加上-A參數

mysql -uroot –p123456 -A  

(7)修改表名稱ALTER:
語法:alter table 表名 rename 新表名;

mysql> use HA;  
mysql> alter table student rename students;  #studen表名修改為students  
mysql> show tables;  
+--------------+  
| Tables_in_HA |  
+--------------+  
| students     |  
+--------------+  

(8)修改表中的字段類型:
語法:alter table 表名 modify 要修改的字段名 要修改的類型;

mysql> desc students;  
+-------+----------+------+-----+---------+-------+  
| Field | Type     | Null | Key | Default | Extra |  
+-------+----------+------+-----+---------+-------+  
| id    | int(20)  | YES  |     | NULL    |       |  
| name  | char(40) | YES  |     | NULL    |       |  
| age   | int(11)  | YES  |     | NULL    |       |  
+-------+----------+------+-----+---------+-------+  

mysql> alter table students modify id int(10);

(9)修改表中的字段類型和字段名稱:
語法:alter table 表名 change 原字段名 新字段名 新字段類型;
查了一下官方文檔,發現mysql還真的不支持同時修改多個字段,
MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
來源:http://dev.mysql.com/doc/refman/5.5/en/alter-table.html

mysql> desc students;  
+-------+----------+------+-----+---------+-------+  
| Field | Type     | Null | Key | Default | Extra |  
+-------+----------+------+-----+---------+-------+  
| id    | int(10)  | YES  |     | NULL    |       |  
| name  | char(40) | YES  |     | NULL    |       |  
| age   | int(11)  | YES  |     | NULL    |       |  
+-------+----------+------+-----+---------+-------+  

mysql> alter table students change name stname char(20);

註:CHANGE 和MODIFY的區別:
CHANGE 對列進行重命名和更改列的類型,需給定舊的列名稱和新的列名稱、當前的類型。 MODIFY 可以改變列的類型,此時不需要重命名(不需給定新的列名稱)
(10)在表中添加字段:
語法:alter table 表名 add 字段名 字段類型;

mysql> alter table students add sex enum(‘M‘,‘W‘);  

(11)指定位置添加字段:
在第一列添加一個字段:

mysql> alter table students add uid int(10) first;  

在age後面添加一個address字段:

mysql> alter table students add address char(40) after age;  

(12)刪除表中字段:
語法:alter table 表名 drop 字段名 ;

mysql> alter table students drop address;  

1.3.3 關於記錄的操作:

(1)插入字段<記錄>INSERT:
語法:insert into 表名values (字段值1,字段值2, 字段值3);

mysql> create table student(id int(20),name char(40),age int);  
mysql> insert into student values(1,‘zhangs‘,21);   

插入記錄時要對應相對的類型

mysql> insert into student values(2,‘lis‘,24),(3,‘wange‘,26);  

同時插入多條,使用,分開

mysql> insert into student (id,name)values(4,‘hangl‘);  

指定字段插入

(2)查詢表中記錄:
語法:select * from 表名稱;

mysql> select * from student;  *表示所有  
+------+--------+------+  
| id   | name   | age  |  
+------+--------+------+  
|    1 | zhangs |   21 |  
|    2 | lis    |   24 |  
|    3 | wange  |   26 |  
|    4 | hangl  | NULL |  
+------+--------+------+  

當字段比較多的時候我們也可以使用\G
mysql> select * from student\G
只查詢表中某個字段的內容:

mysql> select name from student;  
+--------+  
| name   |  
+--------+  
| zhangs |  
| lis    |  
| wange  |  
| hangl  |  
mysql> select id,name from student;  
+------+--------+  
| id   | name   |  
+------+--------+  
|    1 | zhangs |  
|    2 | lis    |  
|    3 | wange  |  
|    4 | hangl  |  
+------+--------+  

(3)查看別的數據庫的表或者不在本數據庫上進行查看:
語法:SELECT 字段 FROM 數據庫名.表名;

mysql> select *from HA.student; 查看某個數據庫下指定的表內容,數據庫名.表名   
+------+--------+------+  
| id   | name   | age  |  
+------+--------+------+  
|    1 | zhangs |   21 |  
|    2 | lis    |   24  
 |  
|    3 | wange  |   26 |  
|    4 | hangl  | NULL |  
+------+--------+------+  

這樣等效於先use 數據庫,然後查看

(4)刪除記錄:
刪除id為3的行

mysql> delete from students where id=3;  

刪除age為空的行

mysql> delete from students where age is null;  

(5)更新記錄

mysql> update students set sex=‘M‘ where id=2;  

mysql> update students set id=2;  所有的都變為2  

update students set stname=‘zhangsan‘,age=21 where uid=1;  
同時更新多個字段時候用,號隔開  

1.3.4 SQL基礎條件查詢語句

語法:select 字段名1,字段名2 from 表名 [where 條件];
(1)查詢STUDENTS表中的NAME,AGE

mysql> select name,age from student;  
+--------+------+  
| name   | age  |  
+--------+------+  
| zhangs |   21 |  
| lis    |   24 |  
| jk     |   24 |  
| lo     |   26 |  
| io     |   25 |  
| jk     |   24 |  
+--------+------+  

(2)去重復查詢distinct

mysql> select distinct name,age from student;  
+--------+------+  
| name   | age  |  
+--------+------+  
| zhangs |   21 |  
| lis    |   24 |  
| jk     |   24 |  
| lo     |   26 |  
| io     |   25 | 
mysql> select  distinct id,name,age from student where id=3;  
+------+------+------+  
| id   | name | age  |  
+------+------+------+  
|    3 | jk   |   24 |  

select distinct from students; mysql的distinct可以對使用

(3)使用AND和OR進行多條件查詢
or和and 同時存在時,先算and的兩邊值,邏輯與先執行

mysql> select id,name,age from student where id>3 and age>25;  
+------+------+------+  
| id   | name | age  |  
+------+------+------+  
|    5 | lo   |   26 |  
+------+------+------+  
mysql> select id,name,age from student where id>3 or age>25;  
+------+------+------+  
| id   | name | age  |  
+------+------+------+  
|    5 | lo   |   26 |  
|    6 | io   |   25 |  
+------+------+------+ 

select * from students where stname=‘zhangsan‘ and (age=21 or age=24);
註意and和or都是用的時候的邏輯關系

(4)MYSQL區分大小寫查詢:
MySQL查詢默認是不區分大小寫的

mysql> select name from student where name=‘jk‘;  
+------+  
| name |  
+------+  
| jk   |  
| jk   |  
| JK   |  
+------+  

解決

mysql> select * from student where binary name=‘jk‘;  [?ba?n?ri]  
+------+------+------+------+  
| id   | name | age  | sex  |  
+------+------+------+------+  
|    3 | jk   |   24 | W    |  
|    3 | jk   |   24 | W    |  
+------+------+------+------+  

BINARY是類型轉換運算符,它用來強制它後面的字符串為一個二進制字符串,可以理解為在字符串比較的時候區分大小寫。

(5)MYSQL查詢排序:
語法:select distinct 字段1,字段2 from 表名order by 字段名;
默認為升序 asc

mysql> select distinct id from student order by id asc;  
+------+  
| id   |  
+------+  
|    2 |  
|    3 |  
|    5 |  
|    6 |  
|    8 |  
+------+  
mysql> select distinct id from student order by id desc;  
+------+  
| id   |  
+------+  
|    8 |  
|    6 |  
|    5 |  
|    3 |  
|    2 |  
+------+ 

1.3.5 關於MySQL命令幫助

help

mysql> help show; 

會告訴我們很多使用方法和信息

mysql> help select;  

MySQL入門篇