1_數據庫(一)

數據庫

1.數據庫,簡而言之可視爲電子化的文件櫃——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。
 
2.數據庫分類
 
    關係型數據庫: 描述實體與實體之間的關係
  •     mysql: 開源免費,中小型企業免費數據庫,
  •     mariadb: mysql創始人搞的,mysql開源的 一個分支,命令一樣
  •     oracle: 甲骨文公司,大型電商網站
  •     db2: IBM公司,銀行系統大多采用db2
  •     sqlserver: windows,政府,大學,圖形化工具不錯
 
    非關係型數據庫: key value
    mongodb
    redis
 
3.E-R關係圖( 必須要會畫 )
    實體: 矩形
    屬性: 橢圓
    關係: 菱形
 
4.MySQL數據庫服務器
  •     mysql數據庫: 數據庫管理軟件
  •     服務器: 相當於一臺電腦, 這臺電腦安裝了相關服務器軟件, 軟件會監聽不同的端口, 提供不同的服務.
 
5.MySQL 安裝和卸載
卸載:注意刪除my.ini配置文件
 
 
 
6.SQL語句( 結構化查詢語言 )
  • DDL: 數據定義語言: 定義數據庫, 數據表和它們的結構,create,drop,alter
  • DML: 數據操縱語言: 操作數據, indert, update, delete 
  • DCL: 數據控制語言: 定義訪問權限, 取消訪問權限, grant
  • DQL: 數據查詢語言 select from where
 
7.數據庫的CRUD操作
  • 首先登陸數據庫服務器mysql -uroot -p123456
 
create database 數據庫名;
create database day86;
 
--創建數據庫的時候,指定字符集
create database 數據庫名字 character set 字符集;
create database day8 character set utf8;
 
create database day8 characte set 字符集 collate 校對規則;
create database day8 characte set utf8 collate 校對規則;
 
校對規則是在字符集內用於比較字符的一套規則。讓我們使用一個假想字符集的例子來區別清楚。
假設我們有一個字母表使用了四個字母:‘A’、‘B’、‘a’、‘b’。
我們爲每個字母賦予一個數值:‘A’=0,‘B’= 1,‘a’= 2,‘b’= 3。字母‘A’是一個符號,數字0是‘A’的編碼,這四個字母和它們的編碼組合在一起是一個字符集。
 
 
  • 查看數據庫:
 
--查看數據庫定義的語句
show create database 數據庫的名字;
 
--查看所有數據庫
show databases;
 
infor_schema
performance_schema
mysql
這三個庫不要去動
 
  • 修改數據庫操作
 
alter database 數據庫的名字 character set 字符集;
alter database day08 character set gbk;
 
  • 刪除數據庫
 
drop database 數據庫的名字;
 
  • 其他操作
 
--切換數據庫(選中數據庫)
use 數據庫名字
use day06;
 
--查看一下當前正在使用的數據庫
select database();
 
 
8.表的CRUD 操作
  • 創建表
 
create database 數據庫的名字
 
create table 表名{
    列名1 列的類型(長度) 約束,
    列名2 列的類型(長度) 約束,
};
 
--列的類型:
java        sql
int          int
char/String        char/varchar
                           char(3): 固定長度(不夠補空格)
                           varchar(3): 可變長度
                            長度3代表字符的個數
double     double
float         float
boolean    boolean
                date: YYYY-MM-DD
                time: hh:mm:ss
                datatime: YYYY-MM-DD hh:mm:ss    默認是null
                timestamp: YYYY-MM-DD hh:mm:ss     默認使用當前時間
                text: 文本
                blob: 存放二進制
 
--列的約束
    主鍵約束: primary key
    唯一約束: unique
    非空約束: not null
    自動增長: auto_increment
 
創建表: 
    1. 分析實體: 學生
    2. 學生ID
    3. 姓名
    4. 性別
    5. 年齡
create table student(
    sid int primary key,
    sname varchar(10),
    sex int,
    age int
);
 
  • 查看錶
 
--查看所有表
    show tables;
 
--查看錶的定義
    show create table student;
 
--查看錶的結構
    desc student;
 
 
  • 修改表
 
--添加列(add)
alter table 表名 add 列名 列的類型 列的約束 
alter table student add chengji int not null;
 
--修改列(modify)
alter table student modify sex varchar(2);
 
--修改列名(change)
alter table student change sex gender varchar(2);
 
--刪除列(drop)
alter table student drop chengji;
 
 
 
--修改表名(rename)
rename table student to heima;
--修改表的字符集
alter table student character set gbk;
 
  • 刪除表
 
drop table student;
 
 
 
9.SQL完成對錶中數據的CRUE的操作
  • 插入數據
 
insert into 表名(列名1,列名2,列名3) values(值1,值2,值3);
insert into student(sid, sname, gender) values(1, '張三', '男');
 
--簡單寫法
  insert into student values(1, '張三', '男');
 
--批量插入
insert into student values
                (4,'zhangsan','男'),
                (4,'zhangsan','男'),
                (4,'zhangsan','男')
 
 
10.中文亂碼問題
 
 

 

 

 

    
 
 
  • 刪除操作
 
delete from 表名 [where 條件];
 
delete from student where sid = 1;
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 [distinct] [*] [列名,列名2] from 表名 [where 條件]
distinct: 去除重複的數據
 
--商品分類: 手機數碼, 皮靴箱包
1.分類ID
2.分類名稱
3.分類描述
Create table category (
    cid int primary key auto_increment,
    cname varchar(10),
    cdesc varchar(30)
);
 
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, '饞嘴零食','花生瓜子八寶粥');
 
select * form category;
select cname,cdesc from category;
 
--所有商品
1.商品ID
2.商品名稱
3.商品價格
4.商品數量
5.生產日期
6.商品分類ID
 
商品和商品分類: 所屬關係
 
create table product(
    pid int primary key auto_increment,
    pname varchar(10) ,
    price double,
    pdate timestamp,        (時間戳,默認當前時間)
    cno int
);
 
insert into product values(null, '小米mix8',998,null,1);
insert into product values(null, '錘子',2888,null,1);
insert into product values(null, '阿迪王',99,null,2);
insert into product values(null, '老白乾',598,null,3);
insert into product values(null, '敬酒',298,null,3);
insert into product values(null, '小熊餅乾',1,null,4);
insert into product values(null, '衛龍辣條',3,null,5);
 
--簡單查詢
--查詢所有商品信息
    select * from product;
--查詢商品名稱和商品價格
    select pname,price from product;
 
--別名查詢, as的關鍵字, as 關鍵字可以省略
    --表別名: select p.pname , p.price from product p; (主要用於奪標查詢)
    select p.pname as 商品名稱 , p.price as 商品價格 from product as p;
    select p.pname 商品名稱 , p.price 商品價格 from product  p;
 
--去掉重複的值
    --查詢所有商品的價格
    select price from product;
    select distinct price from product;
 
--select 運算查詢 僅僅在查詢結果上做了運算處理 + - * /
    select * , price *0.9 as 折後價 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;
 
--查詢商品價格大於100 或者 商品價格大於10
    select * from product where price > 100 or price  < 10;
 
--like : 模糊查詢
    -    :     代表是一個字符
    %    :    代表多個字符
--查詢出名字中帶 有餅的所有商品 '%餅%'
    select * from product where pname like '%餅%'; 
--查詢第二個名字是 酒的所有商品 '_%'
    select * from product where pname like '_酒%';
 
--in 在某個範圍中獲得值
    --查詢出商品分類 ID 在 1,4,5 裏面的所有商品
    select * from product where cno in (1,4,5);
 
--排序查詢: order by 關鍵字
    asc: ascend 升序    (默認)
    desc: descend 降序
 
    --0.查詢所有商品按照價格進行排序
        select * from product  order by price;
    --1.查詢所有的商品,按照價格進行降序 排序
        select * from product order by price desc;
    --2.查詢名稱有 幹 的商品 ,按照價格降序排序
        select * from product where pname like '%幹%' order by price  desc;
 
--聚合函數:
        sum() 求和
        avg() 求平均值
        count() 統計數量
        max()    最大值
        min()    最小值
    --1.獲得所有的商品價格的總和
        select sum(price) from product ;
    --2.獲得所有商品的平均價格
        select avg(price) from product;
    --3.獲得所有商品的個數
        select count(*) from product;
 
    --注意: where條件後面不能接聚合函數
    --查出商品價格大於平均價格的所有商品信息
     select * from product where price > avg(price); ×
    查出所有商品
    select * from product;
    大於
    平均價格
    select avg(price) from product;
 
    select * from product where price > (select avg(price) from product);
    
--分組: group by
    --1.根據cno字段分組,分組後統計商品id
        select cno,count(*) from product group by cno;
 
    --2.根據cno分組,分組統計每組的平均價格,並且商品平均價格 > 60
        select avg(price),cno from product group by cno
        having avg(price) > 60;
        
    --having 關鍵字 可以接聚合函數的 出現在分組之後 
    --where 關鍵字 他是不可以接聚合函數的 , 出現在分組之後 
 
--編寫順序
    select  ... from ... where ... group by ... having ... order by
 
--執行順序
    from ... where ... group by ... having select ... order by
 
IFNULL(expr1,expr2)
當expr1不爲空返回expr1,否則返回exp2。
例如:IFNULL(score,0)如果score不爲空返回score,否則返回0。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章