目錄
MySQL
1、數據庫的概念
2、數據庫分類
3、MySQL的安裝
4、安裝過程中的問題
DataGrip的使用:
SQLynx的使用:
5、編寫SQL語句
6、DDL語句
7、DML
新增數據:
刪除數據:
修改數據:
MySQL
SQL其實是一門開發語言。
大數據為啥要學習SQL語句?大數據起步比較晚。
起步晚,要流行:1)方便使用 2)簡單易學 學習成本小
我們所有的大數據組件,每個組件都有自己的用法。想使用大數據,要求會SQL即可。能夠吸引大批老的程序員使用新技術。
數據庫:SQL語句
Hadoop(Hive): 類似的SQL語句
Spark : Spark SQL
Flink : Flink SQL
數倉學科: Python語言(打個基礎)
1、數據庫的概念
DB: 數據庫的意思,其實本質上就是文本文件而已。我們一般無法察覺,也查看不了,原因是安全性。
數據庫管理系統(DataBase Management System,DBMS):文件文件就是數據庫的本質,數據庫管理系統其實就是用來管理數據文本內容的工具(軟件)而已。
數據庫管理系統就i是一套軟件而已,別人開發出來供我們使用的。
Java : API (開發幫助文檔)
2、數據庫分類
兩大派(華山派 -- 劍宗和 氣宗 ):關系型數據 和 非關系型數據庫
關系型數據庫:主流
MySQL:免費的,以前是SUN公司,后來Oracle 一個表500萬數據的時候開始考慮性能問題
Oracle: Oracle 收費的,軟件賊大,安全型賊好。 一般政府部門,銀行系統。互聯網公司都在去O。
MS Server: 微軟的
DB2 : IBM的
Access : 微軟出來的。小垃圾 其實就是一個excel表格。
非關系型數據庫:
互聯網發達起來
- HBase是一個分布式的、面向列的開源數據庫 上億行,百萬列
- MongoDB是一個基于分布式文件存儲的數據庫 H5
- Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API 每個公司都在用。是基于內存的數據庫。
非關系型書庫的出現不是為了革命,而是輔助。
什么是關系型數據庫呢?
通過行和列存儲數據,這樣設計出來的數據庫都是關系型數據庫。
3、MySQL的安裝
SQL和數據庫的關系?
SQL是一種語言,標準語言。
mysql、oracle 都可以編寫和執行sql。
官方了兩種安裝包:
Oracle: 1G
MS Server: 特別大
數據庫的密碼: 統一 123456
mysql8.0 它底層進行了優化,同樣的sql語句,在mysql8.0 比 mysql5.x 運行速度快。
4、安裝過程中的問題
版本要注意:mysql 5.5 和 5.7 特別多
我們現在用的是mysql 8.0版本,他們之間存在一定的兼容問題。
假如你有一個新的電腦:安裝軟件的時候,比如jdk、mysql、idea等跟工作相關的軟件安裝C盤。
這些軟件是數據庫的Server端。 服務器端是不要錢。
安裝玩之后,可以使用黑窗口操作。
進入bin之后,輸入cmd
登錄進去后,就可以編寫sql了。
展示所有數據庫
show databases;
黑窗口編寫SQL語句太費勁了,如果有可視化的軟件就好了:
軟件購買
遠程連接:
可以連接本地和遠程,比如同桌的數據庫
點擊"測試連接" 看是否連接成功!
原因是Navicat 12版本,連接高版本的數據庫,使用的密碼校驗機制跟 mysql8.0 的機制有不一樣的地方。
人工修復一下這個Bug:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER;//更新一下用戶的密碼
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';//刷新權限
FLUSH PRIVILEGES;alter user 'root'@'localhost' identified by 'root';
如何使用Navicat編寫命令:
F6 或者 Fn + F6
遠程連接工具都有哪些?
Navicat 、 SQLYog 、DataGrip
粘貼激活碼即可。
DataGrip的使用:
先創建項目:起個英文名
添加數據源mysql:
選擇mysql:
SQLynx的使用:
無需安裝,解壓即用。
該客戶端的優點:1)支持國產的一些數據庫 2)運行速度比較快(導入導出)
5、編寫SQL語句
1) SQL語句的分類
SQL: Structure Query Language(結構化查詢語言),SQL最早是被美國國家標準局(ANSI)確定為關系型數據庫語言的美國標準。后來被國際化標準組織(ISO)采納為關系型數據庫語言的國際標準。
國家的統一的語言:普通話 各個地方都有方言。每一個數據庫都有方言。方言就是獨自。
- DDL(Data Definition Language):數據定義語言,用來定義數據庫對象(數據庫、表、列)
創建一個數據庫、創建表、添加字段等
- DML(Data Manipulation Language):數據操作語言,用于定義數據庫記錄(數據)
數據的新增、修改、刪除
- DQL(Data Query Language):數據查詢語言,用于查詢記錄(數據)
專門針對數據的查詢的
- TCL(Transaction Control Language):事務控制語言,DCL(Data Control Language):數據控制語言,用于定義訪問權限和安全級別
控制事務、添加用戶、賦予權限、修改密碼等。
6、DDL語句
數據庫的操作:
展示所有的數據庫
show databases;
# 創建數據庫
CREATE DATABASE mydb01;
# 創建數據庫,并采用指定的字符集
CREATE DATABASE mydb02 CHARACTER SET UTF8;
utf8字符集是可以支持中文的,非常的方便。查看數據庫(了解)
# 查看創建數據庫mydb1定義的信息
SHOW CREATE DATABASE mydb01;
mysql> show create database mydb01;1 row in set (0.07 sec)mysql> alter database mydb01 character set gbk;
Query OK, 1 row affected (0.09 sec)mysql> show create database mydb01;# 將數據庫mydb1的字符集修改為GBK
ALTER DATABASE mydb1 CHARACTER SET GBK;DROP DATABASE mydb1; (不重要)# 切換當前使用的數據庫
USE mydb1;
# 查詢當前使用的數據庫
SELECT DATABASE();查看mysql的版本:
select verion();
關于表的操作:
展示該數據庫中的所有表:
show tables;創建一個表:
語法:
create table 表名( 字段一 數據類型(數據長度),.....);
實戰:
create table stu (name varchar(255),phone varchar(11),age int(3));查看表結構:
desc stu;# 查看創建一個表的信息
SHOW CREATE TABLE t_users; #不常見在sql語句中 # 后面的語句不執行,代表注釋
修改表的名字
alter table stu rename to student;
以下內容可以練習一遍即可:
# 給一張表添加一個字段
ALTER TABLE t_users ADD score DOUBLE(5,2);
# 修改一張表的字段類型
ALTER TABLE t_users MODIFY score INT;
# 修改一張表的字段名
ALTER TABLE t_users CHANGE name uname VARCHAR(50);
# 修改一張表的字符集
ALTER TABLE t_users CHARACTER SET GBK;修改表添加一個身高字段:
int 整數 1 2 3 4... 不能寫1.11
double 小數 (5,2) 帶小數為總共有5個長度,2 表示小數點后能存2位,所以整數為長度是3.double(5,2) 最大能表示到 999.99alter table student add height double(5,2);
# 刪除一張表中的字段
ALTER TABLE t_users DROP score;表的刪除:
drop table student ;-- 創建一個跟這個表一模一樣的表結構
create table stu2 like stu;
-- 創建一個表,表結構跟另一個表一模一樣,并且數據也跟它一模一樣,類似于copy 某個表
create table stu3 as select * from stu;
-- ------------展示table的DDL語句------------------
-- 查看所有的表
show tables;
-- 創建一個表
create table stu01(id int(20),name varchar(20),age int(3)
);
-- 查看表結構
desc stu01;
describe stu01;
-- 修改表結構,不是修改表中的數據
-- 重命名
alter table stu01 rename to student;desc student;
-- 添加列
alter table student add score double(5,2);
-- 修改一個列的數據類型
alter table student modify score int(3);
-- 修改字段的名字
alter table student change name sname varchar(30);
-- 修改一張表的字符集
alter table student character set utf8;
show create table student;
-- 刪除一個字段
alter table student drop score;
-- 新建一個表,該表的表字段跟student 一模一樣
create table stu like student;
desc stu;
-- 創建一個表,表結構和數據都跟你一模一樣
create table stu2 as select * from student;
-- 刪除表
drop table student;
DDL語句:數據庫的新增修改刪除查看。表的新增修改刪除查看表字段的新增修改刪除查看(已經涵蓋在了表的修改操作中了)
假如 編寫sql語句 回車代表換行,不代表執行,一個sql語句見 ; 表示寫完了。
建表語句中,經常出現字段的類型:
比如 age 年齡 數據類型 數字表示 int
常見的數據類型:
數據類型 | 類型描述 | 示例 |
int | 整型,整數類型 | |
double | 浮點型 | double(5,2): 表示最多有5位,其中必須有兩位數小數,即最大值是999.99 |
char | 固定長度的字符串 | char(5): 固定5位字符,即'aa'也占用5位字符 |
varchar | 可變長度的字符串 | varchar(5): 可以根據內容動態分配空間,'aa'只占用兩位。括號里的5表示最大的位數。 |
text | 字符串類型 | |
blob | 字節類型 | 很少用的,一般存在 比如 音樂,圖片 |
date | 日期類型 | yyyy-MM-dd |
time | 時間類型 | hh:mm:ss |
timestamp | 時間戳類型 | yyyy-MM-dd hh:mm:ss,會自動賦值 |
datetime | 時間類型 | yyyy-MM-dd hh:mm:ss |
作業:字段類型 5遍
其實特別簡單: 記住 int varchar 就可以了。
DDL語句都可以使用圖形化界面解決(練習練習即可!)
圖形化界面操作(必須掌握):
7、DML
DML指的是對數據庫中的數據進行增、刪、改的操作。不要和DDL搞混了。
新增數據:
語法-- 必須遵循的法則
INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);注意:列名與列值的類型、個數、順序要一一對應。
mysql> use mydb03;
Database changed
mysql> show tables;
+------------------+
| Tables_in_mydb03 |
+------------------+
| stu |
+------------------+
1 row in set (0.08 sec)mysql> desc stu;
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| name | varchar(255) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| height | double(5,2) | YES | | NULL | |
+--------+--------------+------+-----+---------+-------+
3 rows in set (0.12 sec)mysql> insert into stu(name,age,height) values('zhangsan',22,190.9);
Query OK, 1 row affected (0.07 sec)mysql> insert into stu(name,age,height) values('lisi',23,180);
Query OK, 1 row affected (0.11 sec)mysql> select * from stu; # 該語句是查詢語句,表示查詢stu中所有的數據
+----------+-----+--------+
| name | age | height |
+----------+-----+--------+
| zhangsan | 22 | 190.90 |
| lisi | 23 | 180.00 |
+----------+-----+--------+
2 rows in set (0.08 sec)# insert into 表名 如果表名后面不添加任何的字段名,就是向所有字段插入值。
mysql> insert into stu values('wangwu',24,175);
Query OK, 1 row affected (0.06 sec)mysql> select * from stu;
+----------+-----+--------+
| name | age | height |
+----------+-----+--------+
| zhangsan | 22 | 190.90 |
| lisi | 23 | 180.00 |
| wangwu | 24 | 175.00 |
+----------+-----+--------+
3 rows in set (0.09 sec)
# insert into 表名 如果表名后面添加字段名,說明想向這個字段設置值,其他字段不管了。
mysql> insert into stu(name) values('zhaoliu');
Query OK, 1 row affected (0.09 sec)mysql> select * from stu;
+----------+------+--------+
| name | age | height |
+----------+------+--------+
| zhangsan | 22 | 190.90 |
| lisi | 23 | 180.00 |
| wangwu | 24 | 175.00 |
| zhaoliu | NULL | NULL |
+----------+------+--------+null 就是空的意思,沒有任何值,不是 0 也不是 '' desc stu;
insert into stu(id,sname,age) values(1,'zhangsan',20);
select * from stu;
insert into stu values(2,'lisi',20);
insert into stu(id,sname) values(3,'王五');
insert into stu(id,sname) values (4,'sisi'),(5,'五仁'),(6,'六子');
課下練習:
create table emp(id int,name varchar(100),gender varchar(10),birthday date,salary double(10,2),entry_date date,resume text
);INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5','good girl');INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(2,'lisi','male','1995-5-10',10000,'2015-5-5','good boy');INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(3,'你好','male','1995-5-10',10000,'2015-5-5','good boy');
創建一個新的表,跟stu表不一樣
需求是:從stu中,查詢數據導入到emp表中。
insert into emp(sname,sage,sheight) select * from stu;mysql> insert into emp(sname,sage,sheight) select * from stu;
Query OK, 4 rows affected (0.11 sec)
Records: 4 Duplicates: 0 Warnings: 0mysql> select * from emp;
+----------+------+---------+--------+
| sname | sage | sheight | gender |
+----------+------+---------+--------+
| zhangsan | 22 | 191 | NULL |
| lisi | 23 | 180 | NULL |
| wangwu | 24 | 175 | NULL |
| zhaoliu | NULL | NULL | NULL |
+----------+------+---------+--------+
4 rows in set (0.07 sec)
stu | emp |
name varchar | sname varchar |
age int | sage int |
height double | sheight double |
select 語句查詢出來的數量以及字段類型和順序都必須 和 insert into 中表的字段數量、類型、順序一樣,跟表名字、表字段的名字沒有半毛錢關系。
對比:
這個語句執行的時候必須有表
insert into 表名 select * from 表2這個語句執行的時候可以沒有表,sql語句幫創建表
create table 表名 as select * from 表2
刪除數據:
# 刪除數據
DELETE FROM 表名;
# 刪除掉表中所有的數據
TRUNCATE TABLE 表名;delete from stu where name='zhaoliu';
# where 后面可以添加條件,滿足條件的刪除掉
DELETE 和 TRUNCATE1. delete刪除表中的數據,表結構還在;刪除的數據可以恢復。
2. truncate是直接將表DROP掉,然后再按照原來的結構重新創建一張表。數據不可恢復。
3. truncate刪除效率比delete高。
where條件:
如何造數據:
字段 | 解釋 | |
name | 姓名 | |
groupid | 小組 | |
score | 成績 |
# 刪除姓名叫"張三"的數據
delete from student where name='張三';# 刪除成績不是100的數據
delete from student where score != 100;
delete from student where score <> 100;# 刪除不及格的數據
delete from student where score < 60;
# 刪除成績在[60, 80]范圍的數據
delete from student where score >= 60 and score <= 80;delete from student where score between 60 and 80;
# 刪除小組是1,3,5的數據
delete from student where groupid = 1 or groupid = 3 or groupid =5;
delete from student where groupid in (1,3,5);
# 刪除成績是空的數據
delete from student where score is null;
# 刪除成績不及格的第三組的數據
delete from student where score < 60 and groupid = 3;# 刪除姓張的數據
delete from student where name like '張%';% 表示任意0個或者多個字符
# 刪除名字中含有 偉 字的同學
delete from student where name like '%偉%';
修改數據:
需求:只要這個同學姓張,就加10分
考慮語法:
UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 WHERE 列名=值根據語法編寫sql語句:
score = 10 是將 score 的數據重置為 10
update student set score = 10 where name like '張%';
修改為:
update student set score = score + 10 where name like '張%';
# 將所有員工薪水修改為5000元。
UPDATE emp SET salary=5000 # 將姓名為’zhangsan’的員工薪水修改為3000元。
UPDATE emp SET salary=3000 WHERE name=’ zhangsan’;# 將姓名為’lisi’的員工薪水修改為4000元,job改為ccc。
UPDATE emp SET salary=4000,job='ccc' WHERE name='lisi';# 將wu的薪水在原有基礎上增加1000元。
UPDATE emp SET salary=salary+1000 WHERE name='wu';ifnull(字段名,默認值)
update stu set age = ifnull(age,0) + 1;