數據庫概述
什麼是數據庫?
- 數據庫就是一個文件系統,只不過我們需要通過SQL命令來操作這個文件系統。
- 數據庫(DataBase)是按照數據結構來組織,存儲和管理數據的建立在計算機存儲設備上的倉庫。
- 作用:存儲數據,數據的倉庫,帶有訪問權限,限制不同的人可以有不同的操作。
- java EE操作的都是後臺數據,取到後臺數據進行封裝,然後交給前端去展現。
有哪些數據庫
- mysql:開源免費,適用於中小企業的免費數據庫。
- oracle:甲骨文公司,收費軟件,適用於大型網站。
- db2:IBM公司,做解決方案,軟件和硬件,服務器架構,銀行系統。
- sqlserver:windows裏,政府網站。asp.net 大學教學,圖形化做得好。
Mysql的sql語句有哪些?
- SQL(Structure Query Language)結構化查詢語言
- DDL數據定義語言:定義數據庫,數據表他們的結構,create(創建),drop(刪除),alert(修改)
- DML數據操縱語言:主要用來操作數據,insert(插入),update(修改),delete(刪除)
- DCL數據控制語言:定義訪問權限,取消訪問權限,安全設置,grant
- DQL數據查詢語言:select(查詢) from子句 where子句
數據庫的CRUD操作(增刪改查)
- 登錄數據庫服務器
mysql -uroot -pdaq
- 創建數據庫:
create database 數據庫的名字;
create database 數據庫的名字 character set 字符集;//指定字符集
- 查看所有數據庫
show databases;
- 查看指定數據庫:
show create database 數據庫的名字;
- 修改數據庫的字符集
alter database 數據庫的名字character set 字符集;
- 刪除數據庫
drop database 數據庫的名字;
- 切換數據庫(選中數據庫)
use 數據庫的名字;
- 查看當前正在使用的數據庫
select database();
表的創建
- 創建表
create table 表名(列名 列的類型(長度) 約束,列名2 列的類型(長度) 約束);
列的類型:
java sql
int int
char char(固定長度)
String varchar(可變長度)長度代表字符的個數
text:主要用來存放文本
blob:存放的是二進制
列的約束:
主鍵約束:primary key
唯一約束:unique
非空約束:not null
create table student(
sid int primary key,
sname varchar(10),
sex int,
age int);
- 查看所有表:
show tables;
- 查看錶的定義:
show create table 表名;
- 查看錶結構:
desc 表名;
- 修改表:
-添加列(add):
alter table 表名 add 列名 列的類型 列的約束;
alter table student add greade int not null;
-修改列(modify):
alter table 表名 modify sex varchar(2);
-修改列名(change):
alter table 表名 change sex gender varchar(2);
-刪除列(drop)
alter table 表名 drop greade;
- 修改表名(rename)
rename table student to 新表名;
- 修改表的字符集
alter table 表名 character set 字符集;
- 刪除表
drop table 表名;
Sql完成對錶中數據的CRUD操作
- 插入數據
insert into 表名(列名1,列名2,列名3)values(值1,值2,值3);
如:insert into student(sid,sname,sex,age)values(1,'zhangsan',1,23);
簡單寫法:插入的是全列名的數據,表名後面的列名可以省略
insert into 表名values(值1,值2,值3);
如:insert into student values(1,'zhangsan',1,23);
如果插入的是部分數據,列名不能省略
如:insert into student(sid,sname,sex)values(1,'zhangsan',1);
批量插入:效率比單條插入效率高。但不能出錯
insert into student values(1,'zhangsan',1,23),
(2,'lisi',0,22),
(3,'wangwu',1,24);
- 查看錶中數據
select * from student;
- 表中插入數據中文亂碼問題
1.暫停Mysql服務
2.在Mysql安裝路徑中找到my.ini配置文件
3.將57行的編碼改成GBK。
4.保存,退出,啓動mysql服務
- 刪除記錄
delete from 表名[where 條件]
delete from student where sid=10;
delete from student; 如果沒有指定條件,會將表中數據一條一條全部刪除掉。
- 面試問題:
請說一下delete 刪除數據和truncate刪除數據有什麼差別?
答:delete:屬於DML數據操縱語言,一條一條刪除表中的數據。
truncate:屬於DDL數據定義語言,先刪除表,在重建表。
關於那條執行效率高:具體要看錶中的數據量。
如果數據比較少,delete比較高效。
如果數據比較多,truncate比較高效。
- 更新表記錄
update 表名 set 列名=列的值,列名2=列的值2 [where 條件]
需求:將sid爲5的名字改成李四
update student set sname='李四' where sid=5;
//如果參數是字符串或者日期,要加上單引號
select查詢的簡單查詢
select [distinct] [ * ] [列名,列名2] from 表名 [where 條件]
distinct:去除重複的數據
--簡單商品:手機數碼,鞋靴箱包
1.分類的ID
2.分類名稱
3.分類描述
//創建表
create table category(
cid int primary key auto_increment,
cname varchar(10),
cdesc varchar(31)
);
//插入數據
insert into category values(null,'手機數碼','電子產品');
insert into category values(null,'鞋靴箱包','江南皮鞋廠');
insert into category values(null,'香菸酒水','黃鶴樓');
insert into category values(null,'酸奶餅乾','安慕希');
insert into category values(null,'家用電器','美的空調');
--所有商品
1.商品ID
2.商品名稱
3.商品價格
4,生產日期
5,商品分類ID
//創建表
create table product(
pid int primary key auto_increment,
pname varchar(10),
price double,
pdate timestamp,
cno int
);
//插入數據
insert into product values(null,'xiaomi',998,null,1);
insert into product values(null,'chuizi',2998,null,1);
insert into product values(null,'nike',888,null,2);
insert into product values(null,'laocunzhang',88,null,3);
insert into product values(null,'jingjiu',32,null,3);
insert into product values(null,'xiaoxiong',3,null,4);
insert into product values(null,'weilong',0.5,null,5);
insert into product values(null,'wangwang',0.5,null,5);
- 簡單查詢
1.查詢所有的商品:
select * from product;
2.查詢商品名稱和商品價格
select pname,price from product;
3.別名查詢,as 的關鍵字 ,as關鍵字可以省略
-表別名:select p.pname,p.price,from product p;(主要用在多表查詢)
select p.pname,p.price
from product as p;
-列別名:select pname as 商品名稱,price as 商品價格 from product;
select pname as 商品名稱,price as 商品價格 from product;
4.去掉重複的值
-查詢商品所有的價格
select distinct price from product;
5.select運算查詢
select *,price*1.5 as 折後價 from product;
6.條件查詢[where關鍵字]
指定條件,確定要操作的記錄
-查詢商品價格大於60元的所有商品信息
select * from product where price>60;
7.where 後的條件寫法
-關係運算符:> >= < <= = != <>
<> : 不等於 :標準SQL語法
!= : 不等於 :非標準SQL語法
-查詢商品價格不等於88的所有商品
select * from product where price <> 88;
select * from product where price != 88;
-查詢商品價格在10到100之間的商品
select * from product where price<100 and price >10;
select * from product where price between 10 and 100;
-邏輯運算:and or not
-查詢出商品價格 小於100 或者大於900
select * from product where price <100 or price >900;
- 複雜查詢
1.like :模糊查詢
_ :代表的是一個字符
% :代表的是多個字符
in:在某個範圍內獲得值
-查詢出名字中帶有餅的所有商品 ‘%餅%’
select * from product where pname like '%餅%';
-查詢第二名字是熊的所有商品 '_熊%'
select * from product where pname like '_熊%';
-查詢出商品分類ID在1,4,5裏面的所有商品
select * from product where cno in (1,4,5);
2.排序查詢: order by 關鍵字
asc: ascend 升序(默認的排序方式)
desc: descend 降序
-查詢所有商品,按照降序排序
select * from product order by price desc;
-查詢名稱有“小”的商品,按照升序排序
select * from product where pname like '%小%' order by price asc;
3.聚合函數:
-獲得所有商品價格總和:
select sum(price) from product;
-獲得所有商品價格平均值:
select avg(price) from product;
-獲得所有商品的個數:
select count(*) from product;
4.分組:group by
-根據cno字段分組,分組後統計商品的個數
select cno,count(*) from product group by cno;
-根據cno字段分組,分組後統計商品的平均價格,並且商品平均價格 >60
select cno,avg(price) from product group by cno having avg(price) >60;
-having 關鍵字,他可以接聚合函數的, 出現在分組之後
-where 關鍵字,他不可以接聚合函數,出現在分組之前
補充:
編寫順序:
S..F..W..G..H..O
select..from..where..group by..having..drder by
執行順序:
F..W..G..H..S..O
from..where..group by..having..select..drder by