mysql 总结
mysqld --initialize-insecure 初始化
mysql -u root -p 啟動一個客戶端并且連接MySQL服務器
mysqld(路徑) --install 安裝window服務
mysqld --remove 移除window服務
net start mysql : 開啟服務端
net stop mysql :關閉服務端
忘記密碼的解決方案
先關閉掉之前的mysql服務器的進程
查看進程號:tasklist |findstr mysql
殺死進程:taskkill /F /PID 進程號
跳過授權表開啟mysql的服務端 mysqld --skip-grant-tables (開啟服務端的 約束條件跳過授權)
客戶端連接 mysql -uroot -p
更改密碼:update mysql.user set authentication_string =password('') where User='root';
刷新權限 flush privileges;
select user();查看當前用戶
C:\Users\mjj>mysqladmin -uroot -p password "123" 設置初始密碼 由于原密碼為空,因此-p可以
不用 注意這句話不起作用,請使用
update mysql.user set authentication_string =password('') where User='root';
C:\Users\mjj>mysqladmin -uroot -p"123" password "456"
修改mysql密碼,因為已經有密碼了,所以必須輸入原密碼才能設置新密碼
create user 'mjj'@'192.118.1.1' identified by '123';創建用戶和密碼
drop user '用戶名'@'IP地址'; 刪除用戶
rename user '用戶名'@'IP地址' to '新用戶名'@'IP地址';修改用戶
set password for '用戶名'@'IP地址'=Password('新密碼');修改密碼
SELECT User FROM mysql.user; 查看所有用戶
select * from mysql.user where user='laodage' \G 查看某個用戶權限
show grants for '用戶'@'IP地址' 查看權限
grant select ,insert,update on db1.t1 to "mjj"@'%'; 授權 mjj用戶僅對db1.t1文件有查詢、插入和更新的操作
grant all privileges on db1.t1 to "mjj"@'%';
表示有所有的權限,除了grant這個命令,這個命令是root才有的。mjj用戶對db1下的t1文件有任意操作
grant all privileges on db1.* to "mjj"@'%'; mjj用戶對db1數據庫中的文件執行任何操作
grant all privileges on *.* to "mjj"@'%'; mjj用戶對所有數據庫中文件有任何操作
revoke all on db1.t1 from 'mjj'@"%"; 取消mjj用戶對db1的t1文件的任意操作
revoke all on db1.* from 'mjj'@"%"; 取消來自遠程服務器的mjj用戶對數據庫db1的所有表的所有權限
revoke all privileges on *.* from 'mjj'@'%'; 取消來自遠程服務器的mjj用戶所有數據庫的所有的表的權限
SQL語言主要用于存取數據、查詢數據、更新數據和管理關系數據庫系統,SQL語言由IBM開發。SQL語言分為3種類型:
1、DDL語句 數據庫定義語言: 數據庫、表、視圖、索引、存儲過程,例如CREATE DROP ALTER
2、DML語句 數據庫操縱語言: 插入數據INSERT、刪除數據DELETE、更新數據UPDATE、查詢數據SELECT
3、DCL語句 數據庫控制語言: 例如控制用戶的訪問權限GRANT、REVOKE
sql 命令
information_schema: 虛擬庫,不占用磁盤空間,存儲的是數據庫啟動后的一些參數,如用戶表信息、
列信息、權限信息、字符信息等
performance_schema: MySQL 5.5開始新增一個數據庫:主要用于收集數據庫服務器性能參數,記錄處理查詢請求時發生的各種事件、鎖等現象
mysql: 授權庫,主要存儲系統用戶的權限信息
test: MySQL數據庫系統自動創建的測試數據庫
mysql 支持的數據引擎
show engines\G; 查看所有支持的引擎
show variables like 'storage_engines%'; 查看正在使用的存儲引擎
InnoDB 存儲引擎 主要面向聯機事務處理(OLTP)的應用 特點是行鎖設計、支持外鍵,并支持類似 Oracle
的非鎖定讀,即默認讀取操作不會產生鎖。 從 MySQL 5.5.8 版本開始是默認的存儲引擎。
MyISAM 存儲引擎 不支持事務、表鎖設計、支持全文索引,主要面向一些 OLAP 數 據庫應用,在
MySQL 5.5.8 版本之前是默認的存儲引擎(除 Windows 版本外)。
NDB 存儲引擎 NDB 存儲引擎的特點是數據全部放在內存中(從 5.1 版本開始,可以將非索引數據
放在磁盤上),因此主鍵查找(primary key lookups)的速度極快
Memory 存儲引擎 ,Memory 存儲引擎中的數據都存放在內存中,數據庫重 啟或發生崩潰,表中的數據都將
消失。它非常適合于存儲 OLTP 數據庫應用中臨時數據的臨時表,也可以作為 OLAP 數據庫應用中數據倉
庫的維度表
Infobright 存儲引擎 第三方的存儲引擎。其特點是存儲是按照列而非行的,因此非常 適合 OLAP 的數據庫
應用
NTSE 存儲引擎 網易公司開發的面向其內部使用的存儲引擎。目前的版本不支持事務, 但提供壓縮、行級緩存等特性,不久的將來會實現面向內存的事務支持。
BLACKHOLE 黑洞存儲引擎,可以應用于主備復制中的分發主庫。
http://www.runoob.com/mysql/mysql-data-types.html
類型 大小 范圍(有符號) 范圍(無符號) 用途
TINYINT 1 字節 (-128,127) (0,255) 小整數值
SMALLINT 2 字節 (-32 768,32 767) (0,65 535) 大整數值
MEDIUMINT 3 字節 (-8 388 608,8 388 607) (0,16 777 215) 大整數值
INT或INTEGER 4 字節 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整數值
BIGINT 8 字節 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615)極大整數值
FLOAT 4 字節 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 單精度
浮點數值
DOUBLE 8 字節 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 雙精度浮點數值
DECIMAL 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 依賴于M和D的值 依賴于M和D的值 小數值
int類型后面的存儲是顯示寬度,而不是存儲寬度
常用的數據概括
數字:tinyint int bigint
小數:float :在位數比較短的情況下不精準
double:在位數比較長的情況下不精準
decimal:(如果用小數,則用推薦使用decimal) 精準 內部原理是以字符串的形式去存
字符串:
char(10):簡單粗暴,浪費空間,存取速度快 root root000000
barchar:精準,節省空間,存取速度慢
sql優化:創建表時,定長的類型往前放,變長的往后放
比如性別 比如地址或者描述信息
>255個字符,超了就吧文件路徑放在數據庫中
比如如片,視頻等,數據庫中只存路徑或者url
時間類型: 最常用 datetime
枚舉類型和集合類型:
enum和set
char 和 varchar
char填充空格來滿足固定長度,但是在查詢時卻會很不要臉地刪除尾部的空格
(裝作自己好像沒有浪費過空間一樣),然后修改sql_mode讓其現出原形。
create table t1(x char(5),y varchar(4)); 字段x 為char 類型, 字段y 位varchar類型
insert into t1 values('你瞅啥 ','你瞅啥 '); char 存放5個字符,varchar 存4個字符
select x,char_length(x),y,char_length(y) from t1;在檢索時char很不要臉地將自己浪費的2個字符給刪掉了,
裝的好像自己沒浪費過空間一樣,而varchar很老實,存了多少,就顯示多少
SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'; 改變sql的mode磨石
select @@sql_mode; 查看sql當前的mode模式
select x,char_length(x) y,char_length(y) from t1; 查看字符個數
length():查看字節數
char_length():查看字符數
create table t1(id int)engine=innodb; 指定表類型/存儲引擎 ,默認不寫就是innodb
show databases 查看所有數據庫
create database db1 創建數據庫
select database(); 查看所在庫
use 數據庫名 選擇數據庫
DROP DATABASE 數據庫名; 刪除數據庫
alter database db1 charset utf8; 修改數據庫
create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
);
create table a1(
id int,
name varchar(50),
age int(3)
); 創建表
insert into a1 values(1,'mjj',18),(2,'wusir',28); 插入表的記錄
desc 表名; 查看表的結構
show create table 表名\G; 查看表的詳細結構
create table 復制者的表名 select * from 被復制者的所屬數據庫.被復制者的表名; 復制表 結構和記錄
create table 復制者的表名 select * from 被復制者的所屬數據庫.被復制者的表名 where 1>5;
復制表,只復制結構 不復制記錄
create table 復制者的表名 like 被復制者的所屬數據庫.被復制者的表名; 只復制表結構 不復制記錄
drop table 表名; 刪除表
enum單選 只能在給定的范圍內選擇(多選一)
set 多選 在給定的范圍內可以選擇一個或一個以上的值(愛好1,愛好2,愛好3)
create table consumer(
-> id int,
-> name varchar(50),
-> sex enum('male','female','other'),
-> level enum('vip1','vip2','vip3','vip4'),#在指定范圍內,多選一
-> fav set('play','music','read','study') #在指定范圍內,多選多
-> );
insert into consumer values
-> (1,'趙云','male','vip2','read,study'),
-> (2,'趙云2','other','vip4','play');
完整性約束
not null 和 default
sex enum('male','female') not null default 'male' not null 不允許為空 默認值是'male' unsigned 必須為正直(無符號)
unique(不同的,單列唯一)
第一種創建 unique的方式
create table department(
id int,
name char(10) unique
);
第二種創建 unique的方式
create table department(
id int,
name char(10) ,
unique(id),
unique(name)
);
聯合唯一,只要兩列記錄,有一列不同,既符合聯合唯一的約束
create table services(
-> id int,
-> ip char(15),
-> port int,
-> unique(id),
-> unique(ip,port)
-> );
primary key (主鍵)
一個表可以,單列做主鍵,多列做主鍵(復合主鍵) 字段的值不為空且唯一
存儲引擎默認是(innodb):對于innodb存儲引擎來說,一張表必須有一個主鍵。
創建t14表,為id字段設置主鍵,唯一的不同的記錄
create table t14(
id int primary key,
name char(16)
);
not null + unique的化學反應,相當于給id設置primary key
create table t15(
id int not null unique,
name char(16)
);
auto_increment 自動增長
create table student(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') default 'male'
);
也可以指點id
insert into student values(4,'asb','female');
對于自增的字段,在用delete刪除后,再插入值,該字段仍按照刪除前的位置繼續增長
步長auto_increment,默認為1
起始的偏移量auto_increment_offset, 默認是1
設置步長 為會話設置,只在本次連接中有效
set session auto_increment_increment=5;
全局設置步長 都有效。
set global auto_increment_increment=5;
設置起始偏移量
set global auto_increment_offset=3;
查看可用的 開頭auto_inc的詞(查看步長和起始位置) 設置完步長需要重新登錄
show variables like 'auto_inc%';
清除表區 delete 和trucate 的區別
delete from t1; #如果有自增id,新增的數據,仍然是以刪除前的最后一樣作為起始。
truncate table t1;數據量大,刪除速度比上一條快,且直接從零開始。
foreign key 外鍵
先創建被關聯表,在創建關聯表
dep_id int,
constraint fk_dep foreign key(dep_id) references dep(id)
隨便起的 關聯表創建 被關聯表名(被關聯id)
on delete cascade 同步刪除
on update cascade 同步更新
因為有foreign key的約束 使得表形成了三種關系 多對一 多對多 一對一
單表查詢的語法
select 字段1,字段2... from 表名
where 條件
group by field
having 篩選
order by field
LIMIT 限制條數
關鍵字的執行優先級
from where group by having select distinct order by limit
where子句中可以使用
1.比較運算符:>、<、>=、<=、<>、!=
2.between 80 and 100 :值在80到100之間
3.in(80,90,100)值是10或20或30 not in
4.like 'xiaomagepattern': pattern可以是%或者_。%小時任意多字符,_表示一個字符
5.邏輯運算符:在多個條件直接可以使用邏輯運算符 and or not
group by 分組查詢
為何要分組呢?
取每個部門的最高工資
取每個部門的員工數
取男人數和女人數
小竅門:‘每’這個字后面的字段,就是我們分組的依據
由于沒有設置ONLY_FULL_GROUP_BY,于是也可以有結果,默認都是組內的第一條記錄,但其實這是沒有意義的
如果想分組,則必須要設置全局的sql的模式為ONLY_FULL_GROUP_BY
set global sql_mode='ONLY_FULL_GROUP_BY'; (設置成功后,退出登錄方可生效)
通過group by分組之后,只能查看當前字段,如果想查看組內信息,需要借助于聚合函數
select post from employee group by post;
聚合函數
max()求最大值 min()求最小值 avg()求平均值sum() 求和 count() 求總個數
having 過濾
HAVING與WHERE不一樣的地方在于
執行優先級從高到低:where > group by > having
1. Where 發生在分組group by之前,因而Where中可以有任意字段,但是絕對不能使用聚合函數。
2. Having發生在分組group by之后,因而Having中可以使用分組的字段,無法直接取到其他字段,可以使用聚合函數
order by 查詢排序
SELECT * FROM employee ORDER BY age;
SELECT * FROM employee ORDER BY age ASC;
SELECT * FROM employee ORDER BY age DESC;
limit 限制查詢的記錄數:
默認初始位置為0
LIMIT 0,5; #從第0開始,即先查詢出第一條,然后包含這一條在內往后查5條
LIMIT 5,5; #從第5開始,即先查詢出第6條,然后包含這一條在內往后查5條
多表查詢
外鏈接查詢語法
select 字段列表
from 表1 inner|left|right join 表2
on 表1字段 = 表2.字段
交叉鏈接 不適用任何匹配條件 生成笛卡爾積
內連接:只連接匹配的行 找兩張表共有的部分,相當于利用條件從笛卡爾積結果中篩選出了匹配的結果
select employee.id,employee.name,employee.age,employee.sex,department.name from employee
inner join department on employee.dep_id=department.id;
等同于
select employee.id,employee.name,employee.age,employee.sex,department.name from
employee,department where employee.dep_id=department.id;
外鏈接之左鏈接 : 優先顯示左表全部記錄
以左表為準,即找出所有員工信息,當然包括沒有部門的員工
本質就是:在內連接的基礎上增加左邊有,右邊沒有的結果
select employee.id,employee.name,department.name as depart_name from employee left join
department on employee.dep_id=department.id;
外鏈接之右鏈接:優先顯示右表全部記錄
以右表為準,即找出所有部門信息,包括沒有員工的部門
本質就是:在內連接的基礎上增加右邊有,左邊沒有的結果
select employee.id,employee.name,department.name as depart_name from employee right join
department on employee.dep_id=department.id;
全外連接:顯示左右兩個表全部記錄(了解)
外連接:在內連接的基礎上增加左邊有右邊沒有的和右邊有左邊沒有的結果
注意:mysql不支持全外連接 full JOIN
強調:mysql可以使用此種方式間接實現全外連接
語法:select * from employee left join department on employee.dep_id = department.id
union all
select * from employee right join department on employee.dep_id = department.id;
mysql> select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id
;
#注意 union與union all的區別:union會去掉相同的紀錄
符合條件鏈接查詢
以內連接的方式查詢employee和department表,并且employee表中的age字段值必須大于25,
即找出年齡大于25歲的員工以及員工所在的部門
select employee.name,department.name from employee inner join department
on employee.dep_id = department.id
where age > 25;
以內連接的方式查詢employee和department表,并且以age字段的升序方式顯示。
select employee.id,employee.name,employee.age,department.name from employee,department
where employee.dep_id = department.id
and age > 25
order by age asc;
子查詢
1,帶in關鍵字的子查詢
查詢平均年齡在25歲以上的部門名
select id,name from department
where id in
(select dep_id from employee group by dep_id having avg(age) > 25);
2.帶比較運算符的子查詢
帶比較運算符的子查詢
復制代碼
#比較運算符:=、!=、>、>=、<、<=、<>
#查詢大于所有人平均年齡的員工名與年齡
mysql> select name,age from employee where age > (select avg(age) from employee);s
3.帶exists 關鍵字的子查詢
EXISTS關字鍵字表示存在。在使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。而是返回一個真假值。True或False
當返回True時,外層查詢語句將進行查詢;當返回值為False時,外層查詢語句不進行查詢
select * from employee where exists (select id from department where id=200);
?
轉載于:https://www.cnblogs.com/xintiao-/p/9837146.html
總結
- 上一篇: 021 设计模式之工厂方法模式,抽象工
- 下一篇: C#字典Dictionary排序(顺序、