Ubuntu下安裝mysql
apt update
sudo apt-get install mysql-server mysql-client
啟動(dòng) service mysql start
停止 service mysql stop
重啟 service mysql restart
查看mysql服務(wù)狀態(tài) service mysql status
允許遠(yuǎn)程連接
找到mysql配置文件并做如下修改:允許遠(yuǎn)程連接
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
刷新權(quán)限 FLUSH PRIVILEGES;
退出命令行 exit quit
進(jìn)入mysql mysql -u root -p;
創(chuàng)建數(shù)據(jù)庫(kù)
- 直接創(chuàng)建:create database 名稱呵晚;(這樣會(huì)使用mysql默認(rèn)的字符集) create schema 名稱驱显;
- 通過字符集來創(chuàng)建: create database 名稱 charset=utf8;
- 創(chuàng)建數(shù)據(jù)庫(kù)前判斷數(shù)據(jù)庫(kù)是否存在: create database if not exists 名稱赁温;
查看數(shù)據(jù)庫(kù):show databases;
選擇數(shù)據(jù)庫(kù):use 數(shù)據(jù)庫(kù)名稱;l
查看當(dāng)前所在數(shù)據(jù)庫(kù):select database();
1
刪除數(shù)據(jù)庫(kù):例如:drop database 數(shù)據(jù)庫(kù)名稱;
如果刪除的數(shù)據(jù)庫(kù)不存在缘挑,則會(huì)報(bào)錯(cuò)氮惯,的解決方:例如:drop database if exists 名稱;
查看所有的字符集:show charset;
查看當(dāng)前數(shù)據(jù)庫(kù)編碼格式: show variables like 'character_set_database';
添加數(shù)據(jù)庫(kù)的utf8默認(rèn)編碼:alter database 數(shù)據(jù)庫(kù)名 character set utf8;
查詢MySQL中支持的存儲(chǔ)引擎 show engines;
查看數(shù)據(jù)庫(kù)的默認(rèn)的搜索引擎:show variables like ' default_storage_engine ';
修改默認(rèn)存儲(chǔ)引擎 set default_storage_engine=innodb
創(chuàng)建表:create tables 表的名字赦役;列表的名字和定義用逗號(hào)隔開麻敌;(userid int not null auto_increment),(name char(10) not null);
查看表:show tables;
查看表的詳細(xì)信息:show create table 名稱;
查看表的結(jié)構(gòu):desc 數(shù)據(jù)表名;
查看某一列的的結(jié)構(gòu): desc 數(shù)據(jù)表名 列名掂摔; 例如: desc oppo name;
創(chuàng)建表時(shí)如果一個(gè)表存在的時(shí)候還創(chuàng)建术羔,應(yīng)在表名后給出 if not exists 檢查表是否存在,僅在表名不存在的時(shí)候創(chuàng)建它乙漓;
自增長(zhǎng):auto_increment ;
主鍵:primary key;
設(shè)置默認(rèn)值:default
例如:phone varchar(11) not null default '12345678909';
更新表時(shí):alter table ;
添加新字段(列):例如:alter table 表名 add age int default 10;
修改字段的值: alter table 表名 modify 字段 修改后的類型级历;
修改字段名(列):alter table 表名 change 舊字段名 新字段名 數(shù)據(jù)類型 約束 屬性;
在不改變舊字段名的情況下修改(類型叭披,復(fù)制)寥殖;
例如:alte table 表名 change modify 字段名,匹配趋观;類型 約束 屬性扛禽;
刪除字段(列):例如:alter table 表名 drop phone ;
修改表名:例如:alter table 舊表名 rename as 新表名;
修改表:alter table 表名 charset=.......;
重名表名:例如:rename table 舊表名 To 新表名;
刪除表:例如:drop table 表名皱坛;
刪除一個(gè)不存在的表會(huì)報(bào)錯(cuò)编曼,如果不報(bào)錯(cuò)如下;
例如:drop table if exists 數(shù)據(jù)表名剩辟;
復(fù)制表:例如:create table if not exists 原名字 like 復(fù)制后的新名字掐场;
crud 對(duì)表的增刪改查
增 insert into (注意:我們插入的數(shù)據(jù)順序必須要跟列對(duì)應(yīng))
1.完全插入:例如:insert into 表名 values( 108401,' 小甜甜 ', 20,1,' 1245678999 ');
2.選擇插入:例如:insert into 表名(userid,name,age) values( 10000,' 花花 ',19);
3.多行插入:例如:insert into 表名(userid,name) values(19999,' 葡萄 '),(18888,‘ 辣椒 ’);
查看已經(jīng)插入的數(shù)據(jù) select * from 表名 (表示所有);
將一個(gè)表復(fù)制到另一個(gè)表中 insert into 新表 (列名,列名...) select 列名,列名... from 原表 ;
修改 跟新 update
1.跟新單個(gè)字段(列) update 表名 set name = '娜娜' , age = 19 where id = 12345;
2.跟新多行 : update 表名 set name = ' 娜娜 ' ;(修改表中某一列的全部值 盡量不要去做)
3.跟新多個(gè)字段(列) update 表名 set name = ' 娜娜 ', age = 19 where id = 18888 ;
刪除數(shù)據(jù) delete
刪除特定的一行:例如:delete from 表名 where id = 10010 ;
刪除所有行:例如:delete from 表名 (不能輕易做);
查詢
查詢所有 select * from 表名》妨浴熊户;
查詢某一個(gè) select * from 表名 where id = 13333 ;
查詢年齡這個(gè)列 select age from 表名 where id = 19999;
使用限定的方式查找吭服,不進(jìn)入數(shù)據(jù)庫(kù)就可以查詢到表的信息
select * from 數(shù)據(jù)庫(kù)名.表名;
使用 distinct 去重嚷堡,返回不重復(fù)的列的值
select distinct age from 表名;
把一個(gè)表插入到另一個(gè)表中:例如:insert into 表 (列名,列名...) select 列名,列名... from 表
數(shù)據(jù)庫(kù)的查詢 where(過濾)
查詢一行 select * from 表名 where age = 6 ;
select 字段名 from 表名 WHERE 條件;
where 條件查詢和運(yùn)算符
= 等于 select * from 表名 where age = 6 ;
<> 不等于艇棕, != 不等于蝌戒,
< 小于串塑, <= 小于等于, > 大于北苟, >= 大于等于桩匪,
between ... and 在兩者之間(包含邊界值);(左右閉合)
例如:select name ,age from 表名 where age between 5 and 30 ;
is null 判斷某一列的數(shù)據(jù),如果包含null 友鼻,則返回記錄傻昙;
例如:select * from 表名 where phone is null ;
and 鏈接查詢條件,查詢的數(shù)據(jù)要全部滿足
例如:select name from 表名 where userid>=18004 and age>99;
or 鏈接查詢條件,查詢的數(shù)據(jù)只要滿足其中一個(gè)即可
例如:select name from 表名 where userid>=18004 or age>90;
in 操作符 (相當(dāng)于 or ) in (條件1,條件2彩扔,條件3)妆档;
SELECT name FROM customers WHERE userid IN(10011,10013);
NOT操作符
例如:> select name from 表名 where userid not in(10011,10013);
排序 order by
升序(asc): 例如:select * from 表名 order by age(列)(默認(rèn)的是升序的);
降序(desc): 例如:select * from 表名 order by age(列)desc;
多個(gè)列做排序:例如:select * from 表名 order by 列(asc|desc),列(asc|desc);
聚合函數(shù)
count() | count(1) :計(jì)算所有行借杰;
avg() :計(jì)算列的平均值过吻;
max() :計(jì)算列的最大值;
min() :計(jì)算列的最小值蔗衡;
sum() :求和 纤虽,計(jì)算列的總和;
通配符
% :匹配任意字符绞惦,任意次數(shù)逼纸;
_ : 匹配任意字符,必須有僅且有一次济蝉;
一般和ike配合使用
select 列 ,列 from 表名 where 列 like ‘趙%’;
select 列 ,列 from 表名 where 列 like ‘趙%’;
正則
. 匹配任意1個(gè)字符(除了\n)
[ ] 匹配[ ]中列舉的字符
\d 匹配數(shù)字杰刽,即0-9
\D 匹配非數(shù)字,即不是數(shù)字
\s 匹配空白王滤,即 空格贺嫂,tab鍵
\S 匹配非空白
\w 匹配單詞字符,即a-z雁乡、A-Z第喳、0-9、_
\W 匹配非單詞字符
* 匹配前一個(gè)字符出現(xiàn)0次或者無限次踱稍,即可有可無
+ 匹配前一個(gè)字符出現(xiàn)1次或者無限次曲饱,即至少有1次
? 匹配前一個(gè)字符出現(xiàn)1次或者0次,即要么有1次珠月,要么沒有
{m} 匹配前一個(gè)字符出現(xiàn)m次
{m,n} 匹配前一個(gè)字符出現(xiàn)從m到n次扩淀,最少m次,最大n次
非貪婪模式匹配:盡可能少的匹配
轉(zhuǎn)義符號(hào) \
^ 匹配字符串以...開頭
$ 匹配字符串以...結(jié)尾
| 匹配左右任意一個(gè)表達(dá)式
(ab) 將括號(hào)中字符作為一個(gè)分組
\num 引用分組num匹配到的字符串
(?P<name>) 分組起別名
(?P=name) 引用別名為name分組匹配到的字符串
python re 模塊
complie: 生成一個(gè)正則匹配規(guī)則對(duì)象啤挎。
match:叢起始位置匹配驻谆,單次匹配,如果匹配不成功直接返回none,如果匹配成功就立即返回,
旺韭,取值使用group();
search:從頭開始匹配氛谜,在整個(gè)字符串中查詢,只要符合規(guī)則就立即返回区端,
單詞匹配,如果不符合返回NONE 澳腹;
sub:字符串替換织盼;
split:分割字符串,返回列表酱塔;
findall:在整個(gè)串中沥邻,返回所有符合規(guī)則的結(jié)果,是一個(gè)列表羊娃;
finditer:跟findall功能一樣唐全,都是匹配出所有符合正則規(guī)則的結(jié)果,返回結(jié)果有區(qū)別蕊玷,返回的是一個(gè)可迭代對(duì)象邮利;
r:原始字符串;
\:轉(zhuǎn)義符垃帅;
分組 group by
單單只是用分組沒有意義;
分組跟聚合函數(shù)的使用延届,統(tǒng)計(jì)每一個(gè)分組下有多少人(有多少條記錄)
SELECT count() as total,age FROM studentinfo GROUP BY age;
統(tǒng)計(jì)分組的信息
SELECT count(), avg(age),min(age),sum(age),gender FROM studentinfo GROUP BY gendeou
group by 與 group_concat(列)(表示分組之后)
group_concat(字段名)可以作為一個(gè)輸出字段來使用,
表示分組之后贸诚,根據(jù)分組結(jié)果方庭,使用group_concat()來放置每一組的某字段的值的集合
SELECT gender,group_concat(student_name),group_concat(age) FROM studentinfo GROUP BY gender;
group by + with rollup (統(tǒng)計(jì)總數(shù))
在最后新增一行,來記錄當(dāng)前列里所有記錄的總和
SELECT gender,count() FROM studentinfo GROUP BY gender with rollup;
having過濾分組酱固,
每個(gè)分組下的記錄(行)大于2械念,才返回
SELECT count(),age FROM studentinfo GROUP BY age HAVING count() >2;
SELECT count(),age,gender FROM studentinfo GROUP BY age,gender HAVING gender =1 ;
跟order by 配合使用
SELECT count(),age,gender FROM studentinfo GROUP BY age,gender HAVING gender=1
ORDER BY age DESC;
having后跟多條件篩選分組
SELECT count(),age,gender FROM studentinfo GROUP BY age,gender HAVING gender=1
AND age > 67 ORDER BY age DESC;
限定查詢 limit
1.如果LIMIT 后面只跟了一個(gè)數(shù)字,表示限制返回多少條运悲,并且從第一條開始龄减。
SELECT * FROM studentinfo LIMIT 6; => SELECT * FROM studentinfo LIMIT 0,6;
2.如果LIMIT 后面只跟了兩個(gè)數(shù)字,第一個(gè)數(shù)字表示偏移量(不包含當(dāng)前數(shù)字對(duì)應(yīng)的這一行)扇苞,
后一個(gè)數(shù)字表示限制返回多少條欺殿。
SELECT * FROM studentinfo LIMIT 6,6;
從第6條開始查詢,返回6條結(jié)果鳖敷。不包含第六條脖苏。返回(7條-12條)
select * from 表名 limit 7,12;
我們?nèi)绾稳?shí)現(xiàn)一個(gè)分頁功能,輸入對(duì)應(yīng)的頁碼m,每一頁返回20條數(shù)據(jù)定踱,
SELECT * FROM studentinfo LIMIT (m-1)*20,20
取年齡最大的
SELECT * FROM studentinfo ORDER BY age DESC LIMIT 1;
取年齡最小的
SELECT * FROM studentinfo ORDER BY age LIMIT 1;
限定條件返回結(jié)果(LIMIT)
SELECT count(*),age,gender FROM studentinfo GROUP BY age,gender HAVING gender=1 ORDER BY
age DESC LIMIT 2,2;
查詢語句的順序:
SELECT 列棍潘,列 FROM 表名 WHERE 條件 GROUP BY 列,列 HAVING 條件 ORDER BY 列
(ASC|DESC) LIMIT start,count;
回顧
關(guān)于自增的擴(kuò)展:
可以設(shè)置設(shè)置auto_increment一個(gè)起始值
ALTER TABLE 表明 AUTO_INCREMENT=180460
改變自增的步長(zhǎng)
1.會(huì)話級(jí)別:
show session variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
修改步長(zhǎng):
SET SESSION auto_increment_increment=2(設(shè)置步長(zhǎng)的值)
2.基于全局的設(shè)置:
show global variables like 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
修改步長(zhǎng):
SET global auto_increment_increment=2(設(shè)置步長(zhǎng)的值)
總結(jié):
一個(gè)表里面只能有一個(gè)自增,并且一般都會(huì)設(shè)置主鍵為自增,
不然會(huì)報(bào)錯(cuò):
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
創(chuàng)建計(jì)算字段
創(chuàng)建的計(jì)算字段原本并不存在我們的表里面亦歉。我們通過mysql的函數(shù)或者算術(shù)運(yùn)算得到一個(gè)結(jié)果恤浪,
我們把這個(gè)結(jié)果起一個(gè)別名,這個(gè)字段就是我們創(chuàng)建的計(jì)算字段肴楷。
加密函數(shù)
1.PASSWORD('') 2.MD5('')
創(chuàng)建計(jì)算字段
1.IF(x1,v1,v2) : x1:表示條件水由,如果滿足返回v1,否則返回v2
2.IFNULL(v1,v2) :if v1 not NUll,返回v1,否則返回v2
3.CASE WHEN 條件 THEN 結(jié)果1 ELSE 結(jié)果2 END:當(dāng)遇到某種條件,
當(dāng)WHEN后面的條件滿足赛蔫,返回THEN后面的結(jié)果1砂客,否則返回結(jié)果2.
還有數(shù)字函數(shù)、字符串函數(shù)呵恢、日期鞠值、時(shí)間函數(shù)
三范式 、E-R
三范式
1NF:列不可再分(盡量細(xì)的去拆分每一列)
2NF:1.一個(gè)表必須要有一個(gè)主鍵(這個(gè)主鍵可以由單個(gè)列渗钉,或者多個(gè)列組成)
2.非主鍵的列彤恶,必須完全依賴于主鍵,而不是及部分依賴于鍵
3NF:在第二范式的基礎(chǔ)上鳄橘,不能存在傳遞依賴声离,非主鍵的列,必須直接依賴于主鍵挥唠,而不能存在傳遞依賴的關(guān)系抵恋。
E-R模型
E:Entry 表示實(shí)體,其實(shí)就是根據(jù)某一個(gè)事物的體征宝磨,添加描述信息弧关,我們將這些描述信息添加
在一個(gè)表(table)里面,那么這個(gè)表就相當(dāng)于一個(gè)實(shí)體唤锉。
R:Relationship 關(guān)系世囊,在這里其實(shí)就是指的表與表之間的關(guān)系
一對(duì)一:個(gè)人信息與身份證的信息例子;
一對(duì)多:班級(jí)與學(xué)生的例子窿祥;
多對(duì)多:很多學(xué)生選課的例子株憾;
一對(duì)一:個(gè)人信息與身份證
個(gè)人信息表
create table userinfo(
id int auto_increment,
name varchar(10) not null,
idcard int not null,
primary key(id),
#外鍵:
CONSTRAINT FK_IDCARD(起個(gè)名字) FOREIGN KEY(idcard) REFERENCES IDENTIFITY(id)
);
身身份證表ID
CREATE TABLE IDENTIFITY(
id int auto_increment,
id_num varchar(50) not null,
primary key(id)
);
一對(duì)多:班級(jí)與學(xué)生
學(xué)生表
CREATE TABLE studnets(
stu_id int auto_increment,
stu_name varchar(20) not null,
#班級(jí)
primary key(stu_id)
);
班級(jí)表
CREATE TABLE grade(
cls_id int auto_increment,
cls_name varchar(20) not null,
cls_desc varchar(255) not null,
cls_student_num int default 0,
primary key(cls_id)
);
多對(duì)多:選課
學(xué)生表
CREATE TABLE studnets(
stu_id int auto_increment,
stu_name varchar(20) not null,
#班級(jí)
primary key(stu_id)
);
課程
CREATE TABLE courses(
cour_id int auto_increment,
cour_name varchar(20) not null,
primary key(cour_id)
)
如何設(shè)置外鍵?
1.首先要找表與表之間的關(guān)系晒衩。
2.班級(jí)表(id,name,主鍵為id)
3.學(xué)生表(id,name,主鍵id,clsid(外鍵)->班級(jí)表中的班級(jí)的主鍵)
創(chuàng)建學(xué)生表必須要有班級(jí)表
創(chuàng)建班級(jí)表
CREATE TABLE classes(
id int auto_increment,
name varchar(20) not null,
primary key(id)
)engine = innodb default charset=utf8
CREATE TABLE students(
id int auto_increment,
name varchar(20) not null,
clsid int,
primary key(id),
constraint FK_CLSID foreign key(clsid) references classes(id)
);
刪除外鍵
ALTER TABLE students drop foreign key FK_CLSID;
添加外鍵
ALTER TABLE student ADD constraint FK_CLSID foreign key(clsid) references classes(id);
7]