001---mysql

Mysql數據庫

數據庫相關概念

  • 數據庫服務器:運行數據管理軟件的計算機mysql

  • 數據庫:顧名思義數據倉庫,是一個文件夾、存儲多個文件(數據表)linux

  • 數據表:對應一個文件,存儲在數據庫下程序員

  • 數據:對應文件中的每一行,描述事物特徵的符號redis

  • 數據庫管理軟件
    • 關係型:須要有表結構(mysql,sqlserver,db2,oracle)sql

    • 非關係型:key-value結構(redis,mongodb)mongodb

用戶相關

win

  • 安裝爲系統服務:mysqld --install數據庫

  • 改密碼:mysqladmin -uroot -proot password "root"
  • 登陸:mysql -uroot -proot
  • 啓動:net start mysql56
  • 中止:net stop mysql56安全

  • 破解密碼:mysqld --skip-grant-tables
  • 更新密碼:update mysql.user set password=password("密碼") where user="root" and host="localhost";
  • 刷新:flush privileges;
  • 殺:taskkill /F /PID ....服務器

  • 查看登錄用戶:select user();網絡

linux

  • 破解:mysql_safe --skip-grant-tables

統一字符編碼

查看字符編碼

統一字符編碼

# 修改配置文件
[mysqld]
default-character-set=utf8 
[client]
default-character-set=utf8 
[mysql]
default-character-set=utf8

#mysql5.5以上:修改方式有所改動
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
# 這樣在控制檯輸入mysql能夠直接登陸
user='root'
password='root'

初識sql語句

操做文件夾(庫)

  • 切換文件夾:use db1;

  • 增長:create database db1 charset utf8;
  • 查看:
    • 建庫語句:show create database db1;

    • 全部數據庫:show databases;

    • 查看當前所在數據庫:select database();

  • 修改:
    • 修改字符編碼:alter database db1 charset gbk;
  • 刪除:drop database db1;

操做文件(表)

  • 增:create table t1(id int,name char) engine=innodb;

  • 刪:
    • 刪除:drop table t1;

    • 清空表結構:truncate table t1;

  • 改:
    • 修改表字段類型:alter table t1 modify name char(6);

    • 修改表字段名稱:alter table t1 change name Name varchar(8);

  • 查:
    • 查看建表語句:show create table t1;

    • 查看全部表:show tables;
    • 查看錶結構:desc t1;

操做文件內容(記錄)

  • 增:insert into t1(id,name) values(1,'egon'),(2,'egon'),(3,'alex');

  • 刪:
    • delete from t1; 自增加並無改變,不是1,因此儘可能與where搭配。

    • delete from t1 where id=1;
  • 改:
    • update t1 set name='sb';

    • update t1 set name='alex' where id=2;
  • 查:
    • select * from t1;

    • select id,name from t1;

sql語言類型

  • DDL語句:數據庫定義語言,create drop alter

  • DML語句:數據庫操做語言,insert update delete select

  • DCL語句:數據庫控制語言,grant revoke

存儲引擎

什麼是存儲引擎

現實生活中咱們用來存儲數據的文件有不一樣的類型,每種文件類型對應各自不一樣的處理機制:好比處理文本用txt類型,處理表格用excel,處理圖片用png等

數據庫中的表也應該有不一樣的類型,表的類型不一樣,會對應mysql不一樣的存取機制,表類型又稱爲存儲引擎

存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和操做此表的類型)

查看存儲引擎

show engines;

表操做

建立

create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
);

注意:

  1. 在同一張表中,字段名是不能相同
  2. 寬度和約束條件可選
  3. 字段名和類型是必須的

查看錶結構

  • 簡單:desc table1
  • 詳細:show create table table1

修改表結構

  • 修改表名: ALTER TABLE 表名 RENAME 新表名;

  • 增長字段
    • ALTER TABLE 表名  
            ADD 字段名  數據類型 [完整性約束條件…],
            ADD 字段名  數據類型 [完整性約束條件…];
    • ALTER TABLE 表名
            ADD 字段名  數據類型 [完整性約束條件…]  FIRST;
    • ALTER TABLE 表名
                ADD 字段名  數據類型 [完整性約束條件…]  AFTER 字段名;
  • 刪除字段:ALTER TABLE 表名 DROP 字段名;

  • 修改字段
    sql ALTER TABLE 表名 MODIFY 字段名 數據類型 [完整性約束條件…]; ALTER TABLE 表名 CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…]; ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];

表的複製

  • 複製表結構 + 記錄:create tale t1 select host,user from mysql.user;
  • 複製表結構:

    -- 條件不成立,空記錄
    create table t2 select host,user from mysql.user where 1>5;
    create table t3 like mysql.user;

刪除表

drop table t3;

數據類型

數字類型

  • int 4字節
  • float(m,d):
    • m是數字總個數 最大255
    • d是小數點後的個數 最大30
  • decimal(m,d):
    • m是數字總個數 最大65
    • d是小數點後的個數 最大30
    • 精度最高

日期類型

create table student(
    id int,
    name char(6),
    born_year year,
    birth_date date,
    class_time time,
    reg_time datetime
);
insert into student values(1,'egon',now(),now(),now(),now());
insert into student values(2,'alex','1997','1996-10-19','12:12:12','2018-09-13 12:12:12');

datetime與timestamp的區別

  1. DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。
  2. 8字節 4字節
  3. 不受時區影響 受時期影響

'''

字符串類型

'''

  • char定長(0-255):簡單粗暴,浪費空間(以空格來填充),存取速度快

  • varchar變長(0-65535):省內存,可是查詢速度慢

'''

枚舉和集合類型

create table consumer(
    id int,
    name char(4),
    sex enum('male','female','other'),
    level enum('vip1','vip2','svip'),
    hobbies set('game','music','run')
);

insert into consumer values(1,'egon','male','svip','music,game');
-- 不在範圍內就爲空
insert into consumer values(1,'egon','xx','svip','music,game');
  • enum:單選
  • set:多選

完整性約束

not null與default

create table t1(
    id int not null ,
    name char(4),
    sex enum('male','female') not null default 'male'
);
insert into t1(id,name) values('1','alex');

不爲空和默認值

unique

惟一約束

  • 單列惟一

    create table dpt(
      id int,
      name char(10) unique
    );
    
    insert into dpt values(1,"IT");
    insert into dpt values(2,"IT");
    
    -- 方式一
    create table dpt(
    id int unique,
    name char(10) unique
    );
    -- 方式二
    create table dpt(
    id int,
    name char(10),
    unique(id),
    unique(name)
    );
  • 聯合惟一

    --ip和端口聯合惟一
    create table services(
        id int ,
        ip char(15),
        port int,
        unique(ip,port),
        unique(id)
    );
    
    insert into services values
    (1,'127.0.0.1',80),
    (2,'127.0.0.1',81),
    (3,'118.25.126.94',80);

primary_key

主鍵

  • 不爲空、且惟一
  • 必須設定一個主鍵
  • 對於innodb存儲引擎來講: 一張表只能有一個主鍵
  • 加快了查詢速度

單列主鍵

create table t1(
    id int primary key,
    name char(16),
);

複合主鍵

create table services1(
    ip char(15),
    port int,
    primary key(ip,port)
);

auto_increment

自增

create table t3(
    id int primary key auto_increment,
    name char(4)
);

insert into t3(name) values
('egon'),
('alex'),
('wpq');

insert into t3(id,name) values('5','jw')

查看:show variables like 'auto_inc%';

步長:auto_increment_increment

起始偏移量:auto_increment_offset

設置步長:

  • 會話級別:set session auto_increment_increment=3;
  • 全局級別:set gloable auto_increment_increment=3;

設置偏移量:

  • set gloable auto_increment_offset=3;

注意

  • 起始偏移量<=步長
  • delete from student;:清空表,可是自增按照刪除前的位置繼續自增
  • truncate table t1;:清空表,且自增也初始化。

foreign_key

用來創建表與表之間的關係

-- 先建立dep表
create table dep(
    id int primary key auto_increment,
    name char(16),
    comment char(50)
);

-- 插入數據
insert into dep(name,comment) values('CEO','一羣吹牛的部門'),
('IT','技術通常的部門'),
('財務','花錢特別多的部門'),
('銷售','不會賣東西的部門');

-- 再建立關聯的emp表
 create table emp(
 id int primary key,
 name char(10),
 sex enum('male','female'),
 dep_id int,
 constraint fk_dep foreign key(dep_id) references dep(id) 
 on delete cascade 
 on update cascade
 )

-- 插入數據
insert into emp(name,sex,dep_id) values
('alex','male',1),
('egon','male',2),
('yuanhao','female',3),
('wupeiqi','male',4);

數據操做

插入

1. 插入完整數據(順序插入)
    語法一:
    INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n);

    語法二:
    INSERT INTO 表名 VALUES (值1,值2,值3…值n);

2. 指定字段插入數據
    語法:
    INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);

3. 插入多條記錄
    語法:
    INSERT INTO 表名 VALUES
        (值1,值2,值3…值n),
        (值1,值2,值3…值n),
        (值1,值2,值3…值n);
        
4. 插入查詢結果
    語法:
    INSERT INTO 表名(字段1,字段2,字段3…字段n) 
                    SELECT (字段1,字段2,字段3…字段n) FROM 表2
                    WHERE …;

更新

語法:
    UPDATE 表名 SET
        字段1=值1,
        字段2=值2,
        WHERE CONDITION;

示例:
    UPDATE mysql.user SET password=password(‘123’) 
        where user=’root’ and host=’localhost’;

刪除

語法:
    DELETE FROM 表名 
        WHERE CONITION;

示例:
    DELETE FROM mysql.user 
        WHERE password=’’;

查詢

  • 單表查詢
--單表查詢

-- select distanct 字段1,字段2,字段3 from 庫.表 where 條件 group by 分組條件 having 過濾 order by 排序字段 limit n;
-- 優先級  where group distinct order by


-- 建立表
create table emp(
    id int primary key auto_increment,
    name varchar(20) not null,
    sex enum('male','female') not null default 'male',
    age int not null default 21,
    hire_date date not null,
    post varchar(50),
    post_comment varchar(100),
    salary double(15,2),
    office int, 
    depart_id int
);

-- 插入記錄
-- 三個部門:教學,銷售,運營
insert into emp(name,sex,age,hire_date,post,salary,office,depart_id) values
-- 如下是教學部
('egon','male',18,'20170301','老男孩駐沙河辦事處外交大使',7300.33,401,1), 
('alex','male',78,'20150302','teacher',1000000.31,401,1),
('wupeiqi','male',81,'20130305','teacher',8300,401,1),
('yuanhao','male',73,'20140701','teacher',3500,401,1),
('liwenzhou','male',28,'20121101','teacher',2100,401,1),
('jingliyang','female',18,'20110211','teacher',9000,401,1),
('jinxin','male',18,'19000301','teacher',30000,401,1),
('成龍','male',48,'20101111','teacher',10000,401,1),
-- 如下是銷售部門
('歪歪','female',48,'20150311','sale',3000.13,402,2),
('丫丫','female',38,'20101101','sale',2000.35,402,2),
('丁丁','female',18,'20110312','sale',1000.37,402,2),
('星星','female',18,'20160513','sale',3000.29,402,2),
('格格','female',28,'20170127','sale',4000.33,402,2),
-- 如下是運營部門
('張野','male',28,'20160311','operation',10000.13,403,3), 
('程咬金','male',18,'19970312','operation',20000,403,3),
('程咬銀','female',18,'20130311','operation',19000,403,3),
('程咬銅','male',18,'20150411','operation',18000,403,3),
('程咬鐵','female',18,'20140512','operation',17000,403,3);

-- 查詢

-- 字段查詢
select id,name from emp;

-- 去重
select distinct post from emp;

-- 別名
select name,salary*12 as 年薪 from emp;

-- 字符串拼接
select concat('<姓名:',name ,'>',' <性別:',sex,'>') as info from emp;

-- where條件查詢
select id,name,age from emp where id>7;

select name from emp where post='teacher' and salary > 8000;

select name,salary from emp where salary between 20000 and 30000;

select name,salary from emp where salary in (20000,30000);

select name,salary from emp where salary not in (20000,30000);
-- 不能用等於
select name from emp where post_comment is NULL ; 

-- 模糊匹配
-- 任意字符
select name from emp where name like "jin%";    
-- 一個字符
select name from emp where name like "jin___";  

--group by 分組查詢
select sex from emp group by sex; -- 只能查分組的字段,以及聚合
select sex,count(sex) from emp group by sex; -- 統計男女性別數目
select post,count(post) from emp group by post;-- 每一個職位有多少員工
select post,avg(salary) from emp group by post;
select post,group_concat(name) from emp group by post;-- 每一個職位下全部員工的姓名

--having 分組後過濾  可使用聚合函數過濾

--查詢各崗位包含的員工個數小於2的崗位名,崗位內包含的員工名字、個數
select post,group_concat(name),count(post) from emp group by post having count(id)<2;
--查詢各崗位平均薪資大於1萬的崗位名、平均工資
select post,avg(salary) from emp group by post having avg(salary)>10000;
--查詢各崗位平均薪資大於1萬且小於2萬的崗位名、平均工資
select post,avg(salary) from emp group by post having avg(salary) between 10000 and 20000;

--order by排序
select id,age from emp order by age asc;   --年齡從小到大升序
select id,age from emp order by age desc;   --年齡從小到大降序
select id,age from emp order by age desc ,id asc;   --年齡從小到大降序,id升序

-- limit n分頁
select * from emp limit 3;
-- 查詢工資最高的那我的的信息
select * from emp order by salary desc limit 1;--第一條
select * from emp limit 0,5;  --取五條數據 ,從1開始
-- 注意:並非那麼簡單,性能問題


--總結:
-- 語法順序:
-- 執行上順序:
        --from 表--where條件--group分組--hanving過濾--distinct--order by排序--limit 分頁--

-- 正則
select * from emp where name regexp '^jin.*g$';
select * from emp where name regexp '^jin.*(g|n)$';
  • 連表查詢
-- 建表
create table dep(
id int,
name varchar(20)
);

create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);

-- 插入數據
insert into dep values
(200,'技術'),
(201,'人力資源'),
(202,'銷售'),
(203,'運營');

insert into emp(name,sex,age,dep_id) values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwenzhou','male',18,200),
('jingliyang','female',18,204)
;

--內鏈接:兩個表的共同部分
select * from dep d inner join  emp e on e.dep_id=d.id;

--左鏈接:保留左表,右表沒有的以null填充
select * from dep d left join  emp e on e.dep_id=d.id;

--右鏈接:保留右表,左表沒有的以null填充
select * from dep d right join  emp e on e.dep_id=d.id;

--全鏈接
select * from dep d left join  emp e on e.dep_id=d.id
union
select * from dep d right join  emp e on e.dep_id=d.id;

--查詢平均年齡大於30歲的員工的部門名
select d.name,avg(age) from emp e inner join dep d on d.id=e.dep_id group by d.name having avg(age)>30;

-- {
--   "server":"0.0.0.0",
--   "port_password":{
--     "8383":"wgx123456",
--     "8384":"jw123456"
--     },
--   "timeout":300,
--   "method":"aes-256-cfb",
--   "fast_open":false
--
-- }

權限管理

視圖

  • 虛擬表,是已經編譯好的SQL語句,是基於執行SQL語句的結果集的可視化的表
  • 視圖的創建和刪除隻影響視圖自己,不影響對應的表。

觸發器

觸發器(trigger)是提供給程序員和數據分析員來保證數據完整性的一種方法,是一種特殊類型的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發。

類型

  • 過後觸發器(表):增刪改查自動執行,調用一個或多個
  • 替代觸發器(視圖):不止應用到表上,不會先執行增刪改查,只會執行本身自己的代碼。

事務

事務用於將某些操做的多個SQL做爲原子性操做,一旦有某一個出現錯誤,便可回滾到原來的狀態,從而保證數據庫數據完整性。

存儲過程

存儲在服務器,一組tsql語句。經過調用它的名字能夠執行其內部的一堆sql

優勢

  1. 提升程序的通用性和可移植性

  2. 提升數據庫的運行速度

  3. 減輕網絡帶寬,減小網絡流量

  4. 安全性高,可設定只有某些用戶才具備對指定存儲過程的使用權

索引

加速查詢速率

經常使用索引

  • 普通索引INDEX:加速查找

  • 惟一索引:
    • 主鍵索引PRIMARY KEY:加速查找+約束(不爲空、不能重複)
    • 惟一索引UNIQUE:加速查找+ 約束(可爲空,不能重複)
  • 聯合索引:
    • PRIMARY KEY(id,name):聯合主鍵索引
    • UNIQUE(id,name):聯合惟一索引
    • INDEX(id,name):聯合普通索引
相關文章
相關標籤/搜索