1、數據庫介紹篇
1.1什麼是數據庫
數據庫:保存數據的倉庫。它體現我們電腦中,就是一個文件系統。然後把數據都保存這些特殊的文件中,並且需要使用固定的語言(SQL語言)去操作文件中的數據。
技術定義:
數據庫(Database)是按照數據結構來組織、[存儲和管理數據的建立在計算機存儲設備上的倉庫。
1.2數據庫介紹
我們開發應用程序的時候,程序中的所有數據,最後都需要保存到專業軟件中。這些專業的保存數據的軟件我們稱爲數據庫。
我們學習數據庫,並不是學習如何去開發一個數據庫軟件,我們學習的是如何使用數據庫以及數據庫中的數據記錄的操作。而數據庫軟件是由第三方公司研發。
1.3數據庫的分類
關係型、非關係型的數據庫
常見的數據庫軟件:
Oracle:它是Oracle公司的大型關係型數據庫,它是收費的。
DB2:IBM公司的數據庫,它是收費的。
SqlServer:微軟數據庫。收費
Sybase:Sybase公司的。 工具PowerDesign 數據庫建模工具。
MySql:早期瑞典一個公司發明,後期被sun公司收購,後期被Oracle。
Java開發應用程序主要使用的數據庫:
MySQL(5.5)、Oracle、DB2。
1.4什麼是關係型數據庫
在開發軟件的時候,軟件中的數據之間必然會有一定的關係存在,需要把這些數據保存在數據庫中,同時也要維護數據之間的關係,這時就可以直接使用上述的那些數據庫。而上述的所有數據庫都屬於關係型數據庫。
描述數據之間的關係,並保存在數據庫中,同時學習如果根據這些關係查詢數據庫中的數據,
關係型數據:設計數據庫的時候,需要使用E-R圖來描述。實體關係
E-R:實體關係圖。
實體:可以理解成我們Java程序中的一個對象。在E-R圖中使用 矩形(長方形) 表示。
針對一個實體中的屬性,我們稱爲這個實體的數據,在E-R圖中使用 橢圓表示。
實體和實體之間的關係:在E-R圖中使用菱形表示。
2、mysql在linux-安裝篇
##2.1、vmware中安裝linux注意事項
###2.1.1、記得關閉防火牆
service iptables stop
chkconfig iptables off(關閉開機自啓:所謂的永久關閉防火牆)
###2.1.2、創建統一的管理目錄
mkdir -p /exprot/software
mkdir -p /export/servers
2.1.3軟件環境
VMware、crt、centos6.9
2.1.4安裝環境
1、VMware軟件安裝
2、構建虛擬機
3、需要配置Linux(ip,mac地址,hostname,防火牆),就可以通過crt這個客戶端連接進行操作
4、在linux操作系統進行安裝msyql-5.6
說明:因爲在linux操作系統中,安裝軟件的方式主要有3種:1、源碼安裝(redis)2、rpm安裝
3、yum在線安裝(安裝MySQL爲例)---linux聯網()
2.2、centos6.9安裝mysql
###2.2.1、檢查是否有自帶的mysql
[root@hadoop-01 servers]# rpm -qa |grep mysql
mysql-libs-5.1.73-8.el6_8.x86_64
###2.2.2、卸載自帶的mysql
[root@hadoop-01 servers]# rpm -e --nodeps mysql-libs-5.1.73-8.el6_8.x86_64
[root@hadoop-01 servers]#
###2.2.3、下載mysql安裝包
###2.2.4、上傳安裝包到linux服務器
rz 上傳文件到指定的目錄(yum install lrzsz)
/export/software/mysql
###2.2.5、安裝
rpm -ivh *.rpm
2.2.6、查看初始化密碼
A RANDOM PASSWORD HAS BEEN SET FOR THE MySQL root USER !
You will find that password in '/root/.mysql_secret'.154·
[root@mysql ~]# cat /root/.mysql_secret
# The random password set for the root user at Wed Aug 8 22:19:00 2018 (local time): xQkcU3kbyuZby1_V
[root@mysql ~]#
###2.2.7、啓動mysql並登錄
#啓動mysql
service mysql start
#登錄mysql
mysql -uroot -p
(粘貼密碼:xQkcU3kbyuZby1_V)
###2.2.8、修改密碼
set PASSWORD=PASSWORD('123456');
###2.2.9、退出mysql客戶端
mysql>quit
###2.2.10、用新密碼進行登錄
mysql -uroot -p
123456(新密碼)
###2.2.11、遠程授權(賦予任何主機訪問你數據庫的權限)
grant all privileges on *.* to 'root' @'%' identified by '123456';
flush privileges;
###2.2.12、驗證遠程授權是否成功
通過windows的mysql客戶端工具連接,是否能連接上,能連接上就授權成功,沒有連接上,說明沒有授權成功!
3、mysql-基礎操作篇
3.1、登錄mysql
mysql -uroot -p
123456
3.2、退出mysql
mysql>quit
3.3、輸入查詢
-
查看當前mysql的版本號及當前時間
SELECT VERSION(), CURRENT_DATE;
mysql> SELECT VERSION(), CURRENT_DATE; +-----------+--------------+ | VERSION() | CURRENT_DATE | +-----------+--------------+ | 5.6.25 | 2018-08-08 | +-----------+--------------+ 1 row in set (0.32 sec)
-
mysql中sql語句不區分大小寫
mysql> SELECT VERSION(), CURRENT_DATE; mysql> select version(), current_date; mysql> SeLeCt vErSiOn(), current_DATE;
mysql> SELECT VERSION(), CURRENT_DATE; +-----------+--------------+ | VERSION() | CURRENT_DATE | +-----------+--------------+ | 5.6.25 | 2018-08-08 | +-----------+--------------+ 1 row in set (0.00 sec) mysql> select version(), current_date; +-----------+--------------+ | version() | current_date | +-----------+--------------+ | 5.6.25 | 2018-08-08 | +-----------+--------------+ 1 row in set (0.00 sec) mysql> SeLeCt vErSiOn(), current_DATE; +-----------+--------------+ | vErSiOn() | current_DATE | +-----------+--------------+ | 5.6.25 | 2018-08-08 | +-----------+--------------+ 1 row in set (0.00 sec) mysql>
-
可以進行簡單的計算(如下所示)
mysql>SELECT SIN(PI()/4), (4+1)*5; mysql> SELECT SIN(PI()/4), (4+1)*5; +--------------------+---------+ | SIN(PI()/4) | (4+1)*5 | +--------------------+---------+ | 0.7071067811865475 | 25 | +--------------------+---------+ 1 row in set (0.34 sec)
-
多條語句比較短,可以寫在一行
mysql>SELECT VERSION(); SELECT NOW(); mysql> SELECT VERSION(); SELECT NOW(); +-----------+ | VERSION() | +-----------+ | 5.6.25 | +-----------+ 1 row in set (0.00 sec) +---------------------+ | NOW() | +---------------------+ | 2018-08-08 23:11:11 | +---------------------+ 1 row in set (0.00 sec)
-
多個字段之間可以用逗號分隔,多行組成一條語句結束以分號結束
mysql> SELECT -> USER() -> , -> CURRENT_DATE; +---------------+--------------+ | USER() | CURRENT_DATE | +---------------+--------------+ | jon@localhost | 2010-08-06 | +---------------+--------------+
-
sql語句寫了一半,又不想執行可以在語句末尾加上'\c'
mysql> select -> user() -> \c mysql>
##3.4、創建和使用數據庫
-
查看當前有哪些數據庫
mysql>show databases; mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.07 sec)
-
創建數據庫
mysql> CREATE DATABASE menagerie;
-
使用及切換數據庫
mysql> USE menagerie Database changed
3.5、創建表及使用
-
查看當前數據庫有哪些表
mysql>show tables;
-
創建一個表
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20), -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
-
校驗創建表語句是否和執行的一致
mysql>show create table pet; +-------+-------------------------------- | Table | Create Table +-------+-------------------------------- | pet | CREATE TABLE `pet` ( `name` varchar(20) DEFAULT NULL, `owner` varchar(20) DEFAULT NULL, `species` varchar(20) DEFAULT NULL, `sex` char(1) DEFAULT NULL, `birth` date DEFAULT NULL, `death` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------+--------------------------------
-
查看錶詳情
mysql> desc pet; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | owner | varchar(20) | YES | | NULL | | | species | varchar(20) | YES | | NULL | | | sex | char(1) | YES | | NULL | | | birth | date | YES | | NULL | | | death | date | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
-
準備數據
Fluffy Harold cat f 1993-02-04
Claws Gwen cat m 1994-03-17
Buffy Harold dog f 1989-05-13
Fang Benny dog m 1990-08-27
Bowser Diane dog m 1979-08-31 1995-07-29
Chirpy Gwen bird f 1998-09-11
Whistler Gwen bird 1997-12-09
Slim Benny snake m 1996-04-29
3.6、表中導入數據
在表中導入數據的方式有兩種
-
第一種:將以上數據整理成SQL語句,insert into pet....
-
第二種:通過加載文件的方式將數據導入到表中
1、創建一個pet.txt的文件(注:每個字段中用tab鍵隔開,字段沒有值得記錄用\N代替)
Fluffy Harold cat f 1993-02-04 Claws Gwen cat m 1994-03-17 Buffy Harold dog f 1989-05-13 Fang Benny dog m 1990-08-27 Bowser Diane dog m 1979-08-31 Chirpy Gwen bird f 1998-09-11 Whistl Gwen bird \N 1997-12-09 Slim Benny snake m 1996-04-29
2、加載數據
mysql> load data local infile '/root/data/pet.txt' into table pet; Query OK, 8 rows affected, 6 warnings (0.06 sec) Records: 8 Deleted: 0 Skipped: 0 Warnings: 6
3、校驗是否加載進去
mysql> select *from pet; +----------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+--------+---------+------+------------+------------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Fang | Benny | dog | m | 1990-08-27 | NULL | | Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 | | Chirpy | Gwen | bird | f | 1998-09-11 | NULL | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | +----------+--------+---------+------+------------+------------+ 8 rows in set (0.01 sec)
3.7、數據檢索部分
3.7.1、檢索全部數據
mysql> select *from pet;
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+--------+---------+------+------------+------------+
8 rows in set (0.01 sec)
3.7.2、刪除表中全部數據
mysql> DELETE FROM pet;
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;
3.7.3、更新表中特定記錄的數據
-
更新表中名字爲Bowser的生日
mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
3.7.4、查詢特定的行
-
查詢名字爲Bowser的記錄
mysql> SELECT * FROM pet WHERE name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
說明:字符串比較不區分大小寫!如下所示:
mysql> SELECT * FROM pet WHERE name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM pet WHERE name = 'BowsEr';
+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM pet WHERE name = 'BOWSER';
+--------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog | m | 1979-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+
1 row in set (0.00 sec)
3.7.4.1、查找生日在1998年以後的特定查詢
mysql> SELECT * FROM pet WHERE birth >= '1998-1-1';
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
+----------+-------+---------+------+------------+-------+
3.7.4.2、多條件查詢(and | or)
mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';
+-------+--------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+-------+--------+---------+------+------------+-------+
mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+-------+---------+------+------------+-------+
-
優先執行括號中的邏輯
mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm') -> OR (species = 'dog' AND sex = 'f'); +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+
3.7.5、檢索特定的列
mysql> SELECT name, birth FROM pet;
+----------+------------+
| name | birth |
+----------+------------+
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Buffy | 1989-05-13 |
| Fang | 1990-08-27 |
| Bowser | 1989-08-31 |
| Chirpy | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+
-
查詢不重複的字段要使用關鍵詞DISTINCT
mysql> SELECT DISTINCT owner FROM pet; +--------+ | owner | +--------+ | Benny | | Diane | | Gwen | | Harold | +--------+
-
可以使用組合條件查詢特定的列
mysql> SELECT name, species, birth FROM pet -> WHERE species = 'dog' OR species = 'cat'; +--------+---------+------------+ | name | species | birth | +--------+---------+------------+ | Fluffy | cat | 1993-02-04 | | Claws | cat | 1994-03-17 | | Buffy | dog | 1989-05-13 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | +--------+---------+------------+
3.7.6、排序
-
根據某個字段進行排序(關鍵詞:ORDER BY )
mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name | birth |
+----------+------------+
| Buffy | 1989-05-13 |
| Bowser | 1989-08-31 |
| Fang | 1990-08-27 |
| Fluffy | 1993-02-04 |
| Claws | 1994-03-17 |
| Slim | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+
-
升降序排列(desc:降序;asc:升序)
mysql> SELECT name, birth FROM pet ORDER BY birth desc;//降序排列 mysql> SELECT name, birth FROM pet ORDER BY birth asc ;//升序排列
-
多列排序
根據species字段升序排列,根據birth字段降序排列
注: ORDER BY species 中無asc,desc,默認爲升序排列
mysql> SELECT name, species, birth FROM pet -> ORDER BY species, birth DESC; +----------+---------+------------+ | name | species | birth | +----------+---------+------------+ | Chirpy | bird | 1998-09-11 | | Whistler | bird | 1997-12-09 | | Claws | cat | 1994-03-17 | | Fluffy | cat | 1993-02-04 | | Fang | dog | 1990-08-27 | | Bowser | dog | 1989-08-31 | | Buffy | dog | 1989-05-13 | | Puffball | hamster | 1999-03-30 | | Slim | snake | 1996-04-29 | +----------+---------+------------+
3.7.7、日期計算
查看寵物多少歲,就可以使用計算日期的函數TIMESTAMPDIFF()
#查詢當前的日期
mysql> select curdate() from pet;
+------------+
| curdate() |
+------------+
| 2018-08-09 |
+------------+
#獲取當年的年
mysql> select YEAR('2018-02-05') AS YEARS from pet;
+-------+
| YEARS |
+-------+
| 2018 |
+-------+
#獲取當年的月
mysql> select month('2018-02-05') AS YEARS from pet;
+-------+
| YEARS |
+-------+
| 2 |
+-------+
#獲取當年的日
mysql> select day('2018-02-05') AS YEARS from pet;
+-------+
| YEARS |
+-------+
| 5 |
+-------+
mysql> SELECT name, birth, CURDATE(),
-> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
-> FROM pet;
3.7.8、null和not null值
對一些字段類型要進行檢查,判斷某些字段是否爲NULL,或者 non-NULL
mysql> SELECT name, birth, death,
-> TIMESTAMPDIFF(YEAR,birth,death) AS age
-> FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name | birth | death | age |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 | 5 |
+--------+------------+------------+------+
4、實例
以下是如何解決MySQL的一些常見問題的示例。
4.1、首先創建一個表,並且導入數據
CREATE TABLE shop (
article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
dealer CHAR(20) DEFAULT '' NOT NULL,
price DOUBLE(16,2) DEFAULT '0.00' NOT NULL,
PRIMARY KEY(article, dealer));
INSERT INTO shop VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),
(3,'C',1.69),(3,'D',1.25),(4,'D',19.95);
4.2、檢索表中的全部數據
select * from shop;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | A | 3.45 |
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | B | 1.45 |
| 0003 | C | 1.69 |
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
+---------+--------+-------+
4.3、求某一列的最大值或者 最小值
SELECT MAX(article) AS article FROM shop;
+---------+
| article |
+---------+
| 4 |
+---------+
//求某一列的最小值
select min(price) as article from shop;
+---------+
| article |
+---------+
| 1.25 |
+---------+
##4.4、過濾出某個字段值最大的整條記錄數據-涉及到子查詢
SELECT article, dealer, price
FROM shop
WHERE price=(SELECT MAX(price) FROM shop);
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0004 | D | 19.95 |
+---------+--------+-------+
4.4、也可以通過關聯查詢來進行檢索
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.price < s2.price
WHERE s2.article IS NULL;
SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;
4.5、求出每一列的最大值,並且根據某一個字段進行分組--分組topn求法
SELECT article, MAX(price) AS price
FROM shop
GROUP BY article;
+---------+-------+
| article | price |
+---------+-------+
| 0001 | 3.99 |
| 0002 | 10.99 |
| 0003 | 1.69 |
| 0004 | 19.95 |
+---------+-------+
4.5的另一種寫法
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | C | 1.69 |
| 0004 | D | 19.95 |
+---------+--------+-------+
5、SQL中的聚合函數
SQL語言中定義了部分的函數,可以幫助我們完成對查詢結果的計算操作:
1.count 統計個數(行數)
2.sum函數:求和
3.avg函數:求平均值
4.max、min 求最大值和最小值
5.1、count函數
語法:select count(*)|count(列名) from表名
注意: count在根據指定的列統計的時候,如果這一列中有null 不會被統計在其中。
mysql> select * from pet;
+----------+--------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+--------+---------+------+------------+------------+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Fang | Benny | dog | m | 1990-08-27 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Chirpy | Gwen | bird | f | 1998-09-11 | NULL |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| Slim | Benny | snake | m | 1996-04-29 | NULL |
+----------+--------+---------+------+------------+------------+
8 rows in set (0.00 sec)
mysql> select count(sex) from pet;
+------------+
| count(sex) |
+------------+
| 7 |
+------------+
1 row in set (0.00 sec)
mysql> select count(owner) from pet;
+--------------+
| count(owner) |
+--------------+
| 8 |
+--------------+
1 row in set (0.00 sec)
mysql> select count(death) from pet;
+--------------+
| count(death) |
+--------------+
| 1 |
+--------------+
5.2、sum函數
語法:select sum(列名) from 表名;
注意事項:
1、如果使用sum 多列進行求和的時候,如果某一列中有null,這一列所在的行中的其他數據不會被加到總和。
2、可以使用mysql 數據庫提供的函數 ifnull(列名,值)
3、在數據庫中定義double類型數據,是一個近似值,需要確定準確的位數,這時可以把這一列設計成numeric類型。numeric(數據的總列數,小數位數)
numeric double float
mysql> select sum(price) from shop;
+------------+
| sum(price) |
+------------+
| 42.77 |
+------------+
5.3、avg函數
語法:select avg(列名) from 表名;
mysql> select avg(price) from shop;
+------------+
| avg(price) |
+------------+
| 6.110000 |
+------------+
5.4、max函數
語法:select max(列名) from 表名;
mysql> select max(price) from shop;
+------------+
| max(price) |
+------------+
| 19.95 |
+------------+
5.5、min函數
語法:select min(列名) from 表名;
mysql> select min(price) from shop;
+------------+
| min(price) |
+------------+
| 1.25 |
+------------+
6、SQL分類
6.1、DDL (數據定義語言)
數據定義語言 - Data Definition Language
用來定義數據庫的對象,如數據表、視圖、索引等
創建數據庫:create database test;
創建視圖:create view test;
創建索引:create index test;
創建表:create table test1;
6.2、DML (數據操縱語言)
數據處理語言 - Data Manipulation Language
在數據庫表中更新,增加和刪除記錄
如 update, insert, delete
update tableName set age='18' where name='lisi'
insert into tableName value('1','2','3');
drop table tableName //刪除表操作
6.3、DCL (數據控制語言)
數據控制語言 – Data Control Language
指用於設置用戶權限和控制事務語句
如grant,revoke,if…else,while,begintransaction
6.4、DQL (數據查詢語言)
數據查詢語言 – Data Query Language
select
6.5、小結
1、創建數據庫:create database itcast;
2、使用數據庫:use itcast;
3、查看當前數據庫中的所有表:show tables ;
4、查看所有的數據庫:show databases;
5、刪除數據庫:drop database itcast;
6、刪除數據庫中的表:drop table t1;
7、數據庫的備份與恢復
7.1、備份命令
在mysql的安裝目錄的bin目錄下有mysqldump命令,可以完成對數據庫的備份。
語法:mysqldump -u 用戶名 -p 數據庫名> 磁盤SQL文件路徑
由於mysqldump命令不是sql命令,需要在dos窗口下使用。
注意:在備份數據的時候,數據庫不會被刪除。可以手動刪除數據庫。同時在恢復數據的時候,不會
自動的給我們創建數據庫,僅僅只會恢復數據庫中的表和表中的數據。
mysqldump -uroot -p123456 menagerie >/root/data/menagerie.sql
//備份的文件
-rw-r--r--. 1 root root 3118 Oct 20 04:04 menagerie.sql
7.2、恢復命令
恢復數據庫,需要手動的先創建數據庫:
create database heima2;
語法:mysql -u 用戶名-p 導入庫名< 硬盤SQL文件絕對路徑
需求:
1、創建heima8數據庫。
2、重新開啓一個新的dos窗口。
3、將mydb2備份的數據表和表數據 恢復到mydb6中。
//恢復命令
mysql -uroot -p123456 itcast</root/data/menagerie.sql
8、多表查詢
8.1、笛卡爾積介紹
笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡尓積(Cartesian product),又稱直積,表示爲X × Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員
準備數據:
create table A(
A_ID int primary key auto_increment,
A_NAME varchar(20) not null
);
insert into A values(1,'apple');
insert into A values(2,'orange');
insert into A values(3,'banana');
create table B(
A_ID int primary key auto_increment,
B_PRICE double
);
insert into B values(1,2.30);
insert into B values(2,3.50);
insert into B values(4,null);
展示效果:
mysql> select * from A,B;
+------+--------+------+---------+
| A_ID | A_NAME | A_ID | B_PRICE |
+------+--------+------+---------+
| 1 | apple | 1 | 2.3 |
| 2 | orange | 1 | 2.3 |
| 3 | banana | 1 | 2.3 |
| 1 | apple | 2 | 3.5 |
| 2 | orange | 2 | 3.5 |
| 3 | banana | 2 | 3.5 |
| 1 | apple | 4 | NULL |
| 2 | orange | 4 | NULL |
| 3 | banana | 4 | NULL |
+------+--------+------+---------+
作用:笛卡爾積的數據,對程序是沒有意義的,我們需要對笛卡爾積中的數據再次進行過濾。
對於多表查詢操作,需要過濾出滿足條件的數據,需要把多個表進行連接,連接之後需要加上過濾的條件。
mysql> select * from A,B where B.A_ID=1;
+------+--------+------+---------+
| A_ID | A_NAME | A_ID | B_PRICE |
+------+--------+------+---------+
| 1 | apple | 1 | 2.3 |
| 2 | orange | 1 | 2.3 |
| 3 | banana | 1 | 2.3 |
+------+--------+------+---------+
3 rows in set (0.00 sec)
mysql> select * from A,B where B.A_ID=1 and A.A_ID=1;
+------+--------+------+---------+
| A_ID | A_NAME | A_ID | B_PRICE |
+------+--------+------+---------+
| 1 | apple | 1 | 2.3 |
+------+--------+------+---------+
8.2、內連接(表的交集)
內連接: 語法一: select 列名 , 列名 .... from 表名1,表名2 where 表名1.列名 = 表名2.列名;
語法二:
select * from 表名1 inner join 表名2 on 條件
mysql> select * from A inner join B on A.A_ID=B.A_ID;
+------+--------+------+---------+
| A_ID | A_NAME | A_ID | B_PRICE |
+------+--------+------+---------+
| 1 | apple | 1 | 2.3 |
| 2 | orange | 2 | 3.5 |
+------+--------+------+---------+
8.3、左外連接
外鏈接:左外連接、右外連接、全連接、自連接。
左外連接:用左邊表去右邊表中查詢對應記錄,不管是否找到,都將顯示左邊表中全部記錄。
即:雖然右表沒有香蕉對應的價格,也要把他查詢出來。
語法:select * from 表1 left outer join 表2 on 條件;
mysql> select * from A left join B on A.A_ID=B.A_ID;
+------+--------+------+---------+
| A_ID | A_NAME | A_ID | B_PRICE |
+------+--------+------+---------+
| 1 | apple | 1 | 2.3 |
| 2 | orange | 2 | 3.5 |
| 3 | banana | NULL | NULL |
+------+--------+------+---------+
8.4、右外連接
用右邊表去左邊表查詢對應記錄,不管是否找到,右邊表全部記錄都將顯示。
即:不管左方能夠找到右方價格對應的水果,都要把左方的價格顯示出來。
語法:select * from 表1 right outer join 表2 on 條件;
mysql> select * from A right join B on A.A_ID=B.A_ID;
+------+--------+------+---------+
| A_ID | A_NAME | A_ID | B_PRICE |
+------+--------+------+---------+
| 1 | apple | 1 | 2.3 |
| 2 | orange | 2 | 3.5 |
| NULL | NULL | 4 | NULL |
+------+--------+------+---------+
8.5、全外連接
全外連接:左外連接和右外連接的結果合併,但會去掉重複的記錄。 select * from 表1 full outer join 表2 on 條件 select * from a full outer join b on a.A_ID = b.A_ID; 但是mysql數據庫不支持此語法。
8.6、關聯子查詢
關聯子查詢:把一個sql的查詢結果作爲另外一個查詢的參數存在。
8.6.1、in和exist關鍵詞的用法
關聯子查詢其他的關鍵字使用:
回憶:age=23 or age=24 等價於 age in (23,24)
in 表示條件應該是在多個列值中。
in:使用在where後面,經常表示是一個列表中的數據,只要被查詢的數據在這個列表中存在即可。
mysql> select * from A where A_ID in(1,2,3);
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
| 3 | banana |
+------+--------+
3 rows in set (0.00 sec)
mysql> select * from A where A_ID =1 or A_ID =2 or A_ID =3;
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
| 3 | banana |
+------+--------+
//not in
mysql> select * from A where A_ID not in (1,2,3,4);
Empty set (0.00 sec)
mysql> select * from A where A_ID not in (3,4);
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
+------+--------+
2 rows in set (0.00 sec)
exists:
exists:將外查詢表的每一行,代入子查詢作爲檢驗,如果exists子句返回TRUE,就將外查詢的這行記錄放進結果集中。
使用exists完成:
mysql> select * from A where exists(select A_ID from B);
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
| 3 | banana |
+------+--------+
mysql> select * from A where not exists(select A_ID from B);
Empty set (0.00 sec)
in not in 與 exists not exists 的區別參考:https://www.jianshu.com/p/9c863ad1032f
8.6.2、union 和union all使用法
UNION 語句:用於將不同表中查詢的數據合併展示出來;(不包括重複數據)
UNION ALL 語句:用於將不同表中查詢的數據合併展示出來;(包括重複數據)
mysql> select * from A union select * from B;
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
| 3 | banana |
| 1 | 2.3 |
| 2 | 3.5 |
| 4 | NULL |
+------+--------+
6 rows in set (0.00 sec)
mysql> select * from A union all select * from B;
+------+--------+
| A_ID | A_NAME |
+------+--------+
| 1 | apple |
| 2 | orange |
| 3 | banana |
| 1 | 2.3 |
| 2 | 3.5 |
| 4 | NULL |
+------+--------+
8.6.3、case when 語句
case when 語句語法結構:
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
準備數據
//創建表
create table employee(
empid int ,
deptid int ,
sex varchar(20) ,
salary double
);
//加載數據
1 10 female 5500.0
2 10 male 4500.0
3 20 female 1900.0
4 20 male 4800.0
5 40 female 6500.0
6 40 female 14500.0
7 40 male 44500.0
8 50 male 6500.0
9 50 male 7500.0
load data local infile '/root/data/emp.txt' into table employee ;
select *,
case
when salary < 5000 then "低等收入"
when salary>= 5000 and salary < 10000 then "中等收入"
when salary > 10000 then "高等收入"
end as level,
case sex
when "female" then 1
when "male" then 0
end as flag
from employee;