Java养成计划----学习打卡第六十四天
Java(打卡第六十四天)
MySQL数据库
博文不是每天都在发送,但是学习是每天都在进行的,因为不想为写而学,而是为学而写
昨天已经进行了MySQL的基本的安装,还有操作mySQL的命令比如SHOW ,CREATAE ,DESCRIBE,同时了解了分类,Data query language;数据 查询;SELECT data manipulation language INSERT , DELETE , UPDATE ; data definition language ; CREATE DROP ALTER SHOW ; transaction control language COMMIT ROLLBACK ; data control language GRANT , REVOKE
我们经常需要将sql文件给导入,那么这个时候就使用命令SOURCE + 路径,注意路径中不能有中文,这里我为了演示,先将数据库world使用命令
DROP DATABASE world;
删除之后,导入数据库
mysql> SOURCE D:\MySQL\Samples and Examples 8.0\Sample Databases\World\world-schema.sql
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
Query OK, 1 row affected (0.00 sec)
出现上述语句就是导入成功了,这里可以看一下
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| cfengbase |
| company |
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
8 rows in set (0.01 sec)
导入成功
就像查看数据库使用SHOW DATABASES; 当使用USE base_name之后就可以使用
SHOW TABLES;
查看数据库中有那些表
mysql> SHOW TABLES;
+-----------------+
| Tables_in_world |
+-----------------+
| city |
| country |
| countrylanguage |
+-----------------+
3 rows in set (0.01 sec)
这里有3张表,第一张表为city表,第二张表为country表,第三张表是countylanguage表
增删查改中的查,是对数据进行的操作,那就是DQL,data query language,使用
SELECT * FROM table_name; //统一执行该语句
这里我们查看一下city表格的内容
mysql> SELECT * FROM city;
+------+-----------------------------------+-------------+------------------------+------------+
| ID | Name | CountryCode | District | Population |
+------+-----------------------------------+-------------+------------------------+------------+
| 1 | Kabul | AFG | Kabol | 1780000 |
| 2 | Qandahar | AFG | Qandahar | 237500 |
| 3 | Herat | AFG | Herat | 186800 |
| 4 | Mazar-e-Sharif | AFG | Balkh | 127800 |
| 5 | Amsterdam | NLD | Noord-Holland | 731200 |
| 6 | Rotterdam | NLD | Zuid-Holland | 593321 |
| 7 | Haag | NLD | Zuid-Holland | 440900 |
| 8 | Utrecht | NLD | Utrecht | 234323 |
| 9 | Eindhoven | NLD | Noord-Brabant | 201843 |
| 10 | Tilburg | NLD | Noord-Brabant | 193238 |
| 11 | Groningen | NLD | Groningen | 172701 |
| 12 | Breda | NLD | Noord-Brabant | 160398 |
| 13 | Apeldoorn | NLD | Gelderland | 153491 |
| 14 | Nijmegen | NLD | Gelderland | 152463 |
| 15 | Enschede | NLD | Overijssel | 149544 |
| 16 | Haarlem | NLD | Noord-Holland | 148772 |
| 17 | Almere | NLD | Flevoland | 142465 |
| 18 | Arnhem | NLD | Gelderland | 138020 |
| 19 | Zaanstad | NLD | Noord-Holland | 135621 |
| 20 | ?s-Hertogenbosch | NLD | Noord-Brabant | 129170 |
| 21 | Amersfoort | NLD | Utrecht | 126270 |
………………………………………………………………………………………………………………………………………………………………
| 4064 | Odessa | USA | Texas | 89293 |
| 4065 | Carson | USA | California | 89089 |
| 4066 | Charleston | USA | South Carolina | 89063 |
| 4067 | Charlotte Amalie | VIR | St Thomas | 13000 |
| 4068 | Harare | ZWE | Harare | 1410000 |
| 4069 | Bulawayo | ZWE | Bulawayo | 621742 |
| 4070 | Chitungwiza | ZWE | Harare | 274912 |
| 4071 | Mount Darwin | ZWE | Harare | 164362 |
| 4072 | Mutare | ZWE | Manicaland | 131367 |
| 4073 | Gweru | ZWE | Midlands | 128037 |
| 4074 | Gaza | PSE | Gaza | 353632 |
| 4075 | Khan Yunis | PSE | Khan Yunis | 123175 |
| 4076 | Hebron | PSE | Hebron | 119401 |
| 4077 | Jabaliya | PSE | North Gaza | 113901 |
| 4078 | Nablus | PSE | Nablus | 100231 |
| 4079 | Rafah | PSE | Rafah | 92020 |
+------+-----------------------------------+-------------+------------------------+------------+
4079 rows in set (0.02 sec)
这张表记录的是世界主要的城市,第一列是城市的名称,第二个字段是城市所处的国家,第三个字段是城市所处的州【省】
mysql> DESCRIBE country;
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
| Code | char(3) | NO | PRI | | |
| Name | char(52) | NO | | | |
| Continent | enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') | NO | | Asia | |
| Region | char(26) | NO | | | |
| SurfaceArea | float(10,2) | NO | | 0.00 | |
| IndepYear | smallint | YES | | NULL | |
| Population | int | NO | | 0 | |
| LifeExpectancy | float(3,1) | YES | | NULL | |
| GNP | float(10,2) | YES | | NULL | |
| GNPOld | float(10,2) | YES | | NULL | |
| LocalName | char(45) | NO | | | |
| GovernmentForm | char(45) | NO | | | |
| HeadOfState | char(60) | YES | | NULL | |
| Capital | int | YES | | NULL | |
| Code2 | char(2) | NO | | | |
+----------------+---------------------------------------------------------------------------------------+------+-----+---------+-------+
15 rows in set (0.01 sec)
mysql> DESCRIBE city;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| ID | int | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| CountryCode | char(3) | NO | MUL | | |
| District | char(20) | NO | | | |
| Population | int | NO | | 0 | |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> DESCRIBE countrylanguage;
+-------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| CountryCode | char(3) | NO | PRI | | |
| Language | char(30) | NO | PRI | | |
| IsOfficial | enum('T','F') | NO | | F | |
| Percentage | float(4,1) | NO | | 0.0 | |
+-------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
另外两张表就不看了,太多数据了,cmd窗口差点爆掉,宏观上看一下,三者是由关系的
上面已经使用过很多次了,就是
DESC table_name;
DESCRIBE table_name;
上面都是使用的全名,这里演示一下简化
mysql> DESC city;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| ID | int | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| CountryCode | char(3) | NO | MUL | | |
| District | char(20) | NO | | | |
| Population | int | NO | | 0 | |
+-------------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
查看表的详细结构
SHOW CREATE TABLE table_name\G;
注意和上面简化的区别
mysql> SHOW CREATE TABLE city\G;
*************************** 1. row ***************************
Table: city
Create Table: CREATE TABLE `city` (
`ID` int NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`),
CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
可以看到其实这样子没有上面的直观,但是给出了原始的SQL语句
之前使用java的命令时就知道 javac -version可以查看jdk的版本号,mysql也提供了查询命令,那就是select命令
SELECT VERSION();
注意这里带了一个小括号
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.27 |
+-----------+
1 row in set (0.00 sec)
非常直观的看到版本时8.0.27
当操作数据库时,因为数据过多,或许就会忘记当前使用的数据库,这里还是使用的SELECT 查询
SHOW DATABASE();
演示一下,我上面操作很多次,已经找不到USE语句了,所以时需要查询的
mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| world |
+------------+
1 row in set (0.00 sec)
使用的时world数据库,里面是有三张表的
所以我们创建表的时候,就不使用分号,换行书写来达到结构的清晰
这里很简单,昨天已经提到过了,就是EXIT;
mysql> EXIT;
Bye
这里给大家来一次连续的操作
C:\Users\OMEY-PC>mysql -h localhost -u cfeng -p
Enter password: ************
mysql> SHOW DATABASES;
mysql> USE cfengbase;
mysql> SHOW TABLES;
mysql> DESCRIBE fruits;
mysql> SHOW CREATE TABLE fruits\G;
mysql> SELECT * FROM fruits;
+------+-------------+--------------+---------------+---------------+
| id | fruits_name | fruits_price | fruits_origin | fruits_remark |
+------+-------------+--------------+---------------+---------------+
| 1001 | 葡萄 | 3.7 | 山东 | 红香妃 |
| 1002 | 苹果 | 2.8 | 山东 | 红富士 |
| 1003 | 香蕉 | 6 | 海南 | 小芭蕉 |
+------+-------------+--------------+---------------+---------------+
3 rows in set (0.01 sec)
其实上面已经使用到了查询语句了,比如查询一个表中的所有数据就是使用的DQL
SELECT col_name FROM table_name;
这和上面查询库中的所有数据是相似的,其实想一想就知道了,因为*代表的就是很多,就是所有的字段,和java中的关连属性的数目的表示相同
其中SELECT FROM 都是关键字,不区分大小写,而小写的col_name和table_name是标识符,大写容易识别,但是不要写错单词,演示一下查询字段,这里就以fruits表,查询fruits_name字段
mysql> SELECT fruits_name FROM fruits;
+-------------+
| fruits_name |
+-------------+
| 葡萄 |
| 苹果 |
| 香蕉 |
+-------------+
3 rows in set (0.00 sec)
这样查询,就可以检查查询的量了,一次性显示所有内容,可能屏幕都显示不完全
既然查询一个字段我们已经知道了,并且查询所有字段,也就是整个表的内容也知道
查询多个字段就不难推出了
SELECT col_name1,col_name2…… FROM table_name;
这里我们可以先简单查看表的结构,再查询表的字段,这里就同时查询fruits的name和origin两个字段
mysql> DESC fruits;
+---------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| fruits_name | varchar(45) | NO | | NULL | |
| fruits_price | double | NO | | NULL | |
| fruits_origin | varchar(45) | NO | | NULL | |
| fruits_remark | varchar(45) | NO | | NULL | |
+---------------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> SELECT fruits_name,fruits_origin FROM fruits;
+-------------+---------------+
| fruits_name | fruits_origin |
+-------------+---------------+
| 葡萄 | 山东 |
| 苹果 | 山东 |
| 香蕉 | 海南 |
+-------------+---------------+
3 rows in set (0.00 sec)
最容易犯的错误还是把单词拼写错误,还可以使用SHOW ERRORS, SHOW WARNINGS;查看具体的错误原因和所在的位置
这里可以稍微总结一下
在查询的时候,字段的名字是可以不是原本的名字,比如水果的发源地源表是fruits_origin,这个很长,不方便,起个别名发源地
查询的时候起别名的方式是AS,注意原来的字段名并没有修改
SELECT col_name1,col_name2 AS newname FROM table_name;
这里需要注意,查询时逗号后面都是字段名,所以as的前面时字段名,后面才是字段的别名
这里演示一下给水果发源地查询的时候起别名
mysql> SELECT fruits_name,发源地 AS fruits_origin FROM fruits;
ERROR 1054 (42S22): Unknown column '发源地' in 'field list' //报错,顺序错误
mysql> SELECT fruits_name,fruits_origin AS 发源地 FROM fruits;
+-------------+--------+
| fruits_name | 发源地 |
+-------------+--------+
| 葡萄 | 山东 |
| 苹果 | 山东 |
| 香蕉 | 海南 |
+-------------+--------+
3 rows in set (0.00 sec)
SELECT操作是DQL语句,不是DML,所以不会改变原来的数据的
这里的AS是可以省略的,但是不能加逗号,上面提到逗号后面都是字段名,所以系统就会寻找是否有字段,就会报错
mysql> SELECT fruits_name 水果名称 FROM fruits;
+----------+
| 水果名称 |
+----------+
| 葡萄 |
| 苹果 |
| 香蕉 |
+----------+
3 rows in set (0.00 sec)
如果别名里面有空格,如果按照AS或者省略的方式都会报错的,系统认为字段后面是别名,别名后面没有逗号就会寻找FROM,可是找到的是别名的另外一半,就报错了
解决的办法是使用引号括起来,单引号,双引号都是可以的
SELECT col_name '水果 名称' FROM table_name;
SELECT col_name "水果 名称" FROM table_name;
这里还是演示一下使用
mysql> SELECT fruits_name "水果 名称" FROM fruits;
+------------+
| 水果 名称 |
+------------+
| 葡萄 |
| 苹果 |
| 香蕉 |
+------------+
3 rows in set (0.00 sec)
mysql> SELECT fruits_name '水果 名称' FROM fruits;
+------------+
| 水果 名称 |
+------------+
| 葡萄 |
| 苹果 |
| 香蕉 |
+------------+
3 rows in set (0.00 sec)
注意:所有的数据库中字符串是采用单引号括起来的,双引号有的数据库用不了
字段比如水果的价格,如果都涨价那么就直接做加法,只是加法后如果不起别名,那么字段名也就会运算
SELECT price+3 FROM fruits;
SELECT price+3 水果价格 FROM fruits;
注意这都是查询时所做的操作,原来的数据并没有改变
这里可以示范一下
mysql> SELECT fruits_name 水果名称,fruits_price FROM fruits;
+----------+--------------+
| 水果名称 | fruits_price |
+----------+--------------+
| 葡萄 | 3.7 |
| 苹果 | 2.8 |
| 香蕉 | 6 |
+----------+--------------+
3 rows in set (0.00 sec)
mysql> SELECT fruits_name 水果名称,fruits_price+3 FROM fruits;
+----------+----------------+
| 水果名称 | fruits_price+3 |
+----------+----------------+
| 葡萄 | 6.7 |
| 苹果 | 5.8 |
| 香蕉 | 9 |
+----------+----------------+
3 rows in set (0.00 sec)
mysql> SELECT fruits_name 水果名称,fruits_price+3 水果新价格 FROM fruits;
+----------+------------+
| 水果名称 | 水果新价格 |
+----------+------------+
| 葡萄 | 6.7 |
| 苹果 | 5.8 |
| 香蕉 | 9 |
+----------+------------+
3 rows in set (0.00 sec)
这里起别名如果是中文最好使用单引号括起来,因为中文也是字符串,所以就使用单引号
查询时可以使用as ,数学运算来得到想要的查询结果,起别名碰到中文和空格加上单引号,查询时不会改变原数据库的内容,使用SELECT
今天就先了解简单查询,明天会详细介绍条件查询和模糊查询~