MySQL是最流行的關係型數據庫管理系統之一,由瑞典MySQL AB公司開發,目前屬於Oracle公司。MySQL是一種關聯數據管理系統,關聯數據庫將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫內,這樣就增長了速度並提升了靈活性。
- 關係型數據庫:採用關係模型來組織數據的數據庫
- 關係:一張二維表,每一個關係都有一個關係名,就是表名
- 模型:行和列(二維),具體指字段跟字段信息
關係型數據庫經過外鍵關聯來創建表與表之間的關係,
前端
非關係型數據庫一般指數據以對象的形式存儲在數據庫中,而對象之間的關係經過每一個對象自身的屬性來決定
java
好比 有一個學生的數據:
姓名:張三,性別:男,學號:12345,班級:二年級一班
還有一個班級的數據:
班級:二年級一班,班主任:李四
# 關係型數據庫中,咱們建立學生表和班級表來存這兩條數據,而且學生表中的班級存儲的是班級表中的主鍵。
# 非關係型數據庫中,咱們建立兩個對象,一個是學生對象,一個是班級對象,
數據庫類型 | 特性 | 優勢 | 缺點 |
---|---|---|---|
關係型數據庫SQLite、Oracle、mysql | 一、關係型數據庫,是指採用了關係模型來組織數據的數據庫;二、關係型數據庫的最大特色就是事務的一致性;三、簡單來講,關係模型指的就是二維表格模型,而一個關係型數據庫就是由二維表及其之間的聯繫所組成的一個數據組織。 | 一、容易理解:二維表結構是很是貼近邏輯世界一個概念,關係模型相對網狀、層次等其餘模型來講更容易理解;二、使用方便:通用的SQL語言使得操做關係型數據庫很是方便;三、易於維護:豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數據冗餘和數據不一致的機率;四、支持SQL,可用於複雜的查詢。 | 一、爲了維護一致性所付出的巨大代價就是其讀寫性能比較差;二、固定的表結構;三、高併發讀寫需求;四、海量數據的高效率讀寫; |
非關係型數據庫MongoDb、redis、HBase | 一、使用鍵值對存儲數據;二、分佈式;三、通常不支持ACID特性;四、非關係型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合。 | 一、無需通過sql層的解析,讀寫性能很高;二、基於鍵值對,數據沒有耦合性,容易擴展;三、存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,而關係型數據庫則只支持基礎類型。 | 一、不提供sql支持,學習和使用成本較高;二、無事務處理,附加功能bi和報表等支持也很差; |
注1:數據庫事務必須具有ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔離性,Durability持久性。
python
注2:數據的持久存儲,尤爲是海量數據的持久存儲,仍是須要一種關係數據庫。
mysql
不區分大小寫,可是系統默認大寫爲系統代碼,小寫爲程序員代碼
程序員
mysql -uroot -ppassword # 登陸數據庫
exit # 退出
\q # 退出
# 建立用戶三個步驟
create user 'lucky'@'%' identified by 'password'; # 建立用戶名(%表示遠程鏈接,可用此用戶名登錄)
grant all on *.* to 'lucky'@'%'; # 賦予全部權限
flush privileges; # 使權限生效
# 此時以root用戶登錄,登陸lucky用戶:
\q # 退出root
mysql -ulucky -ppassword; # 登陸lucky用戶
select user(); # 查看當前用戶
select database(); # 查看當前位於哪一個數據倉庫
show databases; # 查看當前有哪些數據庫
create database mydb; # 建立數據庫(數據庫已存在會報錯,若是沒有,則建立)
create database if not exists mydb;# 數據庫已存在不會報錯,若是沒有會建立
# 對於系統內部的,默認的數據倉庫,不須要也不能去修改
drop database mydb; # 刪除數據庫
show databases;
create database if not exists mydb;
use mydb; # 進入數據庫
select database();
create table student( # student爲建立表的name
id int, # id 爲字段編號,int爲其數據類型
name varchar(20), # name爲字段名,varchar爲類型,20爲長度
); # 建表,分號結尾
show tables; # 查看當前數據倉庫內有哪些表格
desc student; # 查看student數據表的結構
show create table student; # 查看建立表時有哪些命令
(drop table student; # 刪除表格)
# 增
# 方法一
insert into student (id,name) value (1,'張三'); # 向數據表內增長內容into 能夠省略
insert into student value(2,'李四'); # ()中的字段名可寫可不寫,默認按順序添加
insert into student value(3) # 也可只插入id
insert into student values(3,'王五'),(4,'趙六')
select * from student; # 查詢當前數據表
# 方法二
insert student set id=5,name='錢七';
-------------------------------------------------------------
# 查
select * from student; # 查看student
select * from student where id<=4; # 查看student 而且id小於4的內容
select name from student where id<=4; # 查看student 內的name 段,而且id小於4的內容
-------------------------------------------------------------
# 改
update student set name='name1' where id=5;# 將id=5的那一行的name 改成'name1'
# 若是不加where 限制條件,則表中的name全被更改
------------------------------------------------------------
# 刪
delete from student where name='錢七'; # 刪除全部name=錢七的數據
數據類型 | 表明內容 | 事例 |
---|---|---|
int | 整型 | id int |
varchar(20) | 指定長度,最多65535個字符。變長(超出會自動截掉) | name varchar(20)(插入20個字符) |
char(4) | 指定長度,最多255個字符。定長 | sex char(4)(無論插入幾個字符都會佔4個) |
double(4,2) | 雙精度浮點型,m總個數,d小數位 | price double(4,2) |
text | 可變長度,最多65535個字符 | detail text |
datetime | 日期時間類型YYYY-MM-DD HH:MM:SS | dates datetime |
enum('good','not good') | 枚舉,在給出的value中選擇 | ping enum('good','not good') |
流程redis
creat table tb2(
id INT,
name VARCHAR(20),
sex CHAR(4),
price DOUBLE(4,2),
detail TEXT,
datae DATATIME,
ping ENUM('好評','差評')
);
insert intotb2 value(1,'褲子','男',20.0,'這條褲子超級好!',now(),'好評');
功能 | 用法 | |
---|---|---|
增 | insert [into] student (id,name) value (1,'王一凡'); | 增的第一個語法 |
insert into tanzhou value(2,'name'); | ()中的字段名可寫可不寫,默認按順序添加 | |
insert into student value(3) | 也可只插入id | |
insert into tanzhou set id=4,name='name1'; | 增的第二個語法 | |
查 | select * from student; | 查看student |
select * from student where id<4; | 查看student 而且id小於4的內容 | |
select name from studen where id<4; | 查看student 內的name 段,而且id小於4的內容 | |
改 | update student set name='name1' where id=5; | 將id=5的那一行的name 改成'name1' |
update tanzhou set name='name1' | 若是不加where 限制條件,則表中的name全被更改 | |
刪 | delete from student where name='錢七'; | 刪除全部name=錢七的數據 |
功能 | 用法 | 註釋 |
---|---|---|
登陸數據庫 | mysql -uroot -ppassword |
|
退出 | exit 或 \q |
|
建立用戶 | create user 'lucky'@'%' identified by 'password'; |
%表示遠程鏈接,可用此用戶名登錄 |
賦予全部權限 | grant all on *.* to 'lucky'@'%'; |
|
使權限生效 | flush privileges; |
flush寫入 |
查看當前用戶 | select user(); |
|
查看當前位於哪一個數據庫 | select database(); |
|
查看當前有哪些數據庫 | show databases; |
|
建立數據庫 | create database mydb; 或 create database [if not exists] mydb; |
建立以mydb爲名創建一個數據庫,[]爲可選參數 |
刪除數據庫 | drop database mydb; |
|
進入數據庫 | use mydb; |
|
建立數據表 | create table [if not exists] student(<br />id int ,<br />name varchar(10)<br />); | student爲建立表的name <br /> id 表示(元組)字段編號,數據爲int型 <br /> name爲字段名,varchar爲類型,20爲長度 |
查看當前數據倉庫內有哪些表 | show tables; |
|
查看錶的結構 | desc student; |
|
查看建立表時的命令 | show creat table tanzhou; |
|
刪除表格 | DROP TABLE tablename; |
例子:
create table tb1(
id int not null, #非空約束字段,insert 的時候,必須添加字段,不能省略,空字符不等於null
name varchar(20) not null
);
# 若是在建立表時沒有添加非空約束
# 後續手動添加非空約束(必須這個字段,沒有NULL值)
alter table tb1 # 修改表結構
modify id int not null;
# 取消非空約束
alter table tb1
modify id int;
確保字段中的值的惟一
sql
例子:
create table tb2(
id int unique key, # 防止id相同
)
# 若是在建立表時沒有添加非空約束
# 後續手動添加惟一約束
alter table tb1 # 修改表結構
add unique key(name);
# 刪除惟一約束
alter table tb1
drop key name;
auto_increment:自動編號,通常與主鍵組合使用。一個表裏只有一個自增默認狀況下,起始值爲1,每次的增量爲1。
mongodb
create table stu3(
id int primary key auto_increment, # 自增加,輸錯時在終端不會佔用數據,在其餘鏈接工具如pycharm中就會佔用一條數據
name varchar(10)
)auto_increment 100
insert into stu3 value('a');
insert into stu3(name) value('bc');
select * from stu3;
# 若是在建立表時沒有添加自動增加
# 後續手動添加自動增加
alter table stu3 # 修改表結構
modify id int auto_increment;
# 刪除自動增加
alter table stu3
modify id int;
初始值設置,插入記錄時,若是沒有明確爲字段賦值,則自動賦予默認值
數據庫
create table stu4(
id int primary key auto_increment,
name varchar(20) not null,
age int not null default 18 # 默認約束
);
insert into stu4 value(1,'張三','18');
insert into stu4 value(2,'李四',''); #會報錯
insert into stu4(id,name) value(2,'玲玲'); #設置要輸入的字段值,age可爲空字符串
insert into stu4 value(6,'',19); #空字符串 != null
# 若是在建立表時沒有添加默認約束
# 後續手動添加默認約束
alter table stu4 # 修改表結構
modify age int default 20;
# 刪除默認約束
alter table stu4
modify age int;
主鍵做用:能夠惟一標識一條數據,每張表裏只能有一個主鍵
編程
主鍵特性:非空且惟一,表沒有主鍵時,第一個出現的非空且惟一
create table stu2(
id int primary key, # id是主鍵,主鍵不能爲空
name varchar(10)
);
desc stu2 # 此時能夠看到id的key變爲pri,且Null下變爲NO
# 若是在建立表時沒有添加主鍵約束
# 後續手動添加主鍵約束
alter table stu2 # 修改表結構
add primary key(id);
# 刪除主鍵約束
alter table stu2 # 修改表結構
drop primary key;
保持數據的一致性、完整性,實現一對一或一對多關係。
外鍵必須關聯到鍵上面去,通常狀況是,關聯到另外一張表的主鍵。
由於一個表只在一類信息。用外鍵來作參照,保證數據的一致性,能夠減小數據冗餘。
# 表a
create table a(
a_id int primary key auto_increment,
a_name varchar(20) not null
);
# 表b
create table b(
b_id int primary ke,
b_name varchar(20)not null,
fy_id int not null,
constraint AB_id foreign key(fy_id) references a(a_id) # 外鍵約束定義
);
# 說明:
1,經過(fy_id)關聯到(a_id)中,而後從新命名爲 AB_id(其中constraint 可不寫)
2,外鍵約束定義,B表中的fy_id,只能添加a_id中已有的數據。A表中的a_id 被參照的數據,不能被修改和刪除。
# 若是在建立表時沒有添加外鍵約束
# 後續手動添加外鍵約束
alter table b # 修改表結構
constraint AB_id foreign key(fy_id) references a(a_id);
# 刪除外鍵約束
alter table stu2 # 修改表結構
drop foreign key AB_id;
單位表,學生表,課程表,三張表,多對多
一對一爲主鍵和主鍵關聯,一對可能是主鍵和外鍵關聯,加中間表就是多對多
用外鍵的方式,把兩個主鍵關聯
舉例,學生表中有學號、姓名、學院,但學生還有寫好比電話,家庭地址等信息,這些信息不會放在學生表中,會新建一個學生的詳細信息表來儲存。
這時的學生表和學生的詳細信息二者的關係就是一對一的關係,由於一個學生只有一條詳細信息,**用主鍵加主鍵的方式**來實現這種關係
# 創建學生表
create table student(
id int primary key,
name varchar(19) not null
);
insert into student value(1);
--------------------------------------------------------------------------------
#創建詳細學生表
create table student_details(
id_x int primary key,
sex varchar(20) not null,
age int,
address varchar(20) comment'家庭住址',
parents varchar(20),
home_num varchar(20),
foreign key(id_x) references student(id)
);
insert into student_details values(1,'趙六')
# 說明:
1,此時student中的id1,對應student_details中的id1。。student中沒有插入的name,對應student_details中插入的趙六
2,學生表和學生詳情表經過student.id 和student_deatails.id_x關聯,造成一對一關係,只能插入主鍵相同的數據
一般狀況下,學校中一個學院能夠有不少學生,而一個學生只屬於某一個學院
學院與學生之間的關係就是一對多的關係,經過**外鍵關聯**來實現這種關係
# 建立學院表
create table department(
id int primary key,
subject varchar(10) not null
);
insert into department values(001,'Python'),(002,'JAVA');
#建立學生表
create table vip(
id_v int primary key, # 學生的id
name_v varchar(10) not null, # 學生名字
id_w int not null # 所屬學院id,只能添加已有的學院id
constraint SD_id foreign key(id_w) references department(id) # 外鍵
);
insert into vip value(001,'王五',1); # (001(id_v), 名字,1(department表的 ID))
舉例,學生要報名選修課,一個學生能夠報名多門課程,一門課程有不少學生報名,那麼學生表和課程表二者就造成了多對多關係
對於多對多關係,須要建立中間表實現
#建立學生表
create table sst(
id int primary key auto_increment,
name varchar(10) not null
);
#建立選課表(中間表)
create table course(
s_id int primary key, #記錄學生的id
course_id int, #用來記錄課程id
primary key(s_id,course_id) #聯合主鍵(此組合爲惟一的,防止一個id重複報一個課程)
foreign key(s_id) references student(id_v), #關聯學生id 外鍵
foreign key(course_id) references(course_id) #關聯課程id 外鍵
name varchar(10) not null,
);
insert into cours values(001,'py'),(002,'java'),(003,'japan');
insert into ssh values(11,'a'),(22,'b'),(33,'c');
insert into course values(22,3),(11,2); # 用中間表來多對多
select * from course;
(1)創建選課系統中的5張表:(學院表,學生表,學生詳情表,課程表,選課表),並每張表插入4條數據。
(2)用文字描述:這5張表之間,對應關係。並說明如何實現這個對應關係。
create table tb1(
id int,
name char(4));
#修改表結構,增長字段 年齡
alter table tb1 add age int first; #增長年級字段到第一列;
alter table tb1 drop age ; #刪除年齡字段;
alter table tb1 add age int after id;#在id後面增長一個字段age,age在第個字段;
#修改已經存在字段的類型
alter table tb1 modify age char(4) #把age字段修改爲char類型;
#修改列名(字段名)
alter table tb1 change age sex char(4); #將age字段修改成sex;
#修改表名
alter table tb1 rename tb2 #將表tb1修改成tb2
mysql> show tables;
+----------------+
| Tables_in_mydb |
+----------------+
| choose |
| course |
| details |
| student |
| tanzhou |
+----------------+
mysql> desc tanzhou;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| tz_id | int(11) | NO | PRI | NULL | auto_increment |
| tz_name | varchar(10) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> select * from tanzhou;
+-------+--------------+
| tz_id | tz_name |
+-------+--------------+
| 1 | 軟件學院 |
| 2 | 語言學院 |
| 3 | 市場營銷 |
| 4 | 養殖學院 |
+-------+--------------+
4 rows in set (0.00 sec)
mysql> desc student;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| st_id | int(11) | NO | PRI | NULL | auto_increment |
| st_name | varchar(10) | NO | | NULL | |
| ts_id | int(11) | NO | MUL | NULL | |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> select * from student;
+-------+-----------+-------+
| st_id | st_name | ts_id |
+-------+-----------+-------+
| 1 | 三花 | 1 |
| 2 | 賈梅 | 1 |
| 3 | 餘玲玲 | 3 |
| 4 | 王濤 | 2 |
+-------+-----------+-------+
4 rows in set (0.00 sec)
mysql> desc course;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| c_id | int(11) | NO | PRI | NULL | auto_increment |
| c_name | varchar(10) | YES | | NULL | |
| tzc_id | int(11) | NO | MUL | NULL | |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> desc choose;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| sc_id | int(11) | NO | PRI | NULL | |
| cc_id | int(11) | NO | PRI | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)
一、查詢全部記錄
select * from student;#查詢student表中的全部內容;
二、查詢選中列記錄
select s_name from student;#查詢表中所在字段的內容;
三、查詢指定條件下的記錄
select s_name from student where s_id>4;#查詢學號s_id 大於4的學生的姓名;
四、查詢後爲列取別名
select s_name as 姓名 from student; #將s_name 字段查詢並命名爲姓名(as可加可不加)
select s_name 姓名 from student; #能夠省略 as 在作聯合查詢時要加上別名,方便區分不一樣的表
五、模糊查詢
select * from student where s_name like '三%';#查詢姓名中帶有 '三'的信息
select * from student where s_name like '%三';#查不出
select * from student where s_name like '三_';
select * from student where s_name like '三__'#兩條下劃線表示兩個字符
六、排序:order by (:ASC 升序(默認升序))
select * from student order by ts_id asc; #升序,默認
select * from student order by ts_id desc;#降序