一、數(shù)據(jù)庫系統(tǒng)
數(shù)據(jù)庫
DataBase【DB】蒲凶,指的是長期保存到計算機上的數(shù)據(jù)旋圆,按照一定順序組織,可以被各種用戶或者應用共享的數(shù)據(jù)集合搀矫∪壳颍【用于存儲數(shù)據(jù)的地方敏弃,可以視為存儲數(shù)據(jù)的容器】-
數(shù)據(jù)庫管理系統(tǒng)
DataBase Management System【DBMS】,能夠管理和操作數(shù)據(jù)庫的大型的軟件权她。
用于建立隅要、使用和維護數(shù)據(jù)庫,對數(shù)據(jù)庫進行統(tǒng)一的管理和控制要门,為了保證數(shù)據(jù)庫的安全性和完整性欢搜。用戶可以通過數(shù)據(jù)庫管理系統(tǒng)訪問數(shù)據(jù)庫中的數(shù)據(jù)炒瘟,或?qū)?shù)據(jù)庫進行維護第步。數(shù)據(jù)庫和數(shù)據(jù)庫管理系統(tǒng)之間的關系?
數(shù)據(jù)庫:存儲粘都,維護和管理數(shù)據(jù)的集合;
數(shù)據(jù)庫管理系統(tǒng): 就是數(shù)據(jù)庫管理軟件翩隧,通過它可以進行數(shù)據(jù)庫的管理和維護工作; -
常見的數(shù)據(jù)庫管理系統(tǒng)
- Oracle(甲骨文): 目前比較成功的關系型數(shù)據(jù)庫管理系統(tǒng),運行穩(wěn)定专缠,功能齊全藤肢,性能超群糯景,技術領先蟀淮,主要應用在大型的企業(yè)數(shù)據(jù)庫領域怠惶。
- DB2: IBM(國際商業(yè)機器公司)的產(chǎn)品,伸縮性比較強脓魏。
- SQL Server: Microsoft的產(chǎn)品茂翔,軟件界面友好珊燎,易學易用遵湖,在操作性和交互性方面獨樹一幟延旧。
- MySQL: 免費的數(shù)據(jù)庫系統(tǒng)迁沫,被廣泛引用于中小型應用系統(tǒng),體積小旅急,速度快藐吮,總體擁有成本低谣辞,開發(fā)源代碼,2008年被SUN收購句占,2009年SUN被Oracle收購纱烘。
二擂啥、數(shù)據(jù)庫的安裝
-
安裝
# 添加 sudo add-apt-repository 'deb http://archive.ubuntu.com/ubuntu trusty main universe' # 更新 sudo apt-get update # 搜索(從返回的結(jié)果查看有哪些版本可以安裝哺壶,用下邊的命令安裝相應的版本) sudo apt-cache search mysql | grep mysql-server # 安裝5.6版本 sudo apt install mysql-server-5.6 # 設置開機自啟動 sudo systemctl enable mysql.service
-
服務開啟和停止
// 方式一 sudo service mysql status // 查看狀態(tài) sudo service mysql start // 開啟服務 sudo service mysql stop // 停止服務 // 方式二 sudo systemctl stauts mysql.service // 查看狀態(tài) sudo systemctl start mysql.service // 開啟服務 sudo systemctl stop mysql.service // 停止服務器 sudo systemctl restart mysql.service // 重啟服務 sudo systemctl enable mysql.service // 開啟服務開機自啟動 sudo systemctl disable mysql.service // 關閉服務開機自啟動
-
數(shù)據(jù)庫連接
語法: mysql -u 用戶名 -p 例如: // 默認用戶名root山宾, 密碼123456 mysql -u root -p mysql -uroot -p mysql -uroot -p123456
退出數(shù)據(jù)庫: quit
MySQL端口號是3306!!! -
遠程服務器中的數(shù)據(jù)庫
建立遠程連接用戶: $ mysql –uroot –p123456 // 連接數(shù)據(jù)庫资锰,-u用戶名 -p密碼 mysql> use mysql; mysql> select * from user; // 第一個admin表示用戶名旬盯,%表示所有的電腦都可以連接胖翰,也可以設置某個ip地址運行連接萨咳,第二個admin123表示密碼 // 為了方便其實也可以設置為root mysql> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY 'admin123' WITH GRANT OPTION; mysql> select * from user; // 查看遠程連接用戶admin是否新增成功培他,若存在則成功 mysql> exit; // 退出
默認mysql的root用戶只能是本地連接舀凛。如果遠程服務器的數(shù)據(jù),需要建立遠程連接用戶馋记,否則連接不了!!!
三梯醒、SQL概述
概述
Structure Query Language茸习,結(jié)構化查詢語言号胚。是一種特殊目的的編程語言,是一種數(shù)據(jù)庫查詢和程序設計語言嗡综,用于存取數(shù)據(jù)以及查詢、更新和管理關系數(shù)據(jù)庫系統(tǒng)察净。-
數(shù)據(jù)庫服務器氢卡、數(shù)據(jù)庫译秦、表單之間的關系
[圖片上傳失敗...(image-481db0-1536123457556)]
-
分類
- DDL【Data Definition Language】數(shù)據(jù)定義語言筑悴,用戶創(chuàng)建阁吝、修改、刪除表結(jié)構
- DML【Data Manipulation Language】數(shù)據(jù)操作語言装盯,用于對數(shù)據(jù)表進行增刪改的操作
- DQL【Data Query Language】數(shù)據(jù)查詢語言,用于負責數(shù)據(jù)表的查詢工作
- DCL【Data Control Language】數(shù)據(jù)控制語言甲馋,用來定義訪問權限和安全級別
四埂奈、數(shù)據(jù)庫之DDL
一般情況下,mysql關鍵字是大寫的定躏,但是為了方便就小寫账磺。
-
顯示所有數(shù)據(jù)庫(當前數(shù)據(jù)庫服務器中)
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec)
-
選擇數(shù)據(jù)庫
格式: use 數(shù)據(jù)庫名稱; 例如: use zyz;
注意: 在創(chuàng)建表單海蔽、添加數(shù)據(jù)、刪除數(shù)據(jù)绑谣、修改數(shù)據(jù)...操作的前提是要進入到對應的數(shù)據(jù)中,否則是操作不了的借宵。
-
創(chuàng)建數(shù)據(jù)庫
格式: create database 數(shù)據(jù)庫名字; 例如: create database zyz; // 創(chuàng)建時指定編碼類型 create database pythondb charset=utf8;
注意: 命令行操作幌衣,要注意中英文狀態(tài),都是要使用英文的標點符號H烂怠;砘ぁ!
-
刪除數(shù)據(jù)庫
格式: drop database 數(shù)據(jù)庫名字; 例如: drop database zyz;
-
查看數(shù)據(jù)庫中的表
show tables;
-
創(chuàng)建表
格式: create table 表名( 字段1 字段類型[列級別約束條件][默認值]欲间, 字段2 字段類型[列級別約束條件][默認值]楚里, …. 字段n 字段類型[列級別約束條件][默認值] [表級別約束條件] ) 例如: create table students(id int(4),name char(20),age int(4)); create table students(id int(4) primary key,name char(20),age int(4));
創(chuàng)建表之前,一定要先進入對應的數(shù)據(jù)庫中A蕴0喽小!
顯示創(chuàng)建表的詳細信息: show create table student; -
刪除表
格式: drop table 表名; 例如: drop table students;
-
修改表名
格式: alter table 老表名 rename 新表名; 例如: alter table students_base rename students;
-
查看表的結(jié)構
格式: desc 表名; 例如: desc students; Field:域/字段/列 Type:類型 Null:是否為空 Key:主鍵 Default:默認值 Extra:額外屬性
[圖片上傳失敗...(image-1c67d7-1536123457556)]
-
增加一個字段
格式: alter table 表名 add 新字段的名字 字段屬性 例如: alter table students add sex char(10);
如果要添加的某個字段不能為空她渴,就是not null;
例如: alter table students add sex char(10) not null; -
刪除一個字段
格式: alter table 表名 drop 字段名; 例如: alter table students drop sex;
-
修改某個字段 --- 添加屬性
格式: alter table 表名 change 老字段名 新字段名 字段屬性; 例如: alter table students change id id int(4) auto_increment; //給id添加自動增長的屬性
[圖片上傳失敗...(image-33221-1536123457556)]
-
修改某個字段 --- 修改屬性
//修改id的屬性达址,去除auto_increment屬性 alter table students change id id int(4);
[圖片上傳失敗...(image-68c6cd-1536123457555)]
-
修改某個字段 --- 刪除主鍵
alter table students drop primary key;
-
修改某個字段 --- 添加主鍵
alter table students add primary key(id); alter table students change id id int(4) primary key;
一張表中只能有一個字段是自動增長的,并且被設定為自動增長的這個字段一定要設置為主鍵;
如果一個主鍵字段有自增長屬性趁耗,如果想要直接刪除主鍵沉唠,這是操作不了的;必須是先將自增長屬性去除苛败,然后才能刪除主鍵满葛; -
常用數(shù)據(jù)類型
1.數(shù)字數(shù)據(jù)類型 - INT - 正常大小的整數(shù),可以帶符號罢屈。如果是有符號的嘀韧,它允許的范圍是從-2147483648到2147483647。如果是無符號儡遮,允許的范圍是從0到4294967295乳蛾。 可以指定多達11位的寬度。 - TINYINT - 一個非常小的整數(shù)鄙币,可以帶符號肃叶。如果是有符號,它允許的范圍是從-128到127十嘿。如果是無符號因惭,允許的范圍是從0到255,可以指定多達4位數(shù)的寬度绩衷。 - SMALLINT - 一個小的整數(shù)蹦魔,可以帶符號激率。如果有符號,允許范圍為-32768至32767勿决。如果無符號乒躺,允許的范圍是從0到65535,可以指定最多5位的寬度低缩。 - MEDIUMINT - 一個中等大小的整數(shù)嘉冒,可以帶符號。如果有符號咆繁,允許范圍為-8388608至8388607讳推。 如果無符號,允許的范圍是從0到16777215玩般,可以指定最多9位的寬度银觅。 - BIGINT - 一個大的整數(shù),可以帶符號坏为。如果有符號究驴,允許范圍為-9223372036854775808到9223372036854775807。如果無符號久脯,允許的范圍是從0到18446744073709551615\. 可以指定最多20位的寬度纳胧。 - FLOAT(M,D) - 不能使用無符號的浮點數(shù)字镰吆×弊可以定義顯示長度(M)和小數(shù)位數(shù)(D)。這不是必需的万皿,并且默認為10,2摧找。其中2是小數(shù)的位數(shù),10是數(shù)字(包括小數(shù))的總數(shù)牢硅。小數(shù)精度可以到24個浮點蹬耘。 - DOUBLE(M,D) - 不能使用無符號的雙精度浮點數(shù)〖跤啵可以定義顯示長度(M)和小數(shù)位數(shù)(D)综苔。 這不是必需的,默認為16,4位岔,其中4是小數(shù)的位數(shù)如筛。小數(shù)精度可以達到53位的DOUBLE。 REAL是DOUBLE同義詞抒抬。 - DECIMAL(M,D) - 非壓縮浮點數(shù)不能是無符號的杨刨。在解包小數(shù),每個小數(shù)對應于一個字節(jié)擦剑。定義顯示長度(M)和小數(shù)(D)的數(shù)量是必需的妖胀。 NUMERIC是DECIMAL的同義詞芥颈。[decimal] 2.日期和時間類型 - DATE - 以YYYY-MM-DD格式的日期,在1000-01-01和9999-12-31之間赚抡。 例如爬坑,1973年12月30日將被存儲為1973-12-30。 - DATETIME - 日期和時間組合以YYYY-MM-DD HH:MM:SS格式涂臣,在1000-01-01 00:00:00 到9999-12-31 23:59:59之間妇垢。例如,1973年12月30日下午3:30肉康,會被存儲為1973-12-30 15:30:00闯估。 - TIMESTAMP - 1970年1月1日午夜之間的時間戳,到2037的某個時候吼和。這看起來像前面的DATETIME格式涨薪,無需只是數(shù)字之間的連字符; 1973年12月30日下午3點30分將被存儲為19731230153000(YYYYMMDDHHMMSS)。 - TIME - 存儲時間在HH:MM:SS格式炫乓。 - YEAR(M) - 以2位或4位數(shù)字格式來存儲年份刚夺。如果長度指定為2(例如YEAR(2)),年份就可以為1970至2069(70?69)末捣。如果長度指定為4侠姑,年份范圍是1901-2155,默認長度為4箩做。 3.字符串類型 雖然數(shù)字和日期類型比較有意思莽红,但存儲大多數(shù)數(shù)據(jù)都可能是字符串格式。 下面列出了在MySQL中常見的字符串數(shù)據(jù)類型邦邦。 - CHAR(M) - 固定長度的字符串是以長度為1到255之間個字符長度(例如:CHAR(5))安吁,存儲右空格填充到指定的長度。 限定長度不是必需的燃辖,它會默認為1鬼店。 - VARCHAR(M) - 可變長度的字符串是以長度為1到255之間字符數(shù)(高版本的MySQL超過255); 例如: VARCHAR(25). 創(chuàng)建VARCHAR類型字段時,必須定義長度黔龟。 [varchar] - BLOB or TEXT - 字段的最大長度是65535個字符妇智。 BLOB是“二進制大對象”,并用來存儲大的二進制數(shù)據(jù)氏身,如圖像或其他類型的文件巍棱。定義為TEXT文本字段還持有大量的數(shù)據(jù); 兩者之間的區(qū)別是,排序和比較上存儲的數(shù)據(jù)观谦,BLOB大小寫敏感拉盾,而TEXT字段不區(qū)分大小寫。不用指定BLOB或TEXT的長度豁状。 - TINYBLOB 或 TINYTEXT - BLOB或TEXT列用255個字符的最大長度捉偏。不指定TINYBLOB或TINYTEXT的長度倒得。 - MEDIUMBLOB or MEDIUMTEXT - BLOB或TEXT列具有16777215字符的最大長度。不指定MEDIUMBLOB或MEDIUMTEXT的長度夭禽。 - LONGBLOB 或 LONGTEXT - BLOB或TEXT列具有4294967295字符的最大長度霞掺。不指定LONGBLOB或LONGTEXT的長度。 - ENUM - 枚舉讹躯,這是一個奇特的術語列表菩彬。當定義一個ENUM,要創(chuàng)建它的值的列表潮梯,這些是必須用于選擇的項(也可以是NULL)骗灶。例如,如果想要字段包含“A”或“B”或“C”秉馏,那么可以定義為ENUM為 ENUM(“A”耙旦,“B”,“C”)也只有這些值(或NULL)才能用來填充這個字段萝究。 主要使用的數(shù)據(jù)類型: 數(shù)字型數(shù)據(jù)類型: int float double 日期類: date 字符串: char varchar
char 和 varchar 的區(qū)別
char(M)是固定長度的字符串入撒, 在定義時指定字符串列長拇厢。當保存數(shù)據(jù)時如果長度不夠在右側(cè)填充空格以達到指定的長度号涯。M 表示列的長度亡驰,M 的取值范圍是0-255個字符;
varchar(M)是長度可變的字符串,M 表示最大的列長度栽连。M 的取值范圍是0-65535险领。varchar的最大實際長度是由最長的行的大小和使用的字符集確定的,而實際占用的空間為字符串的實際長度+1
五升酣、數(shù)據(jù)庫之DML
-
增加數(shù)據(jù)
格式:insert into 表名(字段1,字段2,.....) values(值1,值2.....); 例如: insert into students(id,name,age) values(1001,"張三",20); insert into students(name,age) values("王六",22); insert into students(name,age,sex) values("八妹",25,"女"); insert into students(name,sex) values("九妹","女"); // 注意值必須是和默認結(jié)構與之對應 insert into students values(1006,"老七",18,'男');
一次性寫入多條數(shù)據(jù) 格式: insert into 表名(屬性1舷暮,屬性2..) values(值1.1,值2.1...),(值1.2噩茄,值2.2,....); 例如: insert into students(id,name,sex,age) values('1001','張三','男',20),('1002','李四','男',21);
插入的是日期,和字符串一樣复颈,使用引號括起來绩聘。
-
更新數(shù)據(jù)
格式: update 表名 set 字段=值 where 條件; 例如: update students set address="江西" where name="王老五"; update students set math=98,chinese=93 where id=1002;
如果where子句沒有指定,則默認將表中的數(shù)據(jù)全部更新耗啦。
-
刪除數(shù)據(jù)
格式:delete from 表名 where 條件 例如: // 刪除整個表單數(shù)據(jù) delete from students; // 刪除名字為李四的學生信息 delete from students where name="李四"; // 刪除id為1003的學生信息 delete from students where id=1003;
如果where子句沒有指定凿菩,則默認將表中的數(shù)據(jù)全部刪除。
六帜讲、數(shù)據(jù)庫之DQL
數(shù)據(jù)庫執(zhí)行DQL語言不會對數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生任何改變衅谷,而是讓數(shù)據(jù)庫發(fā)送查詢結(jié)果到客戶端,查詢返回的結(jié)果其實是一張?zhí)摂M表似将。
基本語法: SELECT 列名 FROM 表名 [WHERE --> GROUP BY -->HAVING--> ORDER BY]
-
基礎查詢
// 查詢所有字段(列) select * from students; // 查詢指定字段(列) select id,name,age from student; // as添加別名 【后續(xù)用于子查詢】 select name as "姓名" from studnets;
as不是給表里的字段取別名获黔,而是給查詢的結(jié)果字段取別名蚀苛。其目的是讓查詢的結(jié)果展現(xiàn)更符合人們觀看習慣,在多張表查詢的時候可以直接的區(qū)別多張表的同名的字段玷氏。
-
條件查詢
1堵未、模糊查詢數(shù)據(jù) %: 表示任意個或多個字符,可匹配任意類型和長度的字符 _: 匹配任意一個字符 例如: 查詢出學生姓王的學生信息盏触; select * from students where name like "王%"; 2渗蟹、and并且 例如: 顯示math和chinese成績大于90的學生信息; select * from students_test where math>=90 and chinese>=90; 3、or或者 例如: 顯示math或chinese成績大于90的學生信息; select * from students_test where math>=90 or chinese>=90; 4赞辩、between x and y //在x與y之間的 例如: 顯示math成績在90~100之間的學生信息; select * from students_test where math between 90 and 100; 5雌芽、in在..里面,允許規(guī)定多個值 例如: 顯示1703和1704兩個班級學生信息; select * from students where class="1704" or class="1703"; select * from students_test where class in ("1703","1704‘’); 6辨嗽、limit指定顯示多少行膘怕,limit后面2個數(shù)字,用逗號隔開召庞,第一個表示數(shù)字后岛心。第二數(shù)字表示顯示幾行 例如: 顯示前面10行數(shù)據(jù): select * from students limit 10; 顯示4到7行的數(shù)據(jù): select * from students limit 3,4; 按chinese排序,顯示4,5行數(shù)據(jù): select * from students limit 3,2; 顯示english成績在70~90之間的學生信息篮灼,顯示開頭2行: select * from students where english between 70 and 90 limit 0,2; 7忘古、邏輯運算符 > 大于 < 小于 >= 大于等于 <= 小于等于 = 等于 != 不等于 8、算術運算符 + 加法 - 減法 * 乘法 / 除法 % 取余
-
其他(聚合函數(shù))
1诅诱、count() 統(tǒng)計數(shù)量 select class,count(class) from students group by class; 2髓堪、avg() 求平均分 select avg(math) from students; 3、sum() 求和 select sum(math) from students; 4娘荡、max()最大值 select max(math) from students; 5干旁、min()最小值 select min(math) from students; 6、distinct() 去重復 select distinct(goods_number) from students ; 7炮沐、order by 排序 select * from students order by id; // 默認是升序 select * from students order by id desc; // 降序 8争群、group by 分組 select class,count(class) from students group by class; 9、having 表示條件(類似where) 虛擬字段是不可以放在where后面的大年,例如where avg(math)其中math是實際字段换薄,但avg(math)是求出來的平均分是虛擬字段; 需要進行條件處理的虛擬字段翔试,可以放在having后面轻要;
練習
1.創(chuàng)建student表
CREATE TABLE student ( id INT(10) NOT NULL PRIMARY KEY , name CHAR(20) NOT NULL, sex CHAR(4), birth YEAR, department CHAR(20), address CHAR(50) );
2.向student表插入記錄的INSERT語句如下:
INSERT INTO student VALUES( 901,'張老大', '男',1984,'計算機系', '北京市海淀區(qū)'); INSERT INTO student VALUES( 902,'張老二', '男',1987,'中文系', '北京市昌平區(qū)'); INSERT INTO student VALUES( 903,'張三', '女',1991,'中文系', '湖南省永州市'); INSERT INTO student VALUES( 904,'李四', '男',1993,'英語系', '遼寧省阜新市'); INSERT INTO student VALUES( 905,'王五', '女',1990,'英語系', '福建省廈門市'); INSERT INTO student VALUES( 906,'王六', '男',1989,'計算機系', '湖南省衡陽市'); INSERT INTO student VALUES( 907,'老七', '男',1991,'計算機系', '廣東省深圳市'); INSERT INTO student VALUES( 908,'老八', '女',1990,'英語系', '山東省青島市');
4.查詢student表的第2條到4條記錄
5.從student表查詢所有學生的學號(id)、姓名(name)和院系(department)的信息
6.從student表中查詢計算機系和英語系的學生的信息
7.從student表中查詢年齡24~26歲的學生信息
8.從student表中查詢每個院系有多少女生
9.把張老大的出生日期修改為1988垦缅,院系修改成中文系
10.把所有學生的年紀增加5歲冲泥;練習
1.創(chuàng)建score表
CREATE TABLE score ( id INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT , name CHAR(20) NOT NULL , c_name CHAR(20) , grade INT(10) );
2.向score表插入記錄的INSERT語句如下:
INSERT INTO score VALUES(NULL,'張老大', '計算機',98); INSERT INTO score VALUES(NULL,'張老大', '英語', 80); INSERT INTO score VALUES(NULL,'張老二', '計算機',65); INSERT INTO score VALUES(NULL,'張老二', '中文',88); INSERT INTO score VALUES(NULL,'張三', '中文',95); INSERT INTO score VALUES(NULL,'李四', '計算機',70); INSERT INTO score VALUES(NULL,'李四', '英語',92); INSERT INTO score VALUES(NULL,'王五', '英語',94); INSERT INTO score VALUES(NULL,'王六', '計算機',90); INSERT INTO score VALUES(NULL,'王六', '英語',85); INSERT INTO score VALUES(NULL,'老七', '計算機',98);
3.查詢李四的考試科目(c_name)和考試成績(grade)
4.查詢計算機成績低于95的學生信息
5.計算每個考試科目的平均成績
6.計算每個學生的總成績
7.查詢每個科目的最高分與平均分
8.將計算機考試成績按從高到低進行排序