mysql數據庫的具體介紹和使用

表的建立。刪除,增加,修改,等

1 數據庫操作 (所以命令可大小寫,規范為大寫)

創建數據庫:(數據庫名開頭不能為數字)

create? database? db2;(注意添加結尾的分號)

刪除數據庫:

drop database? db1;

查看數據庫列表:

show databases;

捕獲1

進入其中的某個數據庫:

use db1;

進入某個數據庫后查看此庫里有那些表:
show? tables;

捕獲2

在數據庫中使用bsah的命令:stem/\!? +bash命令? (stem? ls /etc /或者\!? ls /etc/)

數據庫的終端命令可查看幫助:> help

查看支持所有字符集:SHOW CHARACTER SET; ?
查看支持所有排序規則:SHOW COLLATION; ?
獲取命令使用幫助: mysql> HELP KEYWORD;

 

2 .創建表? (數據庫下存放各種表)

創建表:CREATE TABLE

(1) 直接創建 新表?:

create table students ( id tinyint unsigned not null primary key,name char(10) not null,sex char(1),phone char(11) );

(第一項為創建的id,采用最小的整數,不為空,且為主鍵;第二項為姓名;給定十個字符;第四個為性別,給一個字符;第五項為電話號碼,設定為11個字符)

create table emp ( id int unsigned auto_increment primary key,name char(4) not null ,sex char(1) default ‘m’,adress char(20) );

auto_increment:數字自動遞增;unsigned 放在int定義數字的后面

小結:一個漢字,字母數字在char里都算一個字符。primary key放在最后;添加各種修飾符要注意前后順序,如上例中,如果將修飾符的順序更改則會報錯不能生成此表;

(2) 通過查詢現存表創建新的表,連數據一起創建了。

create table user select user,host,password from mysql.user;

mysql.user:mysql是一個庫,user是其庫里的一個表

(3) 通過復制現存的表的表結構創建,但不復制數據

create table user1 like mysql.user;

 

3 .表操作

查看創建的表結構:

desc? students;

捕獲3

查看庫里的表;(首先進入到此庫中然后查看)

show tables;

刪除庫里的某個表: (首先還是要進入到存放此表的庫里,查看后刪除)

drop table students

級聯刪除;

如果某兩個表之間是相互關連的關系,是不能刪除其中一個的,會報提示錯誤。

查看單個表狀態:

show table status like ‘students’\G; ? (表名必須要加引號)

查看庫中所有表的狀態:
show table status from db1\G; ? (G 為豎列查看)

 

對創建好的表進行修改:(一般表創建好后不建議去修改它,會造成數據的丟失)

對已經創建好的表添加一個字段:

alter table students add address char (11) after name;

對students表添加一個地址的字段,定義地址字段的格式,在name 字段后添加;

對已經創建好的表刪除某個字段:

alter table students drop address

對students表刪除一個 字段

ALTER TABLE s1 CHANGE COLUMN phone mobile char(11); (對phone字段改名并重新定義數據類型)

 

 

數據類型

選擇正確的數據類型對于獲得高性能至關重要,

三大原則: ?

更小的通常更好,盡量使用可正確存儲數據的最小數據類型 ?

簡單就好,簡單數據類型的操作通常需要更少的CPU周期 ?

盡量避免NULL,包含為NULL的列,對MySQL更難優化

具體內容查看30天的第二個視頻

1、整數的范圍(找自己表合適的使用,使用越大的范圍占用的內存空間越大)

tinyint ? ? ? ? ?? 1個字節 范圍(-128~127) ?

smallint ? ? ? ? 2個字節 范圍(-32768~32767) ?

mediumint ?? 3個字節 范圍(-8388608~8388607) ?

int ? ? ? ? ? ? ? ? ? 4個字節 范圍(-2147483648~2147483647) ?(無論是幾都要占用4個字節)

bigint ? ? ? ? ? ?? 8個字節 范圍(+-9.22*10的18次方) ? (無論是幾都要占用8個字節)

取值范圍如果加了unsigned,則最大值翻倍,如tinyint unsigned的取值范圍為(0~255) 取正整數。

 

2、浮點型(float和double),近似值 ?

float(m,d) 單精度浮點型 8位精度(4字節) m總個數,d小數位 ?

double(m,d) 雙精度浮點型16位精度(8字節) m總個數,d小數位 ?

設一個字段定義為float(6,3),如果插入一個數123.45678,實際數據庫里存的是 123.457,但總個數還以實際為準,即6位

3、定點數 ?

在數據庫中存放的是精確值,存為十進制 ? decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位

4 .字符串(char,varchar,_text)

char(n) 固定長度,最多255個字符 (常用的定義表字符的長度最少時4個字符,與下面的比效率高)

varchar(n)可變長度,最多65535個字符 ? (同上最少可以為一個字符減少空間的使用,但效率低)

tinytext 可變長度,最多255個字符 ?

text 可變長度,最多65535個字符 ?

mediumtext 可變長度,最多2的24次方-1個字符 ?

longtext 可變長度,最多2的32次方-1個字符 ?

BINARY(M) 固定長度,可存二進制或字符,長度為0-M字節 ?

VARBINARY(M) 可變長度,可存二進制或字符,允許長度為0-M字節

修飾符
?所有類型:

? NULL 數據列可包含NULL值

? NOT NULL 數據列不允許包含NULL值

? DEFAULT 默認值 ? PRIMARY KEY 主鍵

? UNIQUE KEY 唯一鍵

? CHARACTER SET name 指定一個字符集 ?數值型

? AUTO_INCREMENT 自動遞增,適用于整數類型 ? (數字自動增長不需要手動在添加了)

? UNSIGNED 無符號

 

 

4? .對表進行添加信息,刪除信息,等操作

1 . 向表里添加記錄;

insert students values(1,’bai’,’beijing’,’m’,’100233′);

字符要加引號。

添加后的表:select ? * ? from students ? (*代表查看表里的所有的內容)

捕獲4

另一種方式添加記錄:

insert students(id,name) values(2,’wang’);對指定的某個字段進行添加,字段和要賦值的內容要相對應。

其他沒有指定的字段內容默認為null

捕獲1

也可同時添加多行記錄:

insert students values(3,’li’,’shanghai’,’f’,’100010′),(4,’zhang’,’hefei’,’f’,’121212′);

 

最后一種批量將舊表中的某些數據插入到新表的指定的字段當中:

insert emp(name,adress) select user,host from user2;

emp為新表,user2為所查的表。將user2表的兩項內容,user和host賦值到要插入表emp的name和user2兩個字段中。

2 . update; 更改表里的某行記錄的某一個字段

update students set sex=’m’,phone=’44444′ where id=2;

where id=2 (修改的指定范圍;既將id=2的哪一行的兩個字段更改掉)

如果where不寫系統會默認更改,所有行的sex和phone的字段。

如果where查詢的字段有多個相同的,但只想更改其中的兩個可以增加限制,但此限制只能按順序選定,

update student? set sex=’m’ where sex=’f’ limit2;? (按順序只更改前兩個后面的滿足條件也不更改了)

 

3 . 對表里的內容進行刪除:

truncate table students? (快速刪除整個表,且不可恢復)

delete from students where id=4; (刪除id=4的哪一行)

delete from students;如果不寫where限定條件,默認會刪除此表的所有內容,如果在配置文件里面添加

vim /etc/my.cnf.d/mysql-clients.cnf

[mysql]

safe-updates

添加此行內容就不會刪除所有的內容了。

 

 

 

 

5? .SELECT (搜索查詢)

select * from students where sex=’m’;(查詢表里的所有字段,限定條件為,sex=m)

select id,name from students where sex=’m’;? (查看表里的某些特定的字段,限定條件為sex=m)

捕獲23

限定條件可以加多個:

select * from students where sex=’m’? and ? id=2

WHERE子句:

指明過濾條件以實現“選擇”的功能:

過濾條件:布爾型表達式 算術操作符:+, -, *, /, % 比較操作符:=, !=, <>, <=>, >, >=, <, <=

BETWEEN min_num AND max_num? (在兩者之間)select * from students where id between 2 and 4 ;

IN (element1, element2, …) ? ?select * from students where sex in (‘f’,’m’,null);

IS NULL ? (表示的為空,查找是遇到null的不能寫=號只能用is)

select * from students where sex is null;

IS NOT NULL ? (表示的為非空,查找是也不能用=號只能用is)

select * from students where sex is not null;

邏輯操作符:

NOT? (取反)

AND ? (并且)

OR? (或者)

XOR (異或)

select * from students where id>2;? (查找id號大于2的行)

select * from students where not id>2;(id>2并取反,即是查找id<=2的行)

模糊搜索查詢:

LIKE:

%: 任意長度的任意字符

_:任意一個個字符

select * from students where name like ‘%w%’? (name字段包含有w的)

 

 

字段顯示可以使用別名

格式;字段名as字段的別名 (前面為字段的名稱后面為定義的別名,只是用于顯示)

select name as 姓名,sex as 性別 from students where sex is not null;

捕獲23

 

 

 

6 .分組:

GROUP:根據指定的條件把查詢結果進行“分組”以用于做“聚合”運算

avg(), max(), min(), count(), sum()? (平均值;最大值;最小值;組里成員的個數;總和;)

下面是此表的內容:

捕獲1234

select sex from students group by sex;? (一旦做分組前后的sex應該是相互關連的,不能隨便寫了)

select sex,max(address) from students group by sex; (以性別為分組統計address中的最大值)

捕獲12345

max(address) 把max換成avg統計以性別為分組的平均成績;換成sum 為男女組的總成績;等等;

 

捕獲

統計上圖中一班和二班男女生的平均成績:

select class,sex,avg(address) from students group by sex,class;? (group分組根據多個條件)

統計效果如下圖所示:

捕獲

HAVING: 對分組聚合運算后的結果指定的限定條件 :

select sex,class,avg(address) from students group by class,sex having avg(address) > 80;(一班和二班男女生的平均成績:并加限定條件,大于80分的,此處的限定條件就不能用where了,語法要求在分組后加限定條件只能用having )

ORDER BY: 根據指定的字段對查詢結果進行排序

升序:ASC

降序:DESC

select * from students order by age asc; (對表中對其age組進行升序排列)

select * from students order by age desc;(對表中對其age組進行降序排列)

select sex,class,avg(address) from students group by class,sex asc; (分組時可以如此使用升序排列)

select sex,class,avg(address) from students group by class,sex desc;? (分組時可以如此使用降序排列)

小結:如果有null的想要將其排在最后:可以在分的組名上添加—

例如:select sex,class,avg(address) from students group by -sex desc ;(此實例中只按性別進行分組)

 

 

7 .多表查詢 (多個表關連進行查詢)

 

捕獲

上圖為多表聯系的7中結構:

如何將寫的數據庫程序導入到mysql表中:

第一種方法:mysql < /hellodb_innodb.sql? (沒有進入數據庫前)

第二種方法:source hellodb_innodb.sql ?? (在進入數據庫后)

上圖中的結構分析

第三種為:內連接

select s.name,t.name from students as s,teachers as t where s.teacherid=t.tid;? (取交集老舊的寫法)

(s.name中,s為后面students的別名,組和使用為了確保它是students的name的字段的唯一性,以免其他表中有相同的字段,t.name也是此意思;where后面的限制條件為:students表中的teacherid=teachers表中的tid;要顯示的內容為:students表中的name和teachers表中的tid

現在一般采用較新的寫法:

select s.name as student_name,t.name as teacher_nameb from students as s inner join teachers as t on s.teacherid=t.tid;

用inner join …on 代替where;

其中inner join前面是一個表后面是一個表然后在on后面添加條件。

inner join 可以取多個表的交集 ;

例如:表A inner join 表B on 條件1? inner join 表C? on? 條件2 ;(等依次類推)

(將A和B先查詢后在和C進行內連接的查詢)

select * from students cross join teachers;(笛卡爾乘積):兩張表的記錄完全組和一遍類似于{1,2,3}{4,5,,6} (交叉組和各種可能)

子查詢:(將一個查詢的結果定義為一個限定的條件)

select * from students where age > (select avg(age) from students);(括號里的為查詢平均年齡作為限定條件來使用)

 

第一種為;左外連接 (左邊的全部都要,右邊只要交集的部分;交集的部分按條件規則來取)

select s.name as student_name,t.name as teacher_name from students as s left outer join teachers as t on s.teacherid=t.tid; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? (此為左邊的表全部留下來) ? ?? (右邊的表只留交集)

第二種為:右外連接(右邊的全部都要,左邊的只要交集)

select s.name as student_name,t.name as teacher_name from students as s right outer join teachers as t on s.teacherid=t.tid; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? (此為左邊表只要交集) ? ? ? ?? (此為表的右邊全部都要)

 

第四種為:左內連接

第五種為;右內連接

第六種為:

第七種為:

 

練習 (單表查詢的)
導入hellodb.sql生成數據庫 ?

兩種方法:

第一種:mysql < /hellodb_innodb.sql (沒有進入數據庫前)
第二種:source hellodb_innodb.sql (在進入數據庫后)
(1) 在students表中,查詢年齡大于25歲,且為男性的同學的名字和年齡

select name,age from students where age>25 and gender=’m’;

select name,age from students where age>25 and gender=’m’ order by age; (對查詢的結果在進行年齡的排序)

(2) 以ClassID為分組依據,顯示每組的平均年齡

?select avg(age),classid from students group by classid ;

(3) 顯示第2題中平均年齡大于30的分組及平均年齡

?elect avg(age),classid from students group by classid having avg(age) > 30;

group分組時如果需要添加限定條件只能用having )

(4) 顯示以L開頭的名字的同學的信息 ?

select * from students where name like ‘l%’;

(5) 顯示TeacherID非空的同學的相關信息 ?

select * from students where teacherid is not null;

(當遇到null時必須使用is 不能用=號了)

select * from students where not teacherid is null; (反向使用也是可以的)

(6) 以年齡排序后,顯示年齡最大的前10位同學的信息 ?

select * from students order by age desc limit 10;

(先反向排序后在限定只查找前十位的信息)

(7) 查詢年齡大于等于20歲,小于等于25歲的同學的信息

select * from students where age>20 and age<=25;

(并且的限定條件用and)

小結:對于select搜索查詢;題目要得到的顯示結果應該寫在select……….from students 之間;

搜所的限定條件寫在where 后面;做題的思路如是;

練習:(多表查詢)

導入hellodb.sql,以下操作在students表上執行 ?

1、以ClassID分組,顯示每班的同學的人數 ?

select count(classid) as sum ,classid from students group by classid;

(as后面為定義的別名)

2、以Gender分組,顯示其年齡之和 ?

select sum(age),gender from students group by gender;

3、以ClassID分組,顯示其平均年齡大于25的班級 ?

elect avg(age) as ping,classid from students group by classid having ping > 25 and classid is not null;

4、以Gender分組,顯示各組中年齡大于25的學員的年齡之和

select gender,sum(age) from (select * from students where age > 25) as t group by gender;

(第一次搜索的表作為第二次查詢的表必須要添加別名,否則無法執行)

5、顯示前5位同學的姓名、課程及成績 ?

select name,score,course from students as st inner join scores as sc inner join courses as co on st.stuid=sc.stuid and co.courseid=sc.courseid limit 10;

(因為每個名字都是重復的所以xuan)

6、顯示其成績高于80的同學的名稱及課程; ?

select st.name as student_name,sc.score as score,course from students as st inner join scores as sc inner join courses as co on st.stuid=sc.stuid and co.courseid=sc.courseid and score > 80;

7、求前8位同學每位同學自己兩門課的平均成績,并按降序排列 ?

8、顯示每門課程課程名稱及學習了這門課的同學的個數 ?

9、如何顯示其年齡大于平均年齡的同學的名字 ?

10、如何顯示其學習的課程為第1、2,4或第7門課的同學的名字 ?

11、如何顯示其成員數最少為3個的班級的同學中年齡大于同班同學平均年齡的同學 ?

12、統計各班級中年齡大于全校同學平均年齡的同學

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/100509

(0)
無所謂無所謂
上一篇 2018-06-06 13:55
下一篇 2018-06-07 14:16

相關推薦

  • 第一周 筆記

    ../返回上一層 相對路徑絕對路徑 ? ?../../ ? 以根開始絕對路徑 不以根開始是相對路徑 alias 簡化特別長得命令和參數(別名) ?unalias去掉別名使用 .bashrc ? ?-a全取消 ls .bashrc 別名目錄文件 basename ? 查看主機名 ?(取最后的文件名) bc 計算器 ? obase=幾進制 ?進制轉換 clock…

    Linux筆記 2018-04-01
  • Linux入門知識

    #Linux基礎入門 用戶登錄 終端(terminal) 什么是shell? bash shell是什么? 命令提示符 shell內部可執行程序有兩類 Hash 緩存表 alias 命令的別名 命令格式 linux常用命令 bash 的快捷鍵 用戶登錄 root 用戶 一個特殊的管理帳戶 也被稱為超級用戶 root 已接近完整的系統控制 對系統損害幾乎有無限…

    Linux筆記 2018-05-07
  • Linux文本查看及處理工具

    Linux中,日志和配置都使用文本來存儲和修改,對文本的查看及處理是最基本也是最常用的操作之一。而文本處理工具中,有被稱為Linux文本處理三劍客的grep、sed和awk,但不要激動,Linux文本三劍客另起文章來講,本文先從一些經常用到的,功能簡潔但非常實用的工具說起。 wc命令 cut命令 sort命令 uniq命令 diff命令 patch命令 tr…

    2018-05-06
  • 第六次作業

    簡述osi七層模型和TCP/IP五層模型 OSI:是ISO(國際標準化組織)組織在1985年研究的網絡互連模型。 OSI將網絡定義為7層,每一層實現各自的功能和協議,并完成與相鄰層的接口通信。 物理層:?這一層是指物理設備 數據鏈路層:這層通過幀封裝進行傳遞 網絡層: 通過ip尋址來建立兩個節點之間的連接這一層就是我們經常說的IP協議層。IP協議是Inter…

    Linux筆記 2018-08-08
  • linux一些實用小命令

    linux的哲學思想: 1 一切皆文件2 小型,單一用途的程序3 鏈接程序,共同完成復雜的任務4 避免令人困惑的用戶界面5 配置數據存儲在文本中1Byte=8bit1k=1024Byte1M=1024k1G=1024M1T=1024G1P 1E 1Z 1Y 1D每個漢字占2個字節(Byte) 每個英文字母占1字節(Byte)在網絡配置文件中修改網絡開機自啟項…

    Linux筆記 2018-03-31
欧美性久久久久