數據庫是一個文件系統,只不過咱們須要經過命令(SQL)來操做這個文件系統前端
數據庫,簡而言之可視爲電子化的文件櫃——存儲電子文件的處所,用戶能夠對文件中的數據進行新增、查詢、更新、刪除等操做。mysql
做用:儲存數據,數據的倉庫,帶有訪問權限限制不一樣的人能夠有不一樣的操做面試
數據庫操做的都是後臺數據,取到後臺數據進行封裝,而後交給前端去展示redis
常見的數據庫:sql
mysql:開源免費的適用於中小型企業的免費數據庫,sun公司收購了mysql,sun公司被oracle公司收購開始收費mongodb
mariadb:由mysql創始人搞出來的,直接是mysql開源版本的一個分支,基本上全部的命令都是同樣數據庫
oracle:甲骨文公司,商業軟件收費,適用於大型電商網站,收購了sun公司windows
db2:IBM公司,thinkpad,解決方法:軟件硬件,服務器架構包含全套軟件,穩定,銀行系統大多采用db2安全
sqlserver:windows裏面,政府網站asp.net,大學教學一般採用sqlserver,圖形化工具作的不錯服務器
sybase:被淘汰的數據庫
NOSQL非關係型數據庫:存放形式 key:value
mongodb
redis :set get 設置和得到數據
關係型數據庫:主要是用來描述實體與實體之間的關係
E-R關係圖:
實體:方框
屬性:橢圓
關係:菱形
Mysql數據庫服務器
MYSQL數據庫:數據庫管理軟件
服務器:就是一臺電腦,安裝相關的拂去軟件,這些軟件會監聽不一樣的端口號,根據用戶訪問的端口號提供不一樣的服務
MYSQL的安裝和卸載
安裝:
卸載:
1.打開程序控制面板刪除軟件MySQL Serve
2.刪除mysql安裝目錄下的全部文件C:\programs files\MySQL
3.刪除MySQL數據存放文件C:\programsData\MySQL
MySQL的SQL語句
SQL:Structure Query Language結構化查詢語言
DDL:數據定義語言:定義數據庫,數據表他們的結構:create建立 drop刪除 alter 修改
DML:數據操縱語言:主要是用來操做數據 insert插入 update 修改 delete刪除
DCL:數據控制語言:定義訪問權限定義取消訪問權限,安全設置 grant
DQL:數據查詢語言:select查詢 from字句 where字句
首先要登錄數據庫服務器:mysql -uroot -proot
(有的會出現問題,我就沒有那麼順利出問題了ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 以管理員權限運行cmd程序輸入 services.msc ; 找到MySQL 重啓動其服務 或者關閉修改密碼在網上搜方法,太長了懶得co過來)
建立數據庫
create database 數據庫的名字
create database hlj0628;
建立數據庫的時候指定字符集:
create database 數據庫的名字 character set 字符集;
create database hlj0628_1 character set utf8;
建立數據庫的時候指定字符集和校對規則:
create database 數據庫的名字 character set 字符集 collate 校對規則;
create database hlj0628_2 character set utf8 collate utf8_bin;
查看數據庫
查看全部數據庫 show databases;
information_schema
performance_schema
mysql
查看數據庫定義的語句
show create database 數據庫的名字
show create database hlj0628_1;
show create database hlj0628_2;
修改數據庫(通常不須要修改也不須要咱們建立)
修改數據庫的字符集
alter database 數據庫的名字 character set 字符集
alter database hlj0628_1 character set gbk; 把hlj0628_1字符集改爲gbk
刪除數據庫
drop database 數據庫的名字;
drop database hlj0628_2;
drop database test;
其餘數據庫的操做命令
切換數據庫
use 數據庫的名字;
use hlj0628;
查看當前正在使用的數據庫
select database();
建立表
create database 數據庫的,名字
create table 表名(
列名 列的類型 約束,
列名 列的類型 約束,
...
);
列的類型:
Java:int char/string duble float boolean date
sql: int char/varchar duble float boolean date time datetime timestamp text blob
char是固定的長度類型,varchar是可變長度類型,例如char(3)當存入的字符數不夠3個的時候會以空格填充顯示,varchar(3)存入的字符是多少個就是多少個,比較節省空間一點
date: YYYY-MM-DD
time: hh:mm:ss
datetime: YYYY-MM-DD hh:mm:ss 默認值是null
timestamp: YYYY-MM-DD hh:mm:ss 默認值使用當前時間
text: 主要用來存放當文本
blob: 存放二進制
列的約束:
主鍵約束:primary key
惟一約束:unique
非空約束:not null
建立表:
1.分析實體:學生
2.學生ID
3.姓名
4.性別
5.年齡
create table student(
sid int primary key,
sname varchar(31),
sex int,
age int
);
查看錶
show tables;
查看錶的定義
show create table 表名;
show create table student;
查看錶的結構
desc 表名;
desc student;
修改表
添加列(add),修改列(modify),修改列名(change),刪除列(drop),修改表名(rename),修改表的字符集
添加列(add)
alter table 表名 add 列名 列的類型 列的約束
alter table student add chengji int not null;
修改列(modify)
alter table 表名 modify 列名 修改內容;
alter table student modify sex varchar(2);
修改列名(change)
alter table 表名 change 原列名 修改後列名 列類的類型;
alter table student change sex gender varchar(2);
刪除列(drop)
alter table 表名 drop 列名;
alter table student drop chengji;
刪除表(rename)
rename table 原表名 to 新表名;
rename table student to hero;
修改表的字符集
alter table 表名 character set 字符集;
alter table hero character set gbk;
刪除表
drop table hero;
insert into 表名(列名1,列名2,列名3) values(值1,值2,值3);
insert into student(sid,sname,sex,age) values(1,'zhangsan',1,23);
查看錶中數據:select * from student;
簡單寫法插入全列能夠不寫列名直接寫值:insert into student values(2,'zhangsan',1,23);
只插入部分列列名不能省略:insert into student(sid,sname) values(3,'lisi');
批量插入:
insert into student values(4,'zhangsan',1,23),(5,'zhangsan',1,23),(6,'zhangsan',1,23);
單條插入和批量插入的效率:批量插入效率更高一些,
臨時解決方案:set names gbk; x至關因而告訴mysql服務器軟件,咱們在當前命令行下輸入的內容是GBK編碼。當命令窗口關閉以後,它再輸入中文就存在問題
永久解決辦法:修改my.ini配置(在mysql軟件安裝路徑裏) :暫停mysql,在安裝路徑中找到my.ini配置文件修改以下,把57行代碼改爲gbk,保存文件推出,啓動mysql
修改列的字符集alter table student change sname sname varchar(31) character set gbk;
查看錶格的全部元素show full fields from student;
alter database character set utf8;
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 的名字改爲lisa,若是參數是字符串或者日期要加上單引號,是數字直接寫
update student set sname='lisa' where sid=5;
若是後面沒有加條件,全部行都會更新update student set sname='lisa',sex=0;
select [distinct] [*] [列名,列名2] from 表名[where 條件];
distinct 去除重複的數據
select選擇顯示哪些列的內容
商品分類:
1.分類ID
2.分類名稱
3.分類描述
(auto_increment)表示id自動遞增
create table category(
cid int primary key auto_increment,
cname varchar(10),
cdesc varchar(31)
);
insert into category values(null,'phone','huawei,xiaomi');
insert into category values(null,'fruit','xinjiang,hainan');
insert into category values(null,'book','about love,ahout youth');
insert into category values(null,'milk','mengniu,yili');
只查詢名稱和描述 select cname,cdesc from category;
全部商品:
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,'xaiomi',998,null,1);
insert into product values(null,'watermelon',2.88,null,2);
insert into product values(null,'banana',6,null,2);
insert into product values(null,'Titanic','28,null,3);
insert into product values(null,'guangming',16,null,4);
insert into product values(null,'youge',13,null,4);
簡單的查詢:
查詢全部商品: select * from product;
查詢商品名稱和商品價格:select pname,price from product;
別名查詢.as關鍵字,as關鍵字是能夠省略的
表別名:select p.name,p.price from product p;(主要用在多表查詢)
select p.pname,p.price from product as p;
列別名:select pname as 商品名稱,price as 商品價格 from product;
select pname as name,price as money from product;
省略as
select pname name,price money from product;
去掉重複的值查詢
查詢商品全部的價格
select price from product;
select distinct price from product;
select運算查詢:僅僅在查詢結果上作了運算+-*/,在數據庫中不作改變
select *,price*1.5 from product;
select *,price*1.5 as discountprice from product;
條件查詢[where關鍵字] 指定條件,肯定要操做的記錄
查詢商品價格>60元的全部商品信息
select * from product where price > 60;
where後面的條件寫法
關係運算符:> >= < <= = != <>
<>:不等於:標準的SQL語法
!=:不等於:非標準的SQL語法
查詢商品價格不等於88的全部商品
select * from product where price <> 88;
select * from product where price != 88;
查詢商品價格在10-100之間的價格
select * from product where price > 10 and price <100;
between ... and...
select * from product where price between 10 and 100;
邏輯運算:and , or , not
查詢商品價格小於100胡總和商品價格大於900
select * from product where price < 100 or price >900;
like :模糊查詢
_ :表明的是一個字符
% :表明的手機多個字符
查詢出名字中帶有water的全部商品'%water%'
select * from product where pname like '%water%';
select * from product where pname like '_a%';
in 在某個範圍內得到值
select * from product where cno in (1,4,5);
asc :ascend 升序(默認的排序方式)
desc :descend 降序
查詢全部商品按照價格進行排序
select * from product order by price;
查詢全部商品按照價格進行降序排序
select * from product order by price desc;
查詢名稱中含有an的商品按照價格進行升序
select * from product where pname like '%an%' order by price asc;
sum() :求和
avg() :求平均值
count() :統計數量
nax() :最大值
min() :最小值
得到全部商品價格的總和
select sum(price) from product;
得到全部商品價格的平均價格
select avg(price) from product;
得到全部商品的個數
select count(*) from product;
注意where條件後面不能接聚合函數
查詢商品價格大於平局價格的全部商品
子查詢select * from product where price > (select avg(price) from product);
根據cno字段分組,分組後統計商品的個數
select cno,count(*) from product group by cno;
根據cno字段分組,分組統計每組商品的平均價格,而且商品平均價格大於10
select cno,avg(price) from product group by cno having avg(price) > 10;
注意where條件後面不能接聚合函數 出如今分組以前
having 關鍵字能夠接聚合函數,出如今分組以後
SQL代碼編寫順序
S---F---W---G---H---O
select . . from . . where . . group by . . having . . order by . .
執行順序
F---W---G---H---S---O
from . . where . . group by . . having . . select . . order by . .