主頁 > 資料庫 > MySQL基礎筆記整理

MySQL基礎筆記整理

2020-09-13 17:45:54 資料庫

MySQL安裝和啟動

Windows下安裝和啟動服務

下載地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads

安裝

1 在MySQL官網下載zip檔案,

img

2 在任意位置保存解壓,這里在E盤創建MySQL目錄

E:\MySQL\

3 E:\Monkey\mysql-5.7.16-winx64\目錄創建data目錄,

4 在命令列運行E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld --initialize-insecure進行mysql服務端初始化,默認的創建了root用戶 密碼為空

配置和啟動

1 啟動服務端:E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld

2 啟動客戶端:E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysql -uroot -p # 密碼為空

3 執行show databases;

結果如下:

img

4 添加環境變數,把E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin添加到Windows的環境變數(添加環境變數:https://jingyan.baidu.com/article/47a29f24610740c0142399ea.html)

5 Windows服務:

注冊:

E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld --install
注冊之后可以用 "net start MySQL" 啟動服務 "net stop MySQL"停止服務

移除:

E:\MySQL\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin\mysqld --remove

Linux 下安裝和啟動服務

yum安裝

yum list installed |grep mysql  

//若Linux自帶mysql,將其卸載
yum -y remove mysql-libs.x86_64

在官網下載yum包 url:https://dev.mysql.com/downloads/repo/yum/
yum localinstall mysql57-community-release-el6-11.noarch.rpm

yum repolist enabled |grep "mysql.*-community.*"  # 看是否成功添加yum倉庫

yum install mysql-community-server    # 安裝

service mysqld start    # 啟動

Starting mysqld:[ OK ]  # 表示安裝成功

原始碼安裝

安裝編譯原始碼所需的包

 yum -y install make gcc-c++ cmake bison-devel  ncurses-devel

之后下載并解包檔案

wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.14.tar.gz
tar xvf mysql-5.6.14.tar.gz

編譯安裝

cd mysql-5.6.14
cmake .

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci

make && make install

MySQL的初始化

cd /usr/local/mysql
scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

注意:在/etc目錄下會存在一個my.cnf,需要將此檔案更名為其他的名字,如:/etc/my.cnf.bak,否則,該檔案會干擾原始碼安裝的MySQL的正確配置,造成無法啟動,

注冊為系統服務:

cd /usr/local/mysql/support-files

cp mysql.server /etc/rc.d/init.d/mysql   # 注冊服務

cp my-default.cnf /etc/my.cnf    # 使用默認組態檔

服務啟動:

service mysql start 

  

MySQL之SQL基礎陳述句

資料庫相關

MySQL啟動后

連接資料庫:

mysql -uroot -ppassword    # u 后面跟用戶名 p 后面是密碼

查看資料庫:

show databases;

使用資料庫:

use databases;

查看資料庫中所有表:

show tables; 

創建資料庫:(create database + 資料庫名)

create database test_db_name

洗掉資料庫:(drop database + 資料庫名)

drop database dbname;

用戶相關

創建用戶:

create user 'monkey’@'192.168.2.2’ identified by 'passwod’;
# 創建名為 ‘monkey’ 密碼為’password’ 登陸IP只能為:192.168.2.2 的用戶

create user 'monkey’@'192.168.2.%' identified by 'password’;
# 創建名為 ‘monkey’ 密碼為’password’ 登陸IP為:192.168.2 網段的用戶

create user 'monkey’@'%' identified by 'password’;
# 創建名為 ‘monkey’ 密碼為’password’ 登陸IP不限的用戶

對用戶進行授權:

grant select,insert,update  on test_db_name.table1 to 'monkey’@'%';
# 對 monkey 用戶 開放資料庫:test_db_name 下表:table1 的查 插 更新的權限

grant all privileges  on test_db_name.table1 to 'monkey’@'%';
# 對 monkey 用戶 開放資料庫:test_db_name 下表:table1 的所有權限

revoke all privileges  on test_db_name.table1 from 'monkey’@'%';			  
# 取消權限

關于用戶:

在mysql資料庫下的user表,這張表存放著用戶的資訊

use mysql;
select user,Host from user;

  img

對用戶的操作也可以修改這張表,但是不建議這樣做!

資料表相關

資料的欄位型別

數值型

型別 大小 范圍(有符號) 范圍(無符號) 用途
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) 雙精度 浮點數值

字串型別

型別 大小 用途
CHAR 0-255位元組 定長字串
VARCHAR 0-65535 位元組 變長字串
TINYBLOB 0-255位元組 不超過 255 個字符的二進制字串
TINYTEXT 0-255位元組 短文本字串
BLOB 0-65 535位元組 二進制形式的長文本資料
TEXT 0-65 535位元組 長文本資料
MEDIUMBLOB 0-16 777 215位元組 二進制形式的中等長度文本資料
MEDIUMTEXT 0-16 777 215位元組 中等長度文本資料
LONGBLOB 0-4 294 967 295位元組 二進制形式的極大文本資料
LONGTEXT 0-4 294 967 295位元組 極大文本資料

日和期時間型別

型別 大小 范圍 格式 用途
DATE 3位元組 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3位元組 '-838:59:59'/'838:59:59' HH:MM:SS 時間值或持續時間
YEAR 1位元組 1901/2155 YYYY 年份值
DATETIME 8位元組 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和時間值
TIMESTAMP 4位元組 1970-01-01 00:00:00/2038結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和時間值,時間戳

資料表的創建和增加

創建表:

create table tablename(
				id int auto_increment primary key,
				name varchar(32),
				age int
			)engine=innodb default charset=utf8;

其中 語法:create table +tablename(列名1 型別 其他,

                 列名2 型別 其他 ) engine = innodb default charset=utf-8

engine 指明資料庫建表引擎為 innodb (支持事務操作),

myisam 不支持事務,

default charset=utf-8 指明資料表的編碼字符集 為 utf-8,

在表中添加資料(三種)

insert into tablename(name,age) values('monkey’,18);
			
insert into tablename(name,age) values('JIAJIA’,18),('xiaoliu’,18);
# 可以跟多條記錄,一元組的形式添加
			
insert into tablename(name,age) select name,age from tablename2;
# 從別的表查找資料 寫入 

洗掉表中資料不洗掉表(三種):

delete from tablename;    # 洗掉資料,但是自增計數不會被洗掉 單純的清掉資料
truncate table tablename;    # 清空表,相當于新的表 自增計數 0
delete from tb1 where id > 10    # 跟條件

洗掉表:

drop table tablename;    # 洗掉表 

表中插入資料:

insert into t1(id,name) values(100,'monkey’);

修改資料

update tablename set age=1024;
update tablename set age=2048 where age=18;

查看資料

select * from tablename; # 查看表的所有行列
select  name,age from tablename;    # 查看name和age 列

外鍵

create table tablename1(id int auto_increment primary key ,
name char(32));

create table tablename2(id int auto_increment primary key ,
name char(32),
friend_id int,
constraint fk_t1_t2 foreign key (friend_id) references tablename1(id));

  外鍵的創建:定義表的列時預料外鍵欄位,之后 constraint fk_t1_t2 foreign key (friend_id) references tablename1(id)); constaint ... foreign key 預留欄位名 references 被關聯表名(欄位名)

表的補充

desc t;    # 查看t 的表結構
		
show create table t;    # 查看創建t的創建陳述句
		
show create table t \G;    # 橫向查看
		
alter table t10 AUTO_INCREMENT=10000;    # 設定自增的起始值
			

MySQL的自增問題

自增的起始值:

alter table t10 AUTO_INCREMENT=10000;    # 設定自增的起始值

MySQL: 自增步長
基于會話級別:

show session variables like 'auto_inc%';	查看全域變數
set session auto_increment_increment=2; 設定會話步長
# set session auto_increment_offset=10;

基于全域級別:

show global variables like 'auto_inc%';	查看全域變數
set global auto_increment_increment=2; 設定會話步長
# set global auto_increment_offset=10;

SqlServer:自增步長:

基于表級別:

CREATE TABLE `table1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
) ENGINE=InnoDB AUTO_INCREMENT=3, 步長=2 DEFAULT CHARSET=utf8
# 自增起始值為 3 步長為 2

CREATE TABLE `table2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
) ENGINE=InnoDB AUTO_INCREMENT=9, 步長=3 DEFAULT CHARSET=utf8
# 自增起始值為 9 步長為 3

約束與索引

三種約束關系

一對多約束

外鍵約束本身就實作了一對多的約束

create table tablename1(id int auto_increment primary key ,
name char(32));

create table tablename2(id int auto_increment primary key ,
name char(32),
friend_id int,
constraint fk_t1_t2 foreign key (friend_id) references tablename1(id));

一對一約束

實作一對一約束 外鍵 加 唯一索引

create table class(id int auto_increment primary key ,
name char(32));

create table teacher(id int auto_increment primary key ,
name char(32),
class_id int,
unique (class_id),
constraint fk_class_teacher foreign key (class_id) references class(id));

多對多約束

通過一張關系表和外鍵約束建立多對多的映射關系

create table class(id int auto_increment primary key ,
name char(32));

create table student(id int auto_increment primary key ,
name char(32),
class_id int);

create table student_class_relation(id int auto_increment primary key ,
student_id int,
class_id int,
constraint fk_relation_class foreign key (class_id)references class(id),
constraint fk_relation_student foreign key (student_id)references student(id));

主鍵外鍵唯一約束

所有的索引都有一個共有的作用:加速查找

主鍵:


主鍵約束即在表中定義一個主鍵來唯一確定表中每一行資料的識別符號,主鍵可以是表中的某一列或者多列的組合,其中由多列組合的主鍵稱為復合主鍵,主鍵應該遵守下面的規則:

      • 每個表只能定義一個主鍵,
      • 主鍵值必須唯一標識表中的每一行,且不能為 NULL,即表中不可能存在兩行資料有相同的主鍵值,這是唯一性原則,
      • 一個列名只能在復合主鍵串列中出現一次,
      • 復合主鍵不能包含不必要的多余列,當把復合主鍵的某一列洗掉后,如果剩下的列構成的主鍵仍然滿足唯一性原則,那么這個復合主鍵是不正確的,這是最小化原則,

主鍵宣告的兩種方式

1、直接在定義欄位的時候宣告為主鍵,但是這樣只能宣告單一欄位為主鍵無法宣告 復合主鍵, 

create table class(id int auto_increment primary key , 
name char(32));

2、在欄位定義全部結束之后宣告主鍵,這樣既可以宣告單一的主鍵,也可以宣告為 復合主鍵,

create table person(name char(32) not null,
part char(32) not null ,
company char(32) not null ,
primary key (part,company,name));

聯合主鍵

當建立多對多關系的兩個表,通過關系表來唯一確定關系的時候,關系表的主鍵稱為 聯合主鍵,

例如: 多對多示例中的

student_class_relation 表中的 id int auto_increment primary key 欄位,

創建表后修改主鍵約束

create table user(id int, name char(32), sex char(4));
# 創建 user表 包含 id name sex 三個欄位 沒有主鍵

# 添加主鍵
alter table user add primary key(id);     # 將id欄位設定為主鍵

# 修改主鍵
alter table user drop primary key,add primary key(name);    # 洗掉原主鍵 將name設定為新的主鍵

# 將主鍵改為 復合主鍵
alter table username drop primary key,add primary key(id,name);  # 主鍵改為id 和 name的聯合主鍵

外鍵:


主表和從表:

主表(父表):對于兩個具有關聯關系的表而言,相關聯欄位中主鍵所在的表就是主表,

從表(子表):對于兩個具有關聯關系的表而言,相關聯欄位中外鍵所在的表就是從表,

      • 父表必須已經存在于資料庫中,或者是當前正在創建的表,如果是后一種情況,則父表與子表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照完整性,
      • 必須為父表定義主鍵,
      • 主鍵不能包含空值,但允許在外鍵中出現空值,也就是說,只要外鍵的每個非空值出現在指定的主鍵中,這個外鍵的內容就是正確的,
      • 在父表的表名后面指定列名或列名的組合,這個列或列的組合必須是父表的主鍵或候選鍵,
      • 外鍵中列的數目必須和父表的主鍵中列的數目相同,
      • 外鍵中列的資料型別必須和父表主鍵中對應列的資料型別相同,

外鍵的宣告:

    定義時宣告本篇上述 一對多對應關系

創建表后修改外鍵:

alter table <資料表名> add constraint <索引名>
foreign key(<列名>) refrences <主表名> (<列名>);

alter table user add part_id int;    # 為user表添加 part_id列 作為外鍵
alter table user add constraint fk_part_user foreign key(part_id) references part(id);     # 為user表添加外鍵約束

唯一約束


      • 唯一約束也叫唯一索引,MySQL唯一約束(Unique Key)要求該列唯一,允許為空,但只能出現一個空值,唯一約束可以確保一列或者幾列不出現重復值,
      • 唯一約束允許為空,但是不允許有重復,主鍵約束不允許為空,不允許重復,
      • 唯一約束可以對多個欄位設定,聯合唯一索引,
      • 注意 唯一索引中的空值允許重復,即可以有多個空值記錄存在,

宣告唯一約束的兩種方式:

1、在定義欄位時宣告,這樣的方式像宣告主鍵一樣,同樣的無法宣告聯合唯一,

create table unique_table0(name char(32) unique ,
company char(32);

2、在欄位宣告全部結束的時候單獨的宣告唯一索引,這樣可以宣告成多個欄位的唯一索引 即聯合唯一索引,

create table unique_table1(name char(32) ,
part char(32) ,
company char(32) ,
unique (part,company,name));

***創建表后修改唯一約束:*

**

*創建唯一約束:*

create table t1(id int, name char(32));

# way 1:  alter table '資料表名' add  constraint '索引名'  unique(‘要添加的欄位名’);
alter table t1 add  constraint unique_id_name unique(id,name);

# way 2:  create unique index 索引名 on 資料表名(欄位名);
create unique index unique_id_name unique(id,name);

*洗掉唯一約束*

# way 1:  alter table 資料表名 drop index 洗掉的索引名;
alter table t1 drop index unique_id_name;

# way 2:  drop index 索引名 on 資料表名;
drop index unique_id_name on t1;

索引

索引的詳細介紹戳這里url:

普通索引

  普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對資料的訪問速度,因此,應該只為那些最經常出現在查詢條件(WHERE column = …)或排序條件(ORDER BY column)中的資料列創建索引,只要有可能,就應該選擇一個資料最整齊、最緊湊的資料列(如一個整數型別的資料列)來創建索引,

索引的通用方法

# 查看索引
show index from table_name;
# 其中 Key_name 欄位為索引名

# 洗掉索引 
drop index index_name on table_name;

普通索引方法

–直接創建索引(length表示使用名稱前1ength個字符)  
CREATE INDEX index_name ON table_name(column_name(length))  
–修改表結構的方式添加索引  
ALTER TABLE table_name ADD INDEX index_name ON (column_name)  
–創建表的時候同時創建索引  
CREATE TABLE table_name (  
id int(11) NOT NULL AUTO_INCREMENT ,  
title char(255) NOT NULL ,  
PRIMARY KEY (id),  
INDEX index_name (title)  
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;   
建立復合索引 ,  
CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);  
  注意命名時的習慣了嗎?使用“表名欄位1名欄位2名”的方式  

唯一索引

  唯一索引就是唯一約束,與普通索引類似,除索引列的值必須唯一外跟普通索引無異,創建方法和普通索引類似,也就是說唯一約束的創建方式也可以由索引的創建方式創建,

  唯一索引簡化了MySQL對這個索引的管理作業,這個索引也因此而變得更有效率,

  唯一索引是MySQL會在有新記錄插入資料表時,自動檢查新記錄的這個欄位的值是否已經在某個記錄的這個欄位里出現過了,

主鍵索引

  必須為主鍵欄位創建一個索引,這個索引就是所謂的”主索引”,主索引與唯一索引的唯一區別是:前者在定義時使用的關鍵字是PRIMARY而不是UNIQUE,

外鍵索引

  如果為某個外鍵欄位定義了一個外鍵約束條件,MySQL就會定義一個內部索引來幫助自己以最有效率的方式去管理和使用外鍵約束條件,

全文索引

  MySQL從3.23.23版開始支持全文索引和全文檢索,fulltext索引僅可用于 MyISAM 表;他們可以從CHAR、VARCHAR或TEXT列中作為CREATE TABLE陳述句的一部分被創建,或是隨后使用ALTER TABLE 或CREATE INDEX被添加,////對于較大的資料集,將你的資料輸入一個沒有FULLTEXT索引的表中,然后創建索引,其速度比把資料輸入現有FULLTEXT索引的速度更為快,不過切記對于大容量的資料表,生成全文索引是一個非常消耗時間非常消耗硬碟空間的做法,
文本欄位上的普通索引只能加快對出現在欄位內容最前面的字串(也就是欄位內容開頭的字符)進行檢索操作,如果欄位里存放的是由幾個、甚至是多個單詞構成的較大段文字,普通索引就沒什么作用了,這種檢索往往以LIKE %word%的形式出現,這對MySQL來說很復雜,如果需要處理的資料量很大,回應時間就會很長,
  這類場合正是全文索引(full-text index)可以大顯身手的地方,在生成這種型別的索引時,MySQL將把在文本中出現的所有單詞創建為一份清單,查詢操作將根據這份清單去檢索有關的資料記錄,全文索引即可以隨資料表一同創建,也可以等日后有必要時再使用下面這條命令添加:
  ALTER TABLE table_name ADD FULLTEXT(column1, column2)
  有了全文索引,就可以用SELECT查詢命令去檢索那些包含著一個或多個給定單詞的資料記錄了,下面是這類查詢命令的基本語法:
  SELECT * FROM table_name
  WHERE MATCH(column1, column2) AGAINST(‘word1’, ‘word2’, ‘word3’)
  上面這條命令將把column1和column2欄位里有word1、word2和word3的資料記錄全部查詢出來,

–創建表的適合添加全文索引  
CREATE TABLE table_name (  
id int(11) NOT NULL AUTO_INCREMENT ,  
content text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,  
PRIMARY KEY (id),  
FULLTEXT (content)  
);  
–修改表結構添加全文索引  
ALTER TABLE table_name ADD FULLTEXT index_name(column_name)  
–直接創建索引  
CREATE FULLTEXT INDEX index_name ON table_name (column_name)  

單列、多列索引

  多個單列索引與單個多列索引的查詢效果不同,因為執行查詢時,MySQL只能使用一個索引,會從多個索引中選擇一個限制最為嚴格的索引,

組合(復合)索引

  平時用的SQL查詢陳述句一般都有比較多的限制條件,所以為了進一步榨取MySQL的效率,就要考慮建立組合索引,例如上表中針對title和time建立一個組合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10)),建立這樣的組合索引,其實是相當于分別建立了下面兩組組合索引:
–title,time
–title
為什么沒有time這樣的組合索引呢?這是因為MySQL組合索引“最左前綴”的結果,簡單的理解就是只從最左面的開始組合,并不是只要包含這兩列的查詢都會用到該組合索引,如下面的幾個SQL所示
–使用到上面的索引
SELECT * FROM article WHREE title=’測驗’ AND time=1234567890;
SELECT * FROM article WHREE title=’測驗’;
–不使用上面的索引
SELECT * FROM article WHREE time=1234567890;

SQL高級查找

條件查詢

排序 order by

select * form table_name order by id desc    # 從大到小
select * form table_name order by id asc    # 從小到大

限制 limit

select * form table_name order by id asc limit 10    # 取查詢結果的前10條

select * form table_name order by id asc limit 20,10    # 取查詢結果從第20條開始 往后查10條

select * form table_name order by id asc limit 10 offset 20   # 取查詢結果從第20條開始 往后查10條

模糊查尋 like

%表示任意長度的字符 _表示單字符

select * from table_name where name like "張%"    # 以張開頭的

select * from table_name where name like "%張%"    # 包含張的

select * from table_name where name like "%張"    # 以張結尾的

select * from table_name where name like "張_"    # 以張開頭的 兩個字的  

select * from table_name where name like "_浩_%"    # 三個字的 并且中間是 浩 的 

日期查詢

select * form table_name where date_key between '2019-10-10' and '2019-10-10';

MySQL比較運算子

比較運算子 說明
= 等于
< 小于
<= 小于等于
> 大于
>= 大于等于
<=> 安全的等于,不會回傳 UNKNOWN
<> 或!= 不等于
IS NULL 或 ISNULL 判斷一個值是否為 NULL
IS NOT NULL 判斷一個值是否不為 NULL
LEAST 當有兩個或多個引數時,回傳最小值
GREATEST 當有兩個或多個引數時,回傳最大值
BETWEEN AND 判斷一個值是否落在兩個值之間
IN 判斷一個值是IN串列中的任意一個值
NOT IN 判斷一個值不是IN串列中的任意一個值
LIKE 通配符匹配
REGEXP 正則運算式匹配

分組聚合

聚合函式:

sum() 求和

avg() 求平均(期望)

max() 最大值

min() 最小值

conut() 計數(求有多少個記錄)

對聚合函式的結果進行二次篩選的時候,條件 應該跟在having后 而不是 where 后面,

創建表:part 并插入資料:

create table part(id int,
name char(32));

img

創建表:person 并插入資料:

create table person(name char(32),
part_id int,
constraint fk_part_person foreign key(part_id) references part(id));

img

select part_id,count(part_id) from person group by(part_id);

img

內鏈接查詢

select * from person,part where part.id = person.part_id;  # 有時候性能可能會不如下面 
select * from person inner join part on part.id = person.part_id;  # 性能可能會更好一些

注意 使用 where 子句定義連接條件比較簡單明了,而 inner join 語法是 ANSI SQL 的標準規范,使用 inner join 連接語法能夠確保不會忘記連接條件,而且 where 子句在某些時候會影響查詢的性能,

外鏈接查詢

select * from person left join part on part.id = person.part_id; 

select * from person right join part on part.id = person.part_id;  

注意 關于 left 和 right :兩張表 連表查詢,left 就是left 左邊的表呃記錄要全部顯示出來 right 就是 right 右邊的表要全部現實出來

分組聚合查詢

每個部門有多少個人:

select part.name,count(person.name) from person left join part on part.id = person.part_id group by(part.name);

img

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26183.html

標籤:MySQL

上一篇:有個問題困擾很久,求大神解答

下一篇:MySQL 字符集和校驗規則作業原理

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more