MySQL 數據庫基礎命令

前言:mysql

我是一隻至關白的小白,這是個人第一篇博客,記錄學習的點滴.當中有些許我在課堂上記錄的範例,若是發現疏漏錯誤的地方請指正,謝謝各位大神sql

注意點:

  • SQL語句不區分大小寫
  • 若輸入命令時不當心換行,可繼續輸入至命令結束,並不影響執行結果
  • 命令一般以";"結尾

數據庫的基本操做

連接數據庫數據庫

mysql -uroot -p
mysql -uroot -p你的密碼  # 可直接追加明文密碼(不安全,不推薦)
複製代碼

退出數據庫安全

quit/exit/ctrl + d(快捷鍵)
複製代碼

顯示當前數據庫版本bash

select version();
複製代碼

顯示當前時間服務器

select now();
複製代碼

查看當前使用的數據庫函數

select database();
複製代碼

查看全部數據庫學習

show databases;
複製代碼

建立數據庫 create database 數據庫名 charset=utf8; (MySQL默認建立編碼爲latin1,爲方便轉碼需在建立數據庫時指定編碼 charset=utf8 )ui

create database xxxx charset=utf8;
複製代碼

查看建立數據庫的語句 show create database 數據庫名編碼

show create database xxxx;
複製代碼

使用數據庫 use 數據庫的名字 可以使用該命令直接跳轉數據庫

use xxxx;
複製代碼

從sql文件中導入數據 source 具體地址/areas.sql;

source xxx.sql;
複製代碼

刪除數據庫 drop database 數據庫名; 注:若數據庫名稱中包含符號"-",則刪除時需在數據庫名稱上包裹``符號(鍵盤Tab鍵上方)

drop database `xxxx-xxxx`;
drop database xxxx;
複製代碼

數據表的操做

  • 注:在操做數據表以前須要先進入此數據表所在的數據庫
  • 參考 "數據庫的基本操做" 中命令 "使用數據庫"

查看當前數據庫中全部表

show tables;
複製代碼

  • 數據類型 數據類型是指在建立表的時候爲表中字段指定數據類型,只有數據符合類型要求才能存儲起來, 使用數據類型的原則是:夠用就行,儘可能使用取值範圍小的,而不用大的,這樣能夠更多的節省存儲空間。

    經常使用數據類型以下:

    整數:int,bit 小數:decimal 字符串:varchar,char 日期時間: date, time, datetime 枚舉類型(enum)

    數據類型說明:

    decimal表示浮點數,如 decimal(5, 2) 表示共存5位數,小數佔 2 位. char表示固定長度的字符串,如char(3),若是填充'ab'時會補一個空格爲'ab ',3表示字符數 varchar表示可變長度的字符串,如varchar(3),填充'ab'時就會存儲'ab',3表示字符數 對於圖片、音頻、視頻等文件,不存儲在數據庫中,而是上傳到某個服務器上,而後在表中存儲這個文件的保存路徑. 字符串 text 表示存儲大文本,當字符大於 4000 時推薦使用, 好比技術博客.

  • 數據約束 約束是指數據在數據類型限定的基礎上額外增長的要求.

    常見的約束以下:

    主鍵 primary key: 物理上存儲的順序. MySQL 建議全部表的主鍵字段都叫 id, 類型爲 int unsigned(無符號整形,即爲正數),建立主鍵時一般加上 auto_increment 表示自動增加. 非空 not null: 此字段不容許填寫空值. 唯一 unique: 此字段的值不容許重複. 默認 default: 當不填寫字段對應的值會使用默認值,若是填寫時以填寫爲準. 外鍵 foreign key: 對關係字段進行約束, 當爲關係字段填寫值時, 會到關聯的表中查詢此值是否存在, 若是存在則填寫成功, 若是不存在則填寫失敗並拋出異常.

建立表 create table 數據表名字 (字段 類型 約束,字段 類型 約束)

create table xxxx(xxxx varchar(30) not null,xxxx int unsigned);
複製代碼

查看錶結構 desc 數據表的名字;

desc xxxx;
複製代碼

範例:建立 students 表(id、name、age、high、gender、cls_id、is_delete)

create table students(
id int unsigned primary key auto_increment not null,
name varchar(20) default '',
age tinyint unsigned default 0,   tinyint 表示字節大小爲 -128~127 或 0~255
height decimal(5,2),
gender enum('男','女','中性','保密') default '保密',
cls_id int unsigned default 0,
is_delete bit default 0);
複製代碼

查看錶的建立語句(可查看主鍵、引擎InnoDB等、自動增加變量、編碼等信息) show create table 表名字;

show create table students;
複製代碼

修改表-添加字段 alter table 表名 add 列名 類型;

alter table students add birthday datetime;
複製代碼

修改表-修改字段:不可重命名,僅修改類型及約束 alter table 表名 modify 列名 類型及約束;

alter table students modify birthday date not null;
複製代碼

修改表-修改字段:可重命名,表名、類型、約束都可修改 alter table 表名 change 原名 新名 類型及約束;

alter table students change birthday hobby varchar(30) default "你猜";
複製代碼

修改表-刪除字段 alter table 表名 drop 列名;

alter table students drop hobby;
複製代碼

刪除表 drop table 表名;

drop table xxxx;
複製代碼

刪除數據庫 drop database 數據庫;

drop database xxxx;
複製代碼

增刪改查(curd)

curd 的解釋: 建立 Create , 更新 Update , 讀取 Retrieve , 刪除 Delete

增長

模擬樣表(僅供理解)

| Field  | Type                                | Null | Key | Default | Extra          |
| id     | int(10) unsigned                    | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20)                         | NO   |     | NULL    |                |
| age    | int(10) unsigned                    | YES  |     | NULL    |                |
| high   | decimal(3,2)                        | YES  |     | NULL    |                |
| gender | enum('男','女','保密')               |  YES |     | 保密    |                |
| cls_id | int(11)                             | YES  |     | NULL    |                |
複製代碼

全列插入 insert [into] 表名(字段...) values(...) 主鍵字段 能夠用 0 null default 來佔位

insert into students values(0,'吳彥祖','25','1.85','男','66');   -- 此插入需保證插入值數與字段數一致
insert into students values(null,'吳彥祖','25','1.85','男','66');
insert into students values(default,'吳彥祖','25','1.85','男','66');
複製代碼

枚舉中的下標從 1 開始 1->'男' 2->'女' ....

insert into students values(default,'吳彥祖','25','1.85',1,'66');
複製代碼

部分插入

insert into students(name,gender) values("蔡徐坤",2);
複製代碼

一次插入多條數據

insert into students(name) values("吳亦凡"),("張藝興");
insert into students values(default,'吳彥祖','25','1.85','男','66'),
(default,'蔡徐坤','18','2.50',2,'99');	
複製代碼

修改

update 表名 set 列1=值1,列2=值2... where 條件; 所有修改

update students set name = 'CXK';
複製代碼

按條件修改

update students set name = "CXK" where id = 3;
複製代碼

按條件修改多個值

update students set name = 'CXK',age = 20 where id = 2;
複製代碼

查詢

查詢全部列 select * from 表名;

select * from students;
複製代碼

定條件查詢 select * from students where id < 6;

select * from students where name = "CXK";
複製代碼

查詢指定列 select 列1,列2,... from 表名;

select name,age from students;
複製代碼

可使用as爲列或表指定別名 select 字段[as 別名] , 字段[as 別名] from 數據表;

select name as 姓名,age as 年齡 from students;
複製代碼

字段的順序

select age,name from students;
複製代碼

刪除

物理刪除 delete from 表名 where 條件 delete from students -> 整個數據表中的全部數據所有刪除

delete from students where id = 3;
複製代碼

邏輯刪除 用一個字段來表示 這條信息是否已經不能再使用了 給students表添加一個 is_delete 字段 bit 類型 alter table 表名 add 字段 類型 default 默認值;

alter table students add is_delete bit default 0;
update students set is_delete = 1 where id = 2;
複製代碼

查詢進階

查詢全部字段 select * from 表名;

select * from students;
複製代碼

查詢指定字段 select 列1,列2,... from 表名;

select name,age from students;
複製代碼

使用 as 給字段起別名 select 字段 as 名字.... from 表名;

select name as 姓名 from students;
複製代碼

select 表名.字段 .... from 表名;

select students.name from students;
複製代碼

能夠經過 as 給表起別名 select 別名.字段 .... from 表名 as 別名;

select s.name from students as s;
複製代碼

消除重複行(查性別) distinct 字段

select distinct gender from students;
複製代碼

條件查詢 比較運算符

= < <= != = <> select .... from 表名 where .....

查詢年紀大於18歲的信息

select * from students where age > 18;
複製代碼

一樣能夠查詢,並輸出對應信息(如下觸類旁通)

select id,name,gender from students where age > 18;
複製代碼

< 查詢年紀小於18歲的信息

select * from students where age < 18;
複製代碼

= <= 查詢小於或者等於18歲的信息

select * from students where age <= 18;
複製代碼

= 查詢年齡爲18歲的全部學生的名字

select * from students where age = 18;
複製代碼

!= 或者 <> 查詢年齡不爲18歲的全部學生的名字

select * from students where age != 18;
select * from students where age <> 18;
複製代碼

邏輯運算符

and 18和28之間的全部學生信息

select * from students where age > 18 and age < 28;
複製代碼

18歲以上的女性

select * from students where age > 18 and gender = '女';
複製代碼

or 18以上或者身高高過180(包含)以上

select * from students where age > 18 or height >= 180;
複製代碼

not 不在 18歲以上的女性 這個範圍內的信息 錯誤:select * from students where not age > 18 and gender = '女';

select * from students  where not (age > 18 and gender = '女');
複製代碼

模糊查詢(where name like 要查詢的數據) like % 替換任意個 _ 替換1個 查詢姓名中 以 "小" 開始的名字

select name from students where name like '小%';
複製代碼

查詢姓名中 有 "小" 全部的名字

select name from students where name like '%小%';
複製代碼

查詢有2個字的名字

select name from students where name like '__';
複製代碼

查詢有3個字的名字

select name from students where name like '___';
複製代碼

查詢至少有2個字的名字

select name from students where name like '__%';
複製代碼

rlike 正則 查詢以 周開始、倫結尾的姓名

select name from students where name rlike '^周.倫$*'
複製代碼

範圍查詢 in (1, 3, 8)表示在一個非連續的範圍內 查詢 年齡爲18或34的姓名

select * from students where age = 18 or age = 34;
select * from students where age in (18,34);
複製代碼

not in 不在非連續的範圍以內 年齡不是 18或34歲的信息

select * from students where age not in (18,34)
複製代碼

between ... and ...表示在一個連續的範圍內 查詢 年齡在18到34之間的的信息 包含兩端從小到大

select * from students where age between 18 and 34;
複製代碼

not between ... and ...表示不在一個連續的範圍內 查詢 年齡不在18到34之間的的信息

select * from students where age not between 18 and 34;
複製代碼

空判斷 判空is null 查詢身高爲空的信息

select * from students where height is null;
複製代碼

判非空is not null

select * from students where height is not null;
複製代碼

排序

order by 字段 默認 asc (升序) asc 從小到大排列,即升序 desc 從大到小排序,即降序

查詢年齡在18到34歲之間的男性,按照年齡從小到大到排序

select * from students where age > 18 and age < 34 
and gender = '男'  order by age asc;

select * from students where (age between 18 and 34) 
and gender = '男' order by age;
複製代碼

查詢年齡在18到34歲之間的女性,身高從高到矮排序

select * from students where (age between 18 and 34)
and gender = '女' order by height desc;
複製代碼

order by 多個字段 查詢年齡在18到34歲之間的女性,身高從高到矮排序, 若是身高相同的狀況下按照年齡從小到大排序

select * from students where (age between 18 and 34)
and gender = '女' order by height desc,age asc;
複製代碼

若是年齡也相同那麼按照id從大到小排序

select * from students where (age between 18 and 34)
and gender = '女' order by height desc,age asc,id desc;
複製代碼

聚合函數

總數 count 查詢男性有多少人

select count(*) from students where gender = '男';
複製代碼

最大值 max 查詢最大的年齡

select max(age) from students;
複製代碼

查詢女性的最高 身高

select max(height) from students where gender ='女';
複製代碼

最小值 min

select min(height) from students where gender = '男';
複製代碼

求和 sum 計算全部人的年齡總和

select sum(age) from  students;
複製代碼

平均值 avg 計算平均年齡

select avg(age) from students;
複製代碼

計算平均年齡 sum(age)/count(*)

select sum(age)/count(*) from students;
複製代碼

四捨五入 round(保留前的結果 , 1) 保留1位小數 拓展:小數後默認保留六位,若須要精確值可將值擴大10的次方倍數再進行存儲 如:3.1415 * 10^4 -> 存儲 計算全部人的平均年齡,保留2位小數

select round(avg(age),2) from students;
複製代碼

計算男性的平均身高 保留2位小數

select round(avg(height),2) from students where gender = '男';
複製代碼

分組

group by select 分組字段 from 表名 group by 分組字段; 按照性別分組,查詢全部的性別

select gender from students group by gender;
複製代碼

計算每種性別中的人數

select gender,count(*) from students group by gender;
複製代碼

計算男性的人數

select gender,count(*) from students where gender = '男' group by gender;
複製代碼

查詢每組性別的平均年齡

select gender,avg(age) from students group by gender;
複製代碼

group_concat(...) 查詢同種性別中的姓名 返回一組的姓名

select gender,group_concat(name) from students group by gender;
複製代碼

查詢男性的姓名、年齡、id '_' 只爲方便閱讀

select gender,group_concat(name,'_',age,'_',id) from students 
where gender = '男' group by gender;
複製代碼

having(注意having和group by 連用 having後一般也要跟 聚合函數) 查詢平均年齡超過30歲的性別,以及姓名

select gender ,avg(age), group_concat(name) from students 
group by gender having avg(age) > 30;
複製代碼

查詢每種性別中的人數多於2個的信息

select gender,count(*) from students group by gender
having count(*) > 2;
複製代碼

分頁

limit start, count limit 放在最後面(注意)

起始位置 = (第N頁-1)*每一頁的個數

限制查詢出來的數據個數 查詢前5個數據

select * from students limit 0,5;
複製代碼

每頁顯示2個,第1個頁面

select * from students limit 0,2;
複製代碼

每頁顯示2個,第2個頁面

select * from students limit 2,2;
複製代碼

每頁顯示2個,第3個頁面

select * from students limit 4,2;
複製代碼

每頁顯示2個,第4個頁面

select * from students limit 6,2;
複製代碼

每頁顯示2個,顯示第6頁的信息, 按照年齡從小到大排序

select * from students order by age asc limit 10,2;
複製代碼

鏈接查詢

inner join ... on select ... from 表A inner join 表B on 條件; 查詢 有可以對應班級的學生以及班級信息

select * from students inner join classes
on students.cls_id = classes.id;

select * from students inner join classes
on students.cls_id = classes.id where students.gender ='女';
複製代碼

按照要求顯示姓名、班級

select students.name,classes.name from students inner join classes
on students.cls_id = classes.id;
複製代碼

給數據表起名字

select s.name,c.name from students as s 
inner join classes as c on s.cls_id = c.id;
複製代碼

查詢 有可以對應班級的學生以及班級信息,顯示學生的全部信息 students.*,只顯示班級名稱 classes.name.

select students.* ,classes.name from students inner join classes
on students.cls_id = classes.id;
複製代碼

在以上的查詢中,將班級名顯示在第1列

select classes.name ,students.*  from students inner join classes
on students.cls_id = classes.id;
複製代碼

查詢 有可以對應班級的學生以及班級信息, 按照班級名進行排序

select classes.name ,students.*  from students inner join classes
on students.cls_id = classes.id order by classes.name;
複製代碼

當時同一個班級的時候,按照學生的id進行從小到大排序

select classes.name ,students.*  from students inner join classes
on students.cls_id = classes.id order by classes.name asc ,students.id asc;
複製代碼
left join 對於右表不存在的數據使用 null 填充
 查詢每位學生對應的班級信息
select * from students left join classes on 
students.cls_id = classes.id;

 查詢沒有對應班級信息的學生
select * from students left join classes on 
students.cls_id = classes.id where classes.name is null;

select * from students left join classes on 
students.cls_id = classes.id having classes.name is null;

 right join   on
 將數據表名字互換位置,用left join完成
select * from students right join classes on 
classes.id = students.cls_id;
複製代碼

子查詢

查詢出高於平均身高的信息(height)

獲得平均身高

select avg(height) from students;
複製代碼

大於平均 身高

select * from students where height > 172.076923;
複製代碼
select * from students where 
height > (select avg(height) from students);
複製代碼
相關文章
相關標籤/搜索