數據庫就是一個文件系統,經過標準的SQL語句獲取數據web
關係型數據庫存放的是實體之間的關係數據庫
l MySQL服務器
l Oracle函數
l SQLServerspa
l DB2視頻
l SyBase對象
參見《MySQL的安裝》視頻排序
服務器要從硬件和軟件兩個方面來講:事務
l 硬件:指的就是一臺計算機。rem
l 軟件:須要在這臺電腦上安裝數據庫服務器。
一臺數據庫服務器中會建立不少數據庫(一個項目,會建立一個數據庫)。在數據庫中會建立不少張表(一個實體會建立一個表)。在表中會有不少記錄(一個對象的實例會添加一條新的記錄)。
create,drop,alter..
grant,if…
insert,update,delete…
select
l 語法:
n create database 數據庫名稱 [character set 字符集 collate 字符集校對規則];
l 語法:
n 查看數據庫服務器中全部的數據庫:show databases;
n 查看某個數據庫的定義信息: show create database 數據庫名稱;
l 語法:
n alter database 數據庫名稱 character set 字符集 collate 校對規則;
l 語法:
n drop database 數據庫名稱;
l 切換數據庫:use 數據庫名稱;
l 查看當前正在使用的數據庫:
l 語法:
n create table 表名稱(字段名稱 字段類型(長度) 約束,字段名稱 字段類型(長度) 約束…);
l 字段類型
n 一個實體對應一個表,一個實體屬性對應表的一個字段。
Java中的類型 MySQL中的類型
byte/short/int/long tinyint/smallint/int/bigint
float float
double double
boolean bit
char/String char和varchar類型
char和varchar的區別:
* char表明是固定長度的字符或字符串。
* 定義類型char(8),向這個字段存入字符串hello,那麼數據庫使用三個空格將其補全。
* varchar表明的是可變長度的字符串。
* 定義類型varchar(8), 向這個字段存入字符串hello,那麼存入到數據庫的就是hello。
Date date/time/datetime/timestamp
datetime和timestamp區別
* datetime就是既有日期又有時間的日期類型,若是沒有向這個字段中存值,數據庫使用null存入到數據庫中
* timestamp也是既有日期又有時間的日期類型,若是沒有向這個字段中存值,數據庫使用當前的系統時間存入到數據庫中。
File BLOB/TEXT
l 約束
n 約束做用:保證數據的完整性
n 單表約束分類:
u 主鍵約束:primary key 主鍵約束默認就是惟一 非空的
u 惟一約束:unique
u 非空約束:not null
l 建表語句:
create database web_test1;
use web_test1;
create table user(
id int primary key auto_increment,
username varchar(20) unique,
password varchar(20) not null,
age int,
birthday date
);
l 查看某個數據庫下的全部的表
n 語法:show tables;
l 查看某個表的結構信息
n 語法:desc 表名;
l 刪除表
n 語法:drop table 表名;
l 修改表:添加列
n alter table 表名 add 列名 類型(長度) 約束;
l 修改表:修改列類型,長度和約束
n alter table 表名 modify 列名 類型(長度) 約束;
l 修改表:刪除列
n alter table 表名 drop 列名;
l 修改表:修改列名稱
n alter table 表名 change 舊列名 新列名 類型(長度) 約束;
l 修改表:修改表名
n rename table 表名 to 新的表名;
l 修改表:修改表的字符集
n alter table 表名 character set 字符集;
l 語法:
n 向表中插入某些列:insert into 表名 (列名1,列名2,列名3…) values (值1,值2,值3…)
n 向表中插入全部列:insert into 表名 values (值1,值2,值3…);
l 注意事項
n 1.值的類型與數據庫中表列的類型一致。
n 2.值的順序與數據庫中表列的順序一致。
n 3.值的最大長度不能超過列設置最大長度。
n 4.值的類型是字符串或者是日期類型,使用單引號引發來。
l 添加記錄
n 添加某幾列
insert into user (id,username,password) values (null,'aaa','123');
n 添加全部列
insert into user values (null,'bbb','123',23,'1993-09-01');
l 添加中文記錄
insert into user values (null,'張三','123',23,'1993-09-01');
直接向數據庫中插入中文記錄會出現錯誤!!!
解決方法:
show variables like '%character%'; --查看數據庫中與字符集相關參數:
須要將MySQL數據庫服務器中的客戶端部分的字符集改成gbk。
找到MySQL的安裝路徑:my.ini文件,修改文件中[client]下的字符集
* 從新啓動MySQL的服務器
services.msc
l 語法:
n update 表名 set 列名=值,列名=值 [where 條件];
l 注意事項
n 1.值的類型與列的類型一致。
n 2.值的最大長度不能超過列設置的最大長度。
n 3.字符串類型和日期類型添加單引號。
l 修改某一列的全部值
update user set password = 'abc';
l 按條件修改數據
update user set password = 'xyz' where username = 'bbb';
l 按條件修改多個列
update user set password='123',age=34 where username='aaa';
l 語法:
n delete from 表名 [where 條件];
l 注意事項
n 1.刪除表的記錄,指的是刪除表中的一行記錄。
n 2.刪除若是沒有條件,默認是刪除表中的全部記錄。
l 刪除某一條記錄
delete from user where id = 2;
l 刪除表中的全部記錄
delete from user;
n 刪除表中的記錄有兩種作法:
u delete from user;
l 刪除全部記錄,屬於DML語句,一條記錄一條記錄刪除。事務能夠做用在DML語句上的
u truncate table user;
l 刪除全部記錄,屬於DDL語句,將表刪除,而後從新建立一個結構同樣的表。事務不能控制DDL的
l 基本查詢
n 語法:select [distinct] *|列名 from 表 [條件];
n 環境的準備:
create table exam(
id int primary key auto_increment,
name varchar(20),
english int,
chinese int,
math int
);
insert into exam values (null,'張三',85,74,91);
insert into exam values (null,'李四',95,90,83);
insert into exam values (null,'王五',85,84,59);
insert into exam values (null,'趙六',75,79,76);
insert into exam values (null,'田七',69,63,98);
insert into exam values (null,'李老八',89,90,83);
n 查詢全部學生考試成績信息
select * from exam;
n 查詢全部學生的姓名和英語成績
select name,english from exam;
n 查詢英語成績信息(不顯示重複的值)
select distinct english from exam;
n 查看學生姓名和學生的總成績
select name,english+chinese+math from exam;
n 別名查詢
select name,english+chinese+math as sum from exam;
l 條件查詢
n 使用where子句
u > , < , >= , <= , <> ,=
u like:模糊查詢
u in:範圍查詢
u 條件關聯:and , or ,not
n 查詢李四學生的成績:
select * from exam where name = '李四';
n 查詢名稱叫李四學生而且英文大於90分
select * from exam where name = '李四' and english > 90;
n 查詢姓李的學生的信息
like能夠進行模糊查詢,在like子句中能夠使用_或者%做爲佔位符。_只能表明一個字符,而%能夠表明任意個字符。
* like ‘李_’ :名字中必須是兩個字,並且是姓李的。
* like ‘李%’ :名字中姓李的學生,李子後能夠是1個或任意個字符。
* like ‘%四’ :名字中以四結尾的。
* like ‘%王%’ :只要名稱中包含這個字就能夠。
select * from exam where name like '李%';
n 查詢英語成績是69,75,89學生的信息
select * from exam where english in (69,75,89);
l 排序查詢
n 使用order by 字段名稱 asc/desc;
n 查詢學生信息,而且按照語文成績進行排序:
select * from exam order by chinese;
n 查詢學生信息,而且按照語文成績倒序排序:
select * from exam order by chinese desc;
n 查詢學生信息,先按照語文成績進行倒序排序,若是成績相同再按照英語成績升序排序
select * from exam order by chinese desc,english asc;
n 查詢姓李的學生的信息,按照英語成績降序排序
select * from exam where name like '李%' order by english desc;
l 分組統計查詢
n 聚合函數使用
u sum();
l 獲取全部學生的英語成績的總和:
select sum(english) from exam;
l 獲取全部學生的英語成績和數學成績總和:
select sum(english),sum(math) from exam;
l 查詢姓李的學生的英語成績的總和
select sum(english) from exam where name like '李%';
l 查詢全部學生各科的總成績:
select sum(english)+sum(chinese)+sum(math) from exam;
select sum(english+chinese+math) from exam;
與上面的語句有什麼不一樣?
* 上面的語句是按照列的方式統計,英語成績總和+語文成績總和+數學成績總和。
* 下面的語句先計算英語+數學+語文而後再求和。
* 使用ifnull的函數
u count();
l 得到學生的總數
select count(*) from exam;
l 得到姓李的學生的個數
select count(*) from exam where name like '李%';
u max();
l 得到數學成績的最高分:
select max(math) from exam;
u min();
l 得到語文成績的最小值
select min(chinese) from exam;
u avg();
l 獲取語文成績的平均值
select avg(chinese) from exam;
n 分組查詢
n 語法:使用group by 字段名稱;
n 環境準備
create table orderitem(
id int primary key auto_increment,
product varchar(20),
price double
);
insert into orderitem values (null,'電視機',2999);
insert into orderitem values (null,'電視機',2999);
insert into orderitem values (null,'洗衣機',1000);
insert into orderitem values (null,'洗衣機',1000);
insert into orderitem values (null,'洗衣機',1000);
insert into orderitem values (null,'冰箱',3999);
insert into orderitem values (null,'冰箱',3999);
insert into orderitem values (null,'空調',1999);
u 按商品名稱統計,每類商品所購買的個數:
select product,count(*) from orderitem group by product;
u 按商品名稱統計,每類商品所花費的總金額:
select product,sum(price) from orderitem group by product;
u 按商品名稱統計,統計每類商品花費的總金額在5000元以上的商品
***** where的子句後面不能跟着聚合函數。若是如今使用帶有聚合函數的條件過濾(分組後條件過濾)須要使用一個關鍵字having
select product,sum(price) from orderitem group by product having sum(price) > 5000;
u 按商品名稱統計,統計每類商品花費的總金額在5000元以上的商品,而且按照總金額升序排序
select product,sum(price) from orderitem group by product having sum(price) > 5000 order by sum(price) asc;
l 總結
n S(select)… F(from)…W(where)…G(group by)…H(having)…O(order by);