SQL 介紹和操做

一、什麼是SQL

  1. SQL的全稱是「結構話查詢語句」(Structured Query Language ),是1974年有Boyce和chamberlin 提出來的。通過多年的發展,SQL語言已經成爲關係數據庫的標準語言。
  2. SQL不一樣與java這樣的程序語言,它是隻能被數據庫識別的指令,可是在程序中,能夠利用其餘編程組織SQL語句發送給數據庫,數據庫在執行相應的操做。例如,在java程序中要獲得MYSQL數據表中的記錄,能夠在java程序中編寫SQL語句,再發送到數據庫,數據庫根據收到的SQL語句執行,並把執行的結果返回給java程序員。

二、SQL的組成

SQL yu言主要由如下幾個部分組成。html

  1. DML(Data Manipulation Language, 數據操做語言,也稱爲數據操縱語言);用來插入、修改和刪除數        據以庫中的數據,例如INSTER, UPDATE及DELETE等。
  2. DDL (Date Definition Language,數據定義語言);用來創建數據庫、數據庫對象和定義器列表,大部分          是CREATE 開頭的命令,如CREATE TABLE,CREATE VIEW ,以及DROP TABLE等。
  3. DQL(Data Query Language,數據查詢語句);用來對數據庫中數據進行查詢。
  4. DCL (Data Control Langure,數據控制語言);用來控制數據庫組件的存取許可,存取權限等,如                    GRANT,REVOKE等。

除此以外,SQL還包括變量說明,內部函數等其餘命令。java

三、SQL 中的運算符

運算符是一種符號,用來進行行列之間或變量之間進行比較和數學運算。在SQL中,經常使用的幾種運算符號有計算術運算符、賦值運算符、比較運算符和邏輯運算符。python

3.1算術運算符

算術運算符包括:+(加)、-(減)、*(乘)、/(除)、%(模)五個。算術運算符用來在兩個數或者表達式上執行數學運算,這兩個表達式能夠是任意兩個數字數據類型的表達式,如表1-5所示。mysql

SQL中的算術運算符程序員

運算符  
+ 求兩個或表達式相加的結果
- 求兩個或表達式相減的差
* 求兩個或表達式相乘的積 
/ 求兩個或表達式相除的商
% 求兩個或表達式相除的餘數

3.二、賦值運算符  

SQL有一個賦值運算符,即「=」(等號),用於用於將一個數或變量或表達式賦值給另外一變量,如:web

預算符 說明
= 把一個數或變量或表達式複製給另外一個變量,例如,Name=‘王華’

3.三、比較運算符

比較運算符用來判斷兩個表達式的大小關係,除text、ntext或image數據類型的表達類型表達外,比較運算符幾乎能夠用於其餘全部的表達式,SQL中的比較運算符如表面試

運算符 說明
= 等於,例如,age=23
> 大於,例如,price>100
< 小於
<> 不等於
>= 大於等於
<= 小於等於
!= 不等於

比較運算符計算結果爲布爾數據類型,並根據測試條件的輸出結果返回true或fale。sql

3.四、邏輯運算符

邏輯運算符用來對某個條件進行判斷,以得到判斷條件的真假,返回帶true或false值的布爾數據類型。數據庫

運算符 說明
AND  當僅且當兩個布爾表達式都爲true時返回true
OR 當且僅當兩個布爾表達式都爲false時返回false
NOT 對布爾表達式的值取反,優先級最高

 

4.使用DDL語句操做數據庫

4.1建立數據庫

MySQL中建立數據庫的基本SQL語法格式以下。編程

語法:

CREATE DATABASE 數據庫名;

例如,建立myschool數據庫的語句以下。

CREATE DATABASE  myschool;

4.2 查詢數據庫列表

執行查詢數據庫命令能夠查看已經存在的數據庫。

SHOW DATABASES;

從結果中發現,執行完成語句後,會顯示一列表,改列表中除了有新建的muschool數據庫以外,還有四個系統數據庫。

4.3 選擇數據庫

數據庫存放在數據表中,在對數據進行操做以前,須要肯定改表所在的數據庫,所以,在進行表操做以前須要先進行一個數據庫。

USE  數據庫名;
例如:
  USE  mybase;
  USE  myschool;

4.4 刪除數據庫

語法:DROP DATABASE 數據庫名;
例如:
    DROP  DATABASE myschool;



4.5新增用戶

(1)登陸:mysql -u root -p  

(2)查看現有用戶(mysql8.0.1)

複製代碼
mysql> select host,user,authentication_string from mysql.user; +-----------+------------------+----------------------------------------------------------------+
 | host | user | authentication_string |
 +-----------+------------------+----------------------------------------------------------------+
 | localhost | mysql.infoschema | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
 | localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
 | localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
 | localhost | root | $A$005$e!42 )Tf+4M{4W>MkFY9ktIVPhgVemeQsSQnuiGLRiH/909Zyaj9XF3/3Yk2 |
 +-----------+------------------+----------------------------------------------------------------+
複製代碼

(3)新建用戶

 格式:create user "username"@"host" identified by "password";

 eg:

1.mysql->create user 'test'@'localhost' identified by '123';
2.mysql->create user 'test'@'192.168.7.22' identified by '123'; 3.mysql->create user 'test'@'%' identified by '123';

    /*host="localhost"爲本地登陸用戶,host="ip"爲ip地址登陸,host="%",爲外網ip登陸*/

(4)刪除用戶

 格式:drop user 'username'@'host';

(5)受權

 格式:grant privileges on databasename.tablename to 'username'@'host' IDENTIFIED BY 'PASSWORD';

   1. GRANT命令說明:
        priveleges(權限列表),能夠是all priveleges, 表示全部權限,也能夠是select、update等權限,多個權限的名詞,相互之間用逗號分開。

        on用來指定權限針對哪些庫和表。

        *.* 中前面的*號用來指定數據庫名,後面的*號用來指定表名。

        to 表示將權限賦予某個用戶, 如 jack@'localhost' 表示jack用戶,@後面接限制的主機,能夠是IP、IP段、域名以及%,%表示任何地方。注意:這裏%有的版本不包括本地,之前碰到過給某個用戶設置了%容許任何地方登陸,可是                  在本地登陸不了,這個和版本有關係,遇到這個問題再加一個localhost的用戶就能夠了。

            identified by指定用戶的登陸密碼,該項能夠省略。

             WITH GRANT OPTION 這個選項表示該用戶能夠將本身擁有的權限受權給別人。注意:常常有人在建立操做用戶的時候不指定WITH GRANT OPTION選項致使後來該用戶不能使用GRANT命令建立用戶或者給其它用戶受權。

                 備註:可使用GRANT重複給用戶添加權限,權限疊加,好比你先給用戶添加一個select權限,而後又給用戶添加一個insert權限,那麼該用戶就同時擁有了select和insert權限。

  2.受權原則說明:

    權限控制主要是出於安全因素,所以須要遵循一下幾個經驗原則:

       a、只授予能知足須要的最小權限,防止用戶幹壞事。好比用戶只是須要查詢,那就只給select權限就能夠了,不要給用戶賦予update、insert或者delete權限。

       b、建立用戶的時候限制用戶的登陸主機,通常是限制成指定IP或者內網IP段。

       c、初始化數據庫的時候刪除沒有密碼的用戶。安裝完數據庫的時候會自動建立一些用戶,這些用戶默認沒有密碼。

       d、爲每一個用戶設置知足密碼複雜度的密碼。

       e、按期清理不須要的用戶。回收權限或者刪除用戶。

 eg:

複製代碼
   /*授予用戶經過外網IP對於該數據庫的所有權限*/

  grant all privileges on `test`.* to 'test'@'%' ;

  /*授予用戶在本地服務器對該數據庫的所有權限*/

  grant all privileges on `test`.* to 'test'@'localhost';   

   grant select on test.* to 'user1'@'localhost';  /*給予查詢權限*/

   grant insert on test.* to 'user1'@'localhost'; /*添加插入權限*/

   grant delete on test.* to 'user1'@'localhost'; /*添加刪除權限*/

   grant update on test.* to 'user1'@'localhost'; /*添加權限*/

  flush privileges; /*刷新權限*/
複製代碼

(6)查看權限

複製代碼
 show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
複製代碼
查看某個用戶的權限:
複製代碼
show grants for 'jack'@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for jack@%                                                                                   |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'jack'@'%' IDENTIFIED BY PASSWORD '*9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0' |
+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
複製代碼

(7)刪除權限

  revoke privileges on databasename.tablename from 'username'@'host';

revoke delete on test.* from 'jack'@'localhost';

(8)更改用戶名

  mysql> rename user 'jack'@'%' to 'jim'@'%';

(9)修改密碼

1.用set password命令

  mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

  Query OK, 0 rows affected (0.00 sec)

2.用mysqladmin [root@rhel5 ~]# mysqladmin -uroot -p123456 password 1234abcd

  備註: 格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼

3.用update直接編輯user表

(10)pycharm中python3.6+pymysql+mysql8.0.1鏈接報錯 

pymysql.err.OperationalError: (1045, u"Access denied for user 'root'@'localhost' (using password: No)")

解決方法: 

在cmd命令行鏈接mysql, 經過mysql -u root -p dong1990

 

而後輸入ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'dong1990';

 

 

 

5.SQLyog 管理工具

除了使用命令來操做MySQL數據庫以外,還可使用圖形話工具來管理數據庫。SQLyog官網(http://www.webyog.com/cn/)

 

 

 

6.使用DDL語句操做數據表

6.1 數據類型

咱們知知道在java中一般會吧實體對象抽象成爲一個實體類,一個實體類有不少的屬性,每一個屬性都有本身的數據類型,如保存員工的姓名咱們會選擇使用String類型,二保存員工的性別咱們可能會使用Character類型或者Integer類型。

數值類型

爲方便閱讀,下面列出了MySQL中的經常使用數值類型 

類型說明

 存儲需求

 取值範圍

tinyint[(m)]

1字節

有符號值:-128 到127(- 2^7 到2^7 – 1) 

無符號值:0到255(0 到2^8 – 1)

smallint[(m)]

2字節

有符號值:-32768 到32767(- 2^15 到2^15 – 1) 

無符號值:0到65535(0 到21 6 – 1)

mediumint[(m)]

3字節

有符號值:-8388608 到8388607(- 2^23 到2^23 – 1 ) 

無符號值:0到16777215(0 到2^24 – 1)

int[(m)]

4字節

有符號值:-2147683648 到2147683647(- 2^31 到2^31- 1) 

無符號值:0到4294967295(0 到2^32 – 1)

bigint[(m)]

8字節

有符號值:-9223372036854775808 到9223373036854775807(- 2^63到2^63-1) 

無符號值:0到18446744073709551615(0到2^64 – 1)

float[(m, d)]

4字節

最小非零值:±1.175494351e – 38

double[(m, d)]

8字節

最小非零值:±2.2250738585072014e – 308

decimal (m, d)

m字節(mysql < 3.23),

m+2字節(mysql > 3.23 )

可變;其值的範圍依賴於m 和d

 

6.2 字符串類型

數據類型

說明

CHAR

1~255個字符的定長串,它的長度必須在建立時指定,不然MySQL假定爲CHAR(1)

VARCHAR

可變長度,最多不超過255字節,如在建立時指定VARCHAR(n),則可存儲0~n個字符的變長串

TINYTEXT

同TEXT,最大長度爲255字節

MEDUIMTEXT

同TEXT,最大長度爲16K 

TEXT

最大長度爲64K的變長文本

LONGTEXT

同Text,最大長度爲4GB(純文本,通常不會到4G)

ENUM

接受最多64K個串組成的預約義集合的某個串

SET

接受最多64K個串組成的預約義集合的零個或多個串

 

6.3 日期類型

數據類型

存儲字節數

取值範圍

DATE

4

1000-01-01——9999-12-31

TIME

3

-838:59:59——838:59:59

DATETIME

8

1000-01-01 00:00:00——9999-12-31 23:59:59

TIMESTAMP

4

19700101080001——20380119111407

YEAR

1

1901——2155

7.建立表

以上咱們學習了MySQL中國經常使用的數據類型,接下來學習如何使用DDL建立數據庫表。

建立表語法以下:

CREATE TABLE [ IF NOT EXISTS ]  表名 (
        字段 1  數據類型  【字段屬性|約束】 【索引】【註釋】,
        字段 2  數據類型  【字段屬性|約束】 【索引】【註釋】,
         ......
        字段 n  數據類型  【字段屬性|約束】 【索引】【註釋】,
);

注意:

    MySQL的註釋方式

    單行註釋:#.....

    多行註釋:/*......*/

7.1經常使用的屬性約束

非空約束 NOT NULL 如該字段不容許爲空,須要設置NOT NULL約束。如學生的姓名。。
默認約束 DEFAULT 賦予某字段默認值,若是該字段沒有插入數據,則其值爲默認值,若是學生表中男生居多,能夠設置性別列爲默認值'男'
惟一約束 UNIQUE  KEY(UK) 設置字段的值是惟一的。容許爲空,單隻能有一個控值
主鍵約束 PRIMARY  KEY(PK) 設置改字段爲表的主鍵,能夠做爲改表記錄的惟一標識,如學號爲惟一肯定學生,能夠設置爲主鍵
外建約束 FOREIGN KEY(FK) 用於在兩表之間創建關係,須要指定引用主表的那一個字段。在發生插入或更新表中數據時,數據庫將自動檢查更新的字段的值是否符合約束的限制,如不符合約束的要求,則更新失敗。使用式注意;(1) InnoDB支持外鍵,MySAM不支持外鍵,外鍵關聯表要求都是InnoDB類型的表(2)做爲外鍵的字段要求在主表中式主鍵(單字段主鍵)
自動增加 AUTO_INCREMENT (1)設置該列爲自增字段,默認每條自增1;(2)一般用與設置主鍵,且爲整數類型。(3)可設置初始值和步長。

單字段主鍵在定義字段的同時指定主鍵,語法以下。

CREAT TABLE [IF NOT EXISTS] 表名 (
字段 1 數據類型 PRIMARY KEY,
....
);

在定義完所用字段指定主鍵,語法以下。

多字段聯合主鍵

主鍵有多字段組成,語法以下。

CREATE TABLE [IF NOT EXISTS] 表名 (
PRIMARY KEY [字段1,字段2。。。]
);

註釋

在建立表的同時能夠爲表或字段添加說明,機註釋。註釋式使用COMMENT關鍵字來添加的。例如:

CREATE TABLE test (
'id' int(11) UNSIGNED COMMENT '編號'
)COMMENT='測試表';

7.2編碼設置

在默認狀況下,MySQL 全部的數據庫、表、字段等使用MySQL默認字符集式utf8,也能夠在my。ini文件中的default-character-set參數來修改默認字符集。

當在特定需求下,爲達到特殊存儲內容要求,如某表須要存儲西歐文字內容,能夠指定其字符集。能夠在建立表時指定字符集,語法以下:

CREATE TABLE [IF NOT EXISTS] 表單(
#省略代碼)CHARASET=字符集名;

下面利用CREATE TABLE語句在數據庫myschool中建立學生表student,具體設計以下:

序號 字段名 字段說明 數據類型 長度 屬性 備註
1 studentNo 學號 INT 4 非空,主鍵  
2 loginPwd 密碼 VARCHAR 20 非空  
3 studentName 姓名 VARCHAR 50 非空約束  
4 sex 性別 CHARASET 2 非空,默認值‘男’  
5 gradeId 年級編號 INT 4 無符號  
6 phone 聯繫電話 VARCHAR 50    
7 address 地址 VARCHAR 255 默認值「地址不詳」  
8 bomData 出生年月 DATETIME      
9 email 郵件賬號 VARCHAR 50    
10 identityCard 身份證 VARCHAR 18 惟一 身份證好全國惟一

代碼請參見示例

CREATE TABLE 'student'(
'studentNo' INT(4) NOT NULL COMMENT'學號' #非空主鍵
'loginPwd' VARCHAR(20) NOT NULL COMMENT'密碼'
'studentName' VARCHAR(50) NOT NULL COMMENT'學生姓名'
'sex' CHARASET(2) NOT NULL COMMENT'性別' #非空,默認性別‘男’
'gradeId' INT(4) UNSIGNED COMMENT'年級編號' #無符號
'phone' VARCHAR(50) COMMENT'練習電話' 
'address' VARCHAR(255) DEFAULT'地址不詳' COMMENT'地址' #默認值
'bomData' DATETIME COMMENT'出生年月' 
'email' VARCHAR(50) COMMENT'郵件賬號'
'identityCard' VARCHAR(18) UNIQUE DEY COMMENT'身份證號' #惟一
)COMMENT='學生表'; #表註釋"學生表"

注意:建立的字段名是不須要加引號的,在插入數據數據值時都要加引號(例如INSERT等),上面的表達式爲參考示例,下面的纔是真實場景的運用。
MariaDB [msschool]> CREATE TABLE test1(
    -> loginPwd VARCHAR(20) NOT NULL COMMENT'密碼',
    -> studentName VARCHAR(50) NOT NULL COMMENT'學生姓名',
    -> sex CHAR(2) DEFAULT '男' NOT NULL COMMENT'性別',
    -> gradeId INT(4) UNSIGNED COMMENT'年級編號',
    -> phone VARCHAR(50) COMMENT'練習電話',
    -> address VARCHAR(255) DEFAULT'地址不詳' COMMENT'地址',
    -> bomData DATETIME COMMENT'出生年月',
    -> email VARCHAR(50) COMMENT'郵件賬號',
    -> identityCard VARCHAR(18) UNIQUE KEY COMMENT'身份證號'
    -> );
Query OK, 0 rows affected (0.04 sec)

 

7.3查看錶

建立完表以後,若是須要查看一下表式否存在,可使用查看錶的SQL命令,其語法以下:

SHOW TABLES;

若是要查看那表的定義,能夠經過SQL語句DESCRIBE來實現,其語法以下。

DESCRIBE 表名;
或
DES 代表;

查看備註信息

語法:

  show create table test;

示例:

MariaDB [msschool]> show create table test;
+-------+------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE `test` (
`loginPwd` varchar(20) NOT NULL COMMENT '密碼'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [msschool]>  

移動數據庫中表的操做

語法:

  rename 數據庫名.表名 to 數據庫名.表名;

  例如將old數據庫中的表移動到new數據庫中命令就是:

   rename table old.book to new.book;

 真實示例:

將new_sakila數據庫中的book表放到msschool數據庫中。

MariaDB [new_sakila]> show tables;
+----------------------+
| Tables_in_new_sakila |
+----------------------+
| book                 |
| student              |
| test                 |
| test1                |
+----------------------+
4 rows in set (0.00 sec)

MariaDB [new_sakila]> show databases;
+--------------------+
| Database           |
+--------------------+
| class              |
| information_schema |
| msschool           |
| mysql              |
| new_sakila         |
| performance_schema |
+--------------------+
6 rows in set (0.00 sec)

MariaDB [new_sakila]> use msschool;
Database changed
MariaDB [msschool]> show tables;
Empty set (0.00 sec)

MariaDB [msschool]> rename table new_sakila.book to msschool.book;
Query OK, 0 rows affected (0.01 sec)

MariaDB [msschool]> show tables;
+--------------------+
| Tables_in_msschool |
+--------------------+
| book               |
+--------------------+
1 row in set (0.00 sec)

MariaDB [msschool]> select * from book;
Empty set (0.00 sec)

MariaDB [msschool]> use new_sakila;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [new_sakila]> show tables;
+----------------------+
| Tables_in_new_sakila |
+----------------------+
| student              |
| test                 |
| test1                |
+----------------------+
3 rows in set (0.00 sec)

MySQL數據庫更名的三種方法

前不久去面試,被問到Innodb引擎的表如何改數據庫名,當時我也只回答了MyISAM改如何操做,被一些細節問題戰勝,真是操蛋。

若是表示MyISAM那麼能夠直接去到數據庫目錄mv就能夠。

Innodb徹底不行,本身測試過,會提示相關表不存在。

第一種方法:

RENAME database olddbname TO newdbname
這個是5.1.7到5.1.23版本能夠用的,可是官方不推薦,會有丟失數據的危險

第二種方法:
1.建立須要改爲新名的數據庫。
2.mysqldum 導出要更名的數據庫
3.刪除原來的舊庫(肯定是否真的須要)

固然這種方法雖然安全,可是若是數據量大,會比較耗時,哎,當時連這種方法都沒有想到,真有想死的衝動。


第三種方法:
我這裏就用一個腳本,很簡單,相信你們都看的懂
#!/bin/bash
# 假設將sakila數據庫名改成new_sakila
# MyISAM直接更改數據庫目錄下的文件便可

mysql -uroot -p123456 -e 'create database if not exists new_sakila'
list_table=$(mysql -uroot -p123456 -Nse "select table_name from information_schema.TABLES where TABLE_SCHEMA='sakila'")

for table in $list_table
do
    mysql -uroot -p123456 -e "rename table sakila.$table to new_sakila.$table"
done

7.4刪除表

和建立數據庫同樣,若是當前數據庫中已存在student表,則再次建立式系統將會提示出錯。

咱們須要預先檢測當前數據庫中是否存在該表,若是存在,則先刪除,而後建立,須要使用IF EXISTS語句進行判斷。刪除表的語法以下。

DROP TABLE [IF EXISTS] 表名;

7.5修改表

在建立了數據表以後,有時候可能會在某緣由須要修改表結構,如添加列等。這時,若是將表刪除後重建,每每還須要考慮表總現有的數據,風險比較大,此時須要在已存在的數據結構上對其進行修改,MySQL使用ALTER關鍵字來實現,注意在修改表以前,式用SHOW TABLES語句查看該數據庫中是否存在該表。

修改表名

ALTER TABLE <舊錶名> RENAME [TO] <新表名>;

其中,TO是可選參數,使用與否不影響結果。僅僅修改表名,表結構不變。

添加字段

ALTER TABLE 表名 ADD 字段名 數據類型 [屬性];

例如:

ALTER TABLE demon02 ADD 'password' VARCHAR(32) NOT NULL;

添加字段

ALTER TABLE 表名 CHANGE 原字段名 新字段名 數據類型 [屬性];

例如:

ALTER TABLE demon02 CHANGE 'username' CHAR(10) NOT NULL;

刪除字段

刪除字段式將數據從表中的某個字段中移除

ALTER TABLE 表名 DROP 字段名;

例如;刪除demon02 表中password 字段,SQL語句以下。

#刪除字段

ALTER TABLE demon02 DROP 'password';

 

添加主鍵約束

語法:
ALTER TABLE 表名 ADD CONSTRAINT 主鍵名 PRIMARY KEY 表名(主鍵字段);
例如,將grade表中的gradeld設置主鍵,語句以下。
ALTER TABLE 'grade' ADD CONSTRAINT 'pk_grade' PRIMARY KEY 'grade'('gradeId'); 

添加外鍵約束

語法:
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名 FOREING KEY(外鍵字段) REFERENCES 關聯表名(關聯字段);
例如,設置student表的gradld字段與grade表中的gradeld字段創建主外鍵關聯,語句以下。
ALTER TABLE 'student' ADD CONSTRAINT fk_student_grade FOREIGN KEY('gradeId') PEFERENCES 'grade' ('gradeId');

8.MySQL系統幫助

HELP 查詢內容;

其中,查詢內容爲要查詢的關鍵字。

(1)查看幫助文檔目錄列表

HELP contents;

(2)查看具體內容

HELP Data Types;

若要具體查看某一數據類型,如INT類型,命令以下;

HELP INT;

9.經常使用的MySQL數據存儲引擎

InnoDB: 支持事務處理,支持外鍵,支持崩潰修復能力和併發控制。若是須要對事務的完整性要求比較高(比        如銀行),要求實現併發控制(好比售票),那選擇InnoDB有很大的優點。若是須要頻繁的更新、刪除操做          的數據庫,也能夠選擇InnoDB,由於支持事務的提交(commit)和回滾(rollback)。

MyISAM: 插入數據快,空間和內存使用比較低。若是表主要是用於插入新記錄和讀出記錄,那麼選擇                    MyISAM 能實現處理高效率。若是應用的完整性、併發性要求比 較低,也可使用。 

功能 InnoDB MyISAM
支持事物 支持 不支持
支持索引 不支持 支持
外鍵約束 支持 不支持
表空間大小 較大 較小
數據行鎖定 支持 不支持

操做默認存儲引擎

安裝MySQL 5.5 以上版本的默認存儲引擎的是InnoDB,能夠經過如下語句來查看當前的默認存儲引擎。

查看數據庫的默認存儲引擎:

SHOW VARIABLES LIKE 'storage_engine%';

能夠經過修改默認存儲引擎,能夠經過配置嚮導,也能夠經過修改配置文件my.ini來實現。修改配置文件my.ini        時, 修改以下內容:defaultstoroge-engine=InnoDB

 

指定表的存儲引擎

數據表默認使用當前MySQL默認的存儲引擎,有時爲了達到數據表的特殊功能要求,也可從新設置表的存儲類    型,語法以下:

CREATE TABLE 表名 (

省略代碼

)ENGINE=存儲引擎;

例如:建立myisam表並設置爲MyISAM 類型,SQL語句以下。

CREATE TABLE 'myisam' (

id INT(4)

)ENGINE=MyISAM;

 

10.使用DML插入數據 

10.1使用INSERT插入數據

使用數據庫的以前,先要爲數據表添加數據,語法以下。

插入單行數據

語法:

INSERT INTO 表名 [字段名列表] VALUES(列表);

其中:

表的字段名是可選的,若是省略,則依次插入全部字段。

多個列表和多個值之間使用逗號分隔

值列表必須和字段名列表數量相同,且數據類型相符

若是插入的式表中部分數據,字段名列表必須填寫。

例如,向student表中插入一條記錄:

INSTER INTO 'STUDENT'('loginPwd','studentName','gradeId','phone','bornDate') VALUES('123','黃小平','1','13956799999','1996-5-8')

10.2.插入多行數據

在MySQL中INSTER語句支持一次插入多行記錄,插入時間能夠指定多個列表,每一個值列表之間用逗號分隔。

語法

INSTER INTO 新表(字段名列表) VALUE(值列表1),(列表2),....,(值列表n);

例如,一次向subject表中插入三條數據,SQL語句以下:

INSTER INTO 'subject'('subjectName','classHour','gradeID')VALUES('logic Java',220,1),('HTML',160,1),('Java OOP',230,2);

10.3.將查詢的結果插入新表

語法

CREATE TABLE 新表 (SELECT 字段1,字段2,..... FROM 原表);
例如,將student表中的studentName,phone字段數據保存到新表phoneList中,SQL語法以下。
CREATE TABLE 'phoneList'(SELECT 'studentNmae','phone', FROM 'student');

10.4.使用DML更新數據

數據更新式常常發生的事情,式用SQL能夠進行數據更新。使用SQL更新表中的某行的語法格式以下。

語法

UPDATE 表名 SET 列名 = 更新值 [WHERE 更新條件];

其中:

1.SET後面能夠緊隨多個"列明=更新值",修改多個數據列的值,不限一個,使用逗號分隔。

2.WHERE字句是可選的,用來限制更新數據的條件。若不限制,則整個表的全部數據行將備更新。

須要注意的式,使用UPDATE語句,可能更新一行數據,也可能更新多行數據,還可能不會更新任何數據。

例如,在學生信息表中,要吧全部學生的性別改成女性

UPDATE student SET sex = '女';

對地址爲'北京女子職業技術學校刺繡班'的學生,若這個班級改成家政班,則須要按照條件進行更新。

UPDATE sutdent
SET address ='北京職業技術學習家政班'
WHERE address ='北京女子職業技術學校刺繡班';

前面已經提到,在SQL表達式中,可使用列名和數值。若是寫生在考試時,有一道題目的目標準確答案錯了,      致使評分失誤,過後須要在成績表中更新成績,全部低於或等於95分的成績都在原來的基礎上加5分,更新的          SQL語句以下。

UPDATE result
SET studentResult = studentResult + 5 
WHERE studentResult <= 95;

10.5.使用DML刪除數據

刪除數據行也是常常會用到的操做,使用SQL語句來操做相對比較簡單。

使用DELETE刪除數據

使用SQL刪除表中的數據,語法格式以下。

語法

DELETE [FROM] 表名 [WHERE <刪除條件>];
在的學生信息表中刪除姓名"王寶寶"的數據的SQL語句以下。
DELETE FROM student WHERE sutdentNmae = '王寶寶';

11.使用TRUNCATE TABLE刪除數據

TRUNCATE TABLE用來刪除表中的全部行,功能上它相似於沒有WHERE 子句DELETE語句。

例如,要刪除學生信息表中的所用記錄行,可使用一下語句。

TRUNCATE TABLE student;

但TRUCATE TABLE 比DELECT執行速度快,使用的系統資源和事務資源更少,而且刪除數據後表的標識會從新開始編號。

12.使用DQL語句

使用SELECT語句進行查詢

語法:

SELECT <列名|表達式|函數|常量>
FROM<表名> 
[WHERE <查詢條件表達式>]
[ORDER BY <排序的列名>[ASC或DESC]];

其中,WHERE條件是可選的,若不限制,則查詢返回所用行的數據項。ORDER BY 是用來排序的,後續內容將        會詳細介紹。

12.1.查詢所用的數據行和列

把表中的全部行和列都列舉出來比較簡單,這個時候可使用"*",表示所用的列,例如:

SELECT * FROM student;

12.2.查詢部分行和列

查詢部分列須要列舉不一樣的列明,二查詢部分行須要使用WHERE子句進行條件限制,例如:

SELECT studentNo,sutentName,address FROM WHERE address = '河南新鄉';

以上的查詢語句,將只查詢地址爲河南新鄉的學生,而且顯示編號、姓名和地址列。同理,如下語句用來查詢地址不 是"河南新鄉"的學生信息。

SELECT studentNo,sutdentName,address FROM WHERE address <> '河南新鄉';

12.3.查詢中使用列的別名 

AS子句能夠用來改變結果集中列的名稱,也能夠爲組合或計算出列指定名稱,還有一種狀況式讓標題列的信息更易懂,例如,把studentNo列名查詢後顯示爲「學生編號」。

在SQL中從新命名列名可使用AS子句,例如

SELECT studentNo AS 學生編號,studentName AS 學生姓名,address AS 學生地址 FROM student WHERE            address <> '河南新鄉'

還有一種狀況是使用計算,和並獲得新列的命名。例如,假設在某數據庫的僱員表employee中存在firstName      列,如今須要將這兩項合併成一個叫做'姓名'的列,可使用如下查詢語句。

SELECT firstName+'.'+lastName AS 姓名 FROM employee;

12.4.查詢空值

在SQL語句中採用"IS NULL" 或者"IS NOT NULL" 來判斷是否爲空。所以,若是要查詢學生信息列表中沒有填寫      email信息的學生,可使用如下查詢。

SELECT studentName FROM student WHERE email IS NULL;

12.5.查詢中使用常量列

有時候,須要將一下常量的默認信息添加到查詢輸出中,以方便統計或計算。例如,查詢學生信息的時候,學        校    名稱統一都是"北京新興橋" ,查詢語句以下。

SELECT studentName AS 姓名,address AS 地址,'北京新興橋' AS 學校名稱 FROM student;

查詢輸出多一列「學校名稱」,改列的所用數據都是「北京新興橋」。

13.經常使用函數

SQL語言中的函數將一些經常使用的處理數據的操做封裝起來,這樣,就大大簡化了程序員的工做,提升了開發效      率,所以,除了會使用SQL語句以外,還須要掌握一些經常使用函數。如下分類列出了MySQL中經常使用函數。

13.1聚合函數

MySQL中的聚合函數使來已經有數據進行彙總,如求和、平均數、最大值、最小值等。MySQL中經常使用函數如:

函數名 做用

AVG() 返回某字段的平均值
COUNT() 返回某字段的行數
MAX() 返回字段的最大值
MIN() 返回某字段的最小值
SUM() 返回某字段的和

不少需求中咱們須要計算學員的總成績,在這裏就可使用SUM()函數。SQL語句以下

SELECT SUM (studentResult) FROM result;

同上,若是咱們要計算學員的平局成績,在這裏咱們就可使用AVG()函數。SQL語句以下

SELECT AVG (studentResult) FROM result;

13.2.字符串函數

字符串函數式經常使用函數之一,用來對字符串進行各種處理,MySQL中使用頻率較高的字符串函數表

函數名 做用 舉例  
CONCAT(str1,strq,...,strn) 鏈接字符串str1,str2....strn爲一個完整字符串 SELECT CONCAT('My','S','QL');返回:MySQL
INSERT 將字符串str從pos位置開始,len個字符長的子串替換爲字符串newstr SELECT INSERT('這是Oracle數據庫'3,6'MySQL');返回:這式MySQL數據庫
LOWER 將字符串str中所用字符變爲小寫 SELECT LOWER('MySQL');返回:mysql
UPPPER 將字符串str中所用字符變爲大寫 SELECT UPPER('MysSQL');返回:mysql
SUBSTRING 返回字符串str的第num個位置開始長度爲len的字符串 SELECT SUBSTRING('JavaMySQLOracle');返回:mysql
 

若是需求中規定咱們要對學員的姓名和首寫字母進行大寫。採用UPPER(str)函數的SQL語句以下

SELECT UPPER (studentName) FROM student;

13.3.時間日期函數

除了聚合函數和日期函數以外,日期函數也是一類經常使用函數。

 

函數名 做用 舉例    
CURDATE() 獲取當前日期 SELECT CURDATE(); 返回2016-08-08
CURTIME() 獲取當前時間 SELECT CURTIME(); 返回19:19:26
NOW() 獲取當前日期和時間 SELECT NOW();返回2016-08-08 19:19:26
WEEK(date) 返回日期date爲一年中的第幾周 SELECT WEEK(NOW()); 返回:26
YEAR(date) 返回日期date的年份 SELECT YEAR(NOW());返回:2016  
HOUR(time) 返回時間time的小時值 SELECT HOUR(NOW());返回:9  
MINUTE(time) 返回時間time的分鐘值 SELECT MINUTE(NOW());返回:43  
DATEDIFF(date1,date2) 返回日期參數date1和date2之間相隔的天數 SELECT DATEDIFF(NOW(),'2008-8-8');返回:2881  
ADDATE(date,n) 計算日期參數date加上n天后的日期 SELECT ADDDATE(NOW(),5);返回:2016-09-02 9:37:07

若是需求中規定咱們對學院的出生年份進行統計,採用YEAR(date)函數的SQL語句以下。

SELECT YEAR(bornDate) from student;

13.4.數學函數

在使用SQL語句進行數據操做時,有時會須要進行數值運算,MySQL中支持的經常使用數學函數

函數名 做用 舉例  
CEIL(x) 返回大於等於數據x的最小整數 SELECT CEIL(2.3);返回:3
FLOOR(x) 返回小於等於數據x的最大整數 select FLLOR(2.3);返回:2
RAND(x) 返回0~1間的隨機數 SELECT RAND();返回:0.5525468583708134

若是需求中規定咱們對學員的分數繼續取整,採用CEIL(x)函數的SQL語句以下。

SELECT CEIL (studentResult) from result;

13.5.ORDER BY 字句

若是須要按照必定順序排查語句選中的行,則須要是使用ORDER BY 子句。而且排序能夠是升序(ASC)或者降序(DESC).結果按默認升序排序。

上述講過的SQL語句,均可以在其後面加上ORDER BY 來進行排序。

例如,查詢學生成績的時候,若是把所用成績都下降10%或加5分,再查詢及格並按照成績高低來進行排列.SQL語句以下語句以下。

SELECT studentID AS 學生編號,(student*0.9+5) AS 綜合成績
FORM RESULT WHERE (studentResult*0.9+5) > 60
ORDER BY studentResult;

還能夠按照多個列進行排序。例如,要在學生成績排序的基礎上,在按照課程ID進行排序的語句以下。

SELECT studentID AS 學生編號, courseID AS 課程ID , studentREsult AS 成績
FROM result
WHERE studentResult>60
ORDER BY studentResult,courseID;

13.6.LIMIT 子句

以上操做中實現了基礎的對數據庫的查詢操做,可是展現的式一個數據庫中的所有數據。但實際開發中,可能只是要求顯示指定行數的記錄。接下來將介紹如何經過DQL語句限制查出的數據的數目。

語法 :

SELECT <字段名列表>
FROM <表名或視圖>
[where <查詢條件>]
[GROUP BY<分組的字段名>]
[ORDER BY <排序的列名>[ASC或DESC]]
[LIMIT [位置偏移量,]行數];

在上述語法中在LIMIT部分介紹以下:

位置偏移量指定從結果集中第幾條數據開始顯示(第1條記錄的位置偏移量是0,第二條記錄的位置偏移量是1...),此參數可選,當省略式從第1條記錄開始顯示。

行數指顯示記錄的條數。

LIMIT子句能夠實現數據的分頁查詢,即從一批結果數據中,規定每頁顯示多少條數據,能夠查詢中間某頁記錄。LIMIT子句常常與ORDER BY 子句一塊兒使用,即先查詢結果進行排序,而後根據LIMIT的參數那個顯示其中部分數據。例如,查詢所用年級編號爲1的學員信息,按學好升序顯示前4條記錄。SQL語句以下

SELECT 'studentNo','studentName','phone','address','bornDate'
FROM 'student'
WHERE 'gradeId'=1
ORDER BY studentNo
LIMIT 4;

以上示例省略位置偏移量,從第1條記錄開始顯示,若是每頁顯示4條數據,要求顯示第2頁所有數據,通過計算,應從第5條記錄開始顯示4條數據。則SQL語句以下 

SELECT 'studentNo','studentName','phone','address','bornDate'
FROM 'student'
WHERE 'gradeId' = 1 
ORDER BY studentNo
LIMIT 4,4;

14.子查詢

簡單子查詢

#查找出"李斯文"的出生日期

SELECT 'bornDate' FROM 'student' WHERE 'sutdentname' = '李斯文';

返回結果是:'1993-07-23'

#利用WHERE語句篩選出出生日期比"李斯文"大的學生

SELECT studentNo, studentName,sex,bornDate,address FROM 'student' WHERE bornDate > '1993-07-23';

咱們能夠看到執行的語句比較複雜,有沒有更簡潔的表示方式呢?固然是有的

SELECT studentNo, studentName,sex,bornDate,address FROM 'student' WHERE bornDate > (SELECT 'bornDate' FROM 'student' WHERE 'sutdentname' = '李斯文');

語法:

SELECT ..... FROM 表1 WHERE 字段1 比較預算符 (子查詢)

其中,子查詢語句必須放在一對圓括號內,比較運算符包括:>,=,<,>=,<=。

習慣上外表的查詢稱爲父查詢,圓括號中嵌入的查詢語句稱爲子查詢。執行時,先執行查詢部分,求出子查詢部分的值,在執行整個父查詢,返回最後的結果。

由於子查詢做爲WHERE條件的一部分,因此能夠和UPDATA,INSTER,DELETE一塊兒使用,語法相似與SELECT語句。

注意:

將子查詢和比較運算符聯合使用,必須保證子查詢返回的值不能多於一個。

15.IN和NOT IN 子查詢

使用IN關鍵子可使父查詢匹配子查詢返回的多少單字段

IN子查詢

使用=,>等比較運算符時,要求子查詢只能返回一條或空的記錄。在MySQL中,當子查詢跟隨在=,!=,<,<=,>和>=以後時,不容許子查詢返回多條記錄。

語法格式以下:

  SELECT * FROM A WHERE COLUMN IN (SELECT COLUMN FROM B);

  須要說明的是,WHERE中,COLUMN爲A的某一列,IN 所對應的子查詢語句返回爲一列多行結果集

注意,IN所對應的SELECT語句返回的結果必定是一列!能夠爲多行。

示例以下:

SELECT * FROM P_USER_2 WHERE ID [NOT] IN (SELECT ID FROM P_USER )
查詢ID在P_USER表ID集合的P_USER_2的記錄。NOT IN則相反。

16.EXIST和NOT EXIST 子查詢

EXIST 關鍵字咱們並不陌生,在學習在學習長庫和創表的時候用過,用它來檢查數據庫是否存在。下面來分別介紹EXIST 和NOT EXIST查詢

16.1.EXIST子查詢

在執行CREAT 和DROP語句前,可使用EXIST語句判斷該數據對象是否存在,返回值式true或false。例如,若是存在數據表temp,則先刪除它。而後從新建立。

DROP TABLE IF EXISTS temp;

以上用法外,EXIST也能夠存在WHERE語句的子查詢,其基本語法以下。

語法:

SELECT ......  FROM 表名 WHERE EXISTS(子查詢);

EXISTS後面的參數是一個任意的子查詢,若是改子查詢有返回行,則exist子查詢的結果爲true,此時在執行外層查詢語句。若是子查詢沒有返回行,則EXIST子查詢的結果爲false,此時外層語句不在執行查詢。

例句:

SELECT 'student' AS 學號, 'studentResult' 成績 FROM 'result' 
  WHERE EXIST (
  #查詢Llogic Java 最後一次考試成績大於80的記錄
    SELECT * FROM 'reslut'  
    WHERE 'subjectNO' = (SELECT 'subjectNo' FROM 'subject'  WHERE 'subjectName' = 'Logic Java') 
    AND 'examDAte' = (
      SELECT MAX('examDAte' ) FROM 'result' 
      WHERE 'subjectNo' =(SELECT 'subjectNo' FROM 'subject' WHERE 'subjectName' = 'Logic Java') )
    AND 'studentResult' > 80
    )
  AND 'subjectNo' = ( SELECT 'subjectNo' FROM 'subject' WHERE 'subjectName' = 'Logic Java')
  ORDERY BY 'studentResult' DESC  LIMIT 5;

16.2.子查詢注意事項

在完成比較複雜的數據查詢時,常常會用到子查詢。編寫子查詢語句時,要注意以下事項。

1)子查詢語句能夠鑲嵌在SQL語句中任何表達式出現的位置

在SELECT語句中,子查詢能夠鑲嵌在SELECT語句的列、表和查詢條件中,機SELECT子句、FROM子句、WHERE子句、GROUP BY 子句和HAVNING子句。已經介紹了WHERE子句中嵌套子查詢的使用方法,下面是子查詢在SELECT子句和FROM子句中的使用語法。

嵌套在SELECT語句中的SELECT子句中的子查詢語句以下。

語法:

SELECT (子查詢) FROM  表名;

 

嵌套在SELECT語句的FROM子句中的子查詢語句以下。

語法:

SELECT * FORM (子查詢) AS 表的別名;

 

2)只出如今子查詢中沒有出如今父查詢中的表不能包含輸出列中

多層嵌套查詢的最終數據集只包含父查詢(即最外層的查詢)的SELECT 子句中出現的字段,而子查詢的輸出結果一般做爲其外層子查詢的數據源或用於數據判斷匹配。

常見錯誤

 SELECT * FROM (SELECT * FROM result);

這個子查詢語句產生語法錯誤的緣由在於主查詢語句的FROM子句是一個查詢語句,所以一個該爲子查詢結果集指定別名。正確的代碼以下:

SELECT * FROM (SELECT * FROM result) as Temp;

 

17.分組查詢

17.1.使用GROUP BY 進行分組查詢

看一下學生成績表中,表中存儲了學生參加考試的成績。有時,可能須要統計不通科目的平均成績,也就是說,首先須要多成績表中的記錄按照課來分組,而後針對每個組來進行平均成績計算。

這種狀況很廣泛,例如,一個電器銷售店,銷售洗衣機,冰箱,電視,月末時,就須要分類統計洗衣機銷售總數、冰箱銷售總數、電視銷售總數。這個時候就須要首先分類,將冰箱、洗衣機、電視分爲三組,而後在每組的基礎上分別進行彙總和統計。這實際上也就是分組查詢的原理。返組後的統計計算利用前面學習過的彙總和統計。這實際上也是分組查詢的原理。分組後的統計計算要利用起前面學過的集合函數,如SUM(),AVG()等。

假設有個成績表,該成績表記錄了三門課程的學生成績、課程編號(subject)分別是一、二、3。此時,要統計不一樣課程的平均分數。首先把相同的subjectNo都分爲一組,這樣就將數據評分紅三組,而後針對每一組使用前面的聚合函數取平均值,這樣就獲得沒門課程的怕你平均分數。

語句以下:

SELECT subjectNo, AVG(studentResult) AS 課程平均成績

FROM result

GROUP BY subjectNo;

多列分組查詢

分組查詢有時候可能還要按照多個列來進行分組。例如,學生信息表的student中記錄了每一個學生的信息,包括所述年級和性別等,

若是要統計每一個學期男,女生人數,則理論生先把每一個學期分開,在針對每一個學期,把男,女生人數各自統計,也就是須要按照連個列進行分組:所屬年級和性別。SQL語句以下。

SELECT COUNT(*) AS 人數,grade  AS 年級,sex AS 性別 FROM studnet  

GROUP BY grade,sex

ORDER BY grade;

17.2.使用HAVING子句進行分組篩選

經過前面的學習,咱們已經基本瞭解分組查詢的意義和原理。當咱們須要查詢總人數大於1的年級時,咱們的所學到的 SQL是不能知足需求的,此時咱們就須要用到HAVING。

咱們的限定條件爲COUNT(*)>2。這個時候使用WHERE子句式否能知足查詢要求,所以WHERE子句只能沒有分組統計前的數據進行篩選。對分組後的條件進行篩選必須使用HAVING子句。簡單來講,HAVING子句用來對分組後的數據進行篩選,將組看做列來限定條件。

SQL語句以下:

SELECT COUNT(*) AS 人數,gradeId AS 年級  FROM student*

GROUP BY graeId

HAVING COUNT(*)>2;

17.3.查詢平均成績達到及格的課程信息

在查詢每一個科目平均分的基礎上,增長了一個條件;平均分及格的科目。這樣按照科目進行分組後,使用AVG(studet;)>=60控制條件便可。

SQ語句以下:

SELECT subjectNo AS 課程編號,AVG(studentResult) AS 平均成績

FROM result  

GROUP BY subjectNo

HAVING AVG(studentResult)>=60;

HAVING 和WHERE 子句能夠在同一個SELECT語句中一塊兒是使用,使用順序以下:

WHERE ----> GROUP BY ----> HAVING  

提示:

在SELECT語句中,WHERE,GROUP BY ,HAVING子句和聚合函數的執行次序以下:WHERE 子句從數據源中去掉不符合其搜索條件的數據;GROUP BY 子句收集數據到各組中,統計函數爲各組計算統計值;

HAVING 子句去掉不符號其組搜索條件的各組數據。

查詢沒門課程及格總人數和幾個平局分分在80分以上的記錄

SELECT COUNT(*) AS 人數,AVG(studentResult) AS 平均分,subjectNo AS 課程

FROM result

WHERE studentResult>=60

GROUP BY subjectNo

HAVING AVG(studentResult)>=80;

  

18.多表鏈接查詢

多表鏈接查詢其實是經過各個表之間共同列的關聯性來查詢數據的,它是關係數據庫查詢最主要的特徵

1.內連接查詢

內連接查詢式最典型,最經常使用的鏈接查詢,它根據表中共同的列列來進行匹配。特別是兩個表存在主外鍵關係時一般會使用內鏈接查詢。

2.外鏈接查詢

外鏈接查詢式至少返回一個表中的全部記錄,根據匹配條件有選擇性的返回另外一張表的記錄。外鏈接能夠是左外鏈接,右外鏈接。

 

18.1內連接查詢

內連接查詢一般會使用'+'或'<>'等比較運算符來判斷兩個列數據值是否相等,上面所說的根據學生學號來判斷學生姓名的鏈接式一種內連接。

內連接有INNER JOIN... ON 關鍵子或WHERE子句來進行表之間的關聯。內鏈接查詢能夠經過兩種方式實現。

在WHERE子句中指定鏈接條件

例如,查詢學生姓名和成績的SQL以下。

SELECT student.studentName,result.subjectNo,result.studentResult

FROM student,result

WHERE STUDENT.studentNo = result.studentNo;

上面這種形式的查詢,至關與FROM後面緊跟兩個表名,在字段表中使用"表名.列表"來區分列,再在WHERE條件子句加以判斷,要求學生編號信息相等。

在FROM子句中使用INNER JOIN...ON  

上面的查詢也能夠經過的JOIN...ON子句來實現

SELECT S.studentName,R.subjectNo,studentResutl

FROM student AS  S  

INNER JOIN  result AS R ON (S.studentNo = R.studentNo);

 

18.2內連接查詢詳解

用兩個表(a_table、b_table),關聯字段a_table.a_id和b_table.b_id來演示一下MySQL的內鏈接、外鏈接( 左(外)鏈接、右(外)鏈接、全(外)鏈接)。

MySQL版本:Server version: 5.6.31 MySQL Community Server (GPL)

數據庫表:a_table、b_table

主題:內鏈接、左鏈接(左外鏈接)、右鏈接(右外鏈接)、全鏈接(全外鏈接)

前提
建表語句:
CREATE TABLE `a_table` (
`a_id` int(11) DEFAULT NULL,
`a_name` varchar(10) DEFAULT NULL,
`a_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `b_table` (
`b_id` int(11) DEFAULT NULL,
`b_name` varchar(10) DEFAULT NULL,
`b_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

表測試數據:

 


1、內鏈接
關鍵字:inner join on
語句:select * from a_table a inner join b_table bon a.a_id = b.b_id;
執行結果:

 


說明:組合兩個表中的記錄,返回關聯字段相符的記錄,也就是返回兩個表的交集(陰影)部分。

 

2、左鏈接(左外鏈接)
關鍵字:left join on / left outer join on
語句:select * from a_table a left join b_table bon a.a_id = b.b_id;
執行結果:

 


說明:
left join 是left outer join的簡寫,它的全稱是左外鏈接,是外鏈接中的一種。
左(外)鏈接,左表(a_table)的記錄將會所有表示出來,而右表(b_table)只會顯示符合搜索條件的記錄。右表記錄不足的地方均爲NULL。

 

3、右鏈接(右外鏈接)
關鍵字:right join on / right outer join on
語句:select * from a_table a right outer join b_table b on a.a_id = b.b_id;
執行結果:

 


說明:
right join是right outer join的簡寫,它的全稱是右外鏈接,是外鏈接中的一種。
與左(外)鏈接相反,右(外)鏈接,左表(a_table)只會顯示符合搜索條件的記錄,而右表(b_table)的記錄將會所有表示出來。左表記錄不足的地方均爲NULL。

 

(1)登陸:mysql -u root -p  

(2)查看現有用戶(mysql8.0.1)

複製代碼
mysql> select host,user,authentication_string from mysql.user; +-----------+------------------+----------------------------------------------------------------+
 | host | user | authentication_string |
 +-----------+------------------+----------------------------------------------------------------+
 | localhost | mysql.infoschema | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
 | localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
 | localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
 | localhost | root | $A$005$e!42 )Tf+4M{4W>MkFY9ktIVPhgVemeQsSQnuiGLRiH/909Zyaj9XF3/3Yk2 |
 +-----------+------------------+----------------------------------------------------------------+
複製代碼

(3)新建用戶

 格式:create user "username"@"host" identified by "password";

 eg:

1.mysql->create user 'test'@'localhost' identified by '123';
2.mysql->create user 'test'@'192.168.7.22' identified by '123'; 3.mysql->create user 'test'@'%' identified by '123';

    /*host="localhost"爲本地登陸用戶,host="ip"爲ip地址登陸,host="%",爲外網ip登陸*/

(4)刪除用戶

 格式:drop user 'username'@'host';

(5)受權

 格式:grant privileges on databasename.tablename to 'username'@'host' IDENTIFIED BY 'PASSWORD';

   1. GRANT命令說明:
        priveleges(權限列表),能夠是all priveleges, 表示全部權限,也能夠是select、update等權限,多個權限的名詞,相互之間用逗號分開。

        on用來指定權限針對哪些庫和表。

        *.* 中前面的*號用來指定數據庫名,後面的*號用來指定表名。

        to 表示將權限賦予某個用戶, 如 jack@'localhost' 表示jack用戶,@後面接限制的主機,能夠是IP、IP段、域名以及%,%表示任何地方。注意:這裏%有的版本不包括本地,之前碰到過給某個用戶設置了%容許任何地方登陸,可是                  在本地登陸不了,這個和版本有關係,遇到這個問題再加一個localhost的用戶就能夠了。

            identified by指定用戶的登陸密碼,該項能夠省略。

             WITH GRANT OPTION 這個選項表示該用戶能夠將本身擁有的權限受權給別人。注意:常常有人在建立操做用戶的時候不指定WITH GRANT OPTION選項致使後來該用戶不能使用GRANT命令建立用戶或者給其它用戶受權。

                 備註:可使用GRANT重複給用戶添加權限,權限疊加,好比你先給用戶添加一個select權限,而後又給用戶添加一個insert權限,那麼該用戶就同時擁有了select和insert權限。

  2.受權原則說明:

    權限控制主要是出於安全因素,所以須要遵循一下幾個經驗原則:

       a、只授予能知足須要的最小權限,防止用戶幹壞事。好比用戶只是須要查詢,那就只給select權限就能夠了,不要給用戶賦予update、insert或者delete權限。

       b、建立用戶的時候限制用戶的登陸主機,通常是限制成指定IP或者內網IP段。

       c、初始化數據庫的時候刪除沒有密碼的用戶。安裝完數據庫的時候會自動建立一些用戶,這些用戶默認沒有密碼。

       d、爲每一個用戶設置知足密碼複雜度的密碼。

       e、按期清理不須要的用戶。回收權限或者刪除用戶。

 eg:

複製代碼
   /*授予用戶經過外網IP對於該數據庫的所有權限*/

  grant all privileges on `test`.* to 'test'@'%' ;

  /*授予用戶在本地服務器對該數據庫的所有權限*/

  grant all privileges on `test`.* to 'test'@'localhost';   

   grant select on test.* to 'user1'@'localhost';  /*給予查詢權限*/

   grant insert on test.* to 'user1'@'localhost'; /*添加插入權限*/

   grant delete on test.* to 'user1'@'localhost'; /*添加刪除權限*/

   grant update on test.* to 'user1'@'localhost'; /*添加權限*/

  flush privileges; /*刷新權限*/
複製代碼

(6)查看權限

複製代碼
 show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
複製代碼
查看某個用戶的權限:
複製代碼
show grants for 'jack'@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for jack@%                                                                                   |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'jack'@'%' IDENTIFIED BY PASSWORD '*9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0' |
+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
複製代碼

(7)刪除權限

  revoke privileges on databasename.tablename from 'username'@'host';

revoke delete on test.* from 'jack'@'localhost';

(8)更改用戶名

  mysql> rename user 'jack'@'%' to 'jim'@'%';

(9)修改密碼

1.用set password命令

  mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

  Query OK, 0 rows affected (0.00 sec)

2.用mysqladmin [root@rhel5 ~]# mysqladmin -uroot -p123456 password 1234abcd

  備註: 格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼

3.用update直接編輯user表

(10)pycharm中python3.6+pymysql+mysql8.0.1鏈接報錯 

pymysql.err.OperationalError: (1045, u"Access denied for user 'root'@'localhost' (using password: No)")

解決方法: 

在cmd命令行鏈接mysql, 經過mysql -u root -p dong1990

 

而後輸入ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'dong1990';

相關文章
相關標籤/搜索