牀前明月光,MySQL知多少?舉頭望明月,刪庫跑路咯!

數據庫簡介

  • IO流數據存儲弊端
  1. 效率低
  2. 存取都麻煩
  3. 一般只能保存小量數據
  4. 只能保存文本數據

什麼是DB

  • Database:數據庫
  • 數據庫本質上就是一個文件集合 數據庫就是存儲數據的倉庫,本質上是一個文件系統,數據會按照特定的格式保存到文件中,用戶可以對數據庫中的數據進行增刪改查操作

什麼是DBMS

  • Database Management System: 數據庫管理系統
  • DBMS就是管理數據庫文件的軟件
  • 常見的DBMS有: MySQL、oracle、sqlserver、DB2、Sqlite
    DBMS是指一種管理數據庫的大型軟件,用於創建、管理、維護數據庫文件,對數據庫文件進行統一的管理和控制,用戶通過數據庫管理系統
    訪問數據庫中的數據

數據庫軟件的分類

  • 關係型數據庫: 經過數學理論驗證,可以將現實生活中任意關係保存關係型數據庫中,關係型數據庫中以表爲存儲單位
  • 非關係型數據庫: 用來解決一些特定場景,比如解決緩存問題,解決高併發問題 Redis數據庫(以鍵值對的形式保存數據)

主流關係型數據庫介紹

  • MySQL: 08年被Sun收購 09年Sun被Oracle收購,開源 ,由於被Oracle收購後性能大幅提升導致MySQL用戶量大增,Oracle用戶減少,公司計劃把MySQL閉源,原MySQL程序員離開Oracle公司,創建了MariaDB數據庫(Maria是公司老闆的女兒名字) 市場排佔有率第一
  • Oracle: Oracle公司,最貴,性能最高,市場佔有率排第二,閉源,拉里艾莉森32
  • SQLServer:微軟公司,閉源,市場佔有率第三,主要應用在.net開發的網站中
  • DB2:IBM公司產品,閉源
  • sqlite:輕量級數據庫 只有幾十k,應用在嵌入式設備中(包括移動設備)

開源和閉源

  • 開源:開放源代碼 免費,盈利方式靠賣服務 用戶多,有大牛程序員會無償的維護和升級
  • 閉源:源代碼私有 盈利方式靠賣軟件+服務 來錢快,會有大牛們攻擊,但是公司內部會花錢僱人維護升級

安裝數據庫軟件

  • 端口號使用默認的3306
  • 字符編碼選擇utf8

什麼是SQL

  • Structured(結構化) Query(查詢) Language(語言):結構化查詢語言
  • 用於用戶和數據庫軟件(DBMS)交流的語言,不管是增刪還是改查都需要使用SQL語言和DBMS交流
  • SQL是寫在客戶端中或Java代碼中,發送給DBMS,由DBMS解析執行

數據庫服務器

  • 服務器是高配置的電腦
  • 數據庫服務器就是在電腦上安裝了DBMS
  • DBMS(mysql) 具備網絡訪問能力

如何連接MySQL數據庫 Linux下打開終端 Windows裏面打開命令行

  • 在終端或命令行中輸入 mysql -uroot -p 然後回車 ,有密碼的寫密碼 如果沒有密碼的直接敲回車
  • 退出命令 exit

SQL規範

  • 以;結尾
  • 關鍵字之間要有空格 可以有多個空格
  • SQL語句中可以1個或多個換行
  • 關鍵字不區分大小寫

1. 數據庫相關sql

  • 查看所有數據庫:
show databases;
  • 創建數據庫:
create database db1;
  • 刪除數據庫:
drop database db1;
  • 查看單個數據庫詳情:
show create database db1;
  • 指定字符集:
create database db1 character set utf8/gbk;
  • 使用數據庫:
use db1;

2. 表相關sql

  • 創建表:
create table t1(id int,name varchar(10));
  • 查看所有表:
show tables;
  • 刪除表:
drop table t1;
  • 查看單個表:
show create table t1;
  • 創建表指定引擎和字符集:
create table t1(id int) engine=myisam/innodb charset=utf8/gbk;
  • 查看錶字段信息:
desc t1;
  • 修改表:
修改表名 rename table t1 to t2;
  • 修改表字符集和引擎:
alter table t1 engine=myisam/innodb charset=utf8/gbk;
  • 添加表的字段:
alter table t1 add age int first/(after xxx)
  • 刪除表字段:
alter table t1 drop age;
  • 修改表字段名稱和類型:
alter table t1 change age abc int;
  • 修改表的類型和位置:
alter table t1 modify age int first/(after xxx);

3. 數據相關sql

  • 插入數據:
insert into t1 values(1,2),(1,2),(1,2)
insert into t1 (字段名1,字段名2) values (1,2),(1,2);
  • 查詢數據:
select * from t1;  select name from t1; 
select name,age from t1 where id<100;
  • 修改數據:
update t1 set age=100 where id=10;
  • 刪除數據:
delete from t1 where id<10;

主鍵約束

什麼是主鍵:表示表中數據唯一性的字段稱之爲主鍵(主鍵只有一個)
什麼是約束: 約束就是創建表的時候給表中字段添加的限制條件
主鍵約束:添加了主鍵約束的字段,保存的數值必須唯一而且非空

  • 格式:
create table t1(id int primary key,name varchar(10));
  • 測試唯一: 以下代碼會報錯 主鍵值不能重複
insert into t1 values(1,'劉備');
insert into t1 values(1,'張飛');
  • 測試非空:
insert into t1 values(null,'關羽');

主鍵+自增約束

  • 格式:
create table t2(id int primary key auto_increment,name varchar(10));
  • 測試自增:
insert into t2 values(null,'關羽');
insert into t2 values(null,'悟空');
insert into t2 values(10,'八戒');
insert into t2 values(null,'沙僧');
delete from t2 where id>5;
insert into t2 values(null,'二郎神');
  • 自增的特點:
  1. 值爲null時會自動賦值
  2. 以表中曾出現的最大值基礎上+1;
  3. 刪除數據自增值不減
  4. delete清空表 自增數值不變
  • 如何讓自增數值清零? 使用truncate關鍵字 ,相當於:drop+create truncate table t2;

註釋 comment

  • 創建表的時候可以通過comment關鍵字對字段進行描述
  • 格式: create table t3(id int primary key auto_increment comment ‘這個字段是主鍵’,ename varchar(10),sal int comment ‘這是工資’);
  • 通過 show create table t3; 查看字段的註釋

`和’的區別

  • `的作用:是用來修飾表名和字段名的,可以省略
  • '的作用:是用來修飾字符串的

數據冗餘

由於表設計不夠合理,出現大量的重複數據,稱爲數據冗餘。可以通過拆分表的形式,把可能重複的數據保存到一張新的表中,在原表中只需要通過一個id建立關係即可。這種建立關係的字段稱之爲外鍵。

練習一: 保存商品的信息包括(商品id,商品名稱,商品價格,庫存,分類名稱,上級分類)
  1. 創建商品表(item):商品id, 商品名稱(name),商品價格(price),庫存(num),分類id(category_id)
create table item(id int primary key auto_increment,name varchar(10),price int,num int,category_id int);
  1. 創建分類表(category):分類id ,分類名稱(name),上級分類
create table category(id int primary key auto_increment,name varchar(10), parent_id int);
  • 以上表中插入數據:
    一、電器分類下的電視機分類下的康佳電視價格4480,庫存38
    二、第二條數據 鞋分類下的男鞋分類下的男運動鞋分類下的耐克運動鞋價格380,庫存99
  • 插入第一條數據:
insert into category values(null,'電器',null);
insert into category values(null,'電視機',1);
insert into item values(null,'康佳電視',4480,38,2);
  • 插入第二條數據:
insert into category values(null,'鞋',null);
insert into category values(null,'男鞋',3);
insert into category values(null,'男運動鞋',4);
insert into item values(null,'耐克運動鞋',380,99,5);
練習二:請設計表保存以下數據:保存教學部下java教研部的老師信息:蒼老師工資200 年齡18歲,然後再保存集團總部下銷售部,銷售A部的員資50,年齡28歲工李白工
  1. 創建部門表:
create table dept(id int primary key auto_increment,name varchar(10),parent_id int);
insert into dept values(null,'集團總部',null);
insert into dept values(null,'教學部',1);
insert into dept values(null,'Java教研部',2);
insert into dept values(null,'銷售部',1);
insert into dept values(null,'銷售A部',4);
  1. 創建員工表:
create table emp(id int primary key auto_increment,name varchar(10),sal int,age int,dept_id int);
insert into emp values(null,'蒼老師',200,18,3),(null,'李白',50,28,5);

事務

什麼是事務:事務是數據庫中執行sql語句的最小工作單元,把多條sql語句放在事務中可以保證多條sql要麼全部成功,要麼全部失敗。

  • 測試事務:
  1. 創建person表::
create table person(id int primary key auto_increment,name varchar(10),money int);
  1. 插入數據:
insert into person values(null,'超人',200),(null,'鋼鐵俠',1000);
  • 查看數據庫的自動提交狀態
show variables like '%autocommit%';
  • 關閉自動提交 0 打開自動提交 1
set autocommit=0;

轉賬驗證過程

  • 把自動提交關掉: set autocommit=0;
  • 讓超人+300 : update person set money=500 where id=1;
  • 此時打開另外一個終端use db2; 查詢數據select * from person;(數據庫中的數據此時並沒有修改)
  • 回到第一個終端窗口,讓鋼鐵俠300 update person set money=700 where id=2; (當前窗口查詢數據時因爲查詢的是內存中的數據,所以數據變了,但是此時去第二個窗口查看數據庫中的數據並沒有發生改變)
  • 在第一個窗口中執行手動提交commit; 此時會把內存中的多次SQL在內存中的執行結果 同時提交到數據庫中(此時兩個終端全部發生改變)

is null

  • 查詢獎金爲null的所有員工信息
select * from emp where comm is null;
  • 查詢沒有上級領導(mgr)的員工信息
select * from emp where mgr is null;

is not null

  • 查詢emp表中有獎金的員工信息
select * from emp where comm is not null;

別名

  • 查詢emp表中所有的姓名,把ename改成姓名
select ename as '姓名' from emp;
select ename '姓名' from emp;
select ename 姓名 from emp;

去重:distinct

  • 查詢所有員工從事的工作
select distinct job from emp;

比較運算符 >,<,>=,<=,=,!=和<>

  • emp:comm獎金、job工作職位、sal工資、mgr領導編號、deptno部門編號
  • t_item:price單價、num庫存
  1. 查詢工資小於等於1600的所有員工姓名和工資
select ename,sal from emp where sal<=1600;
  1. 查詢部門編號是20的所有員工姓名、職位job、部門編號
select ename,job,deptno from emp where deptno=20;
  1. 查詢職位是manager的所有員工的姓名和職位
select ename,job from emp where job='manager';
  1. 查詢部門不是10號部門的所有員工的姓名和部門編號 使用兩種寫法
select ename,deptno from emp where deptno!=10;
select ename,deptno from emp where deptno<>10;
  1. 查詢t_item表中單價等於23的商品名稱和價格
select title,price from t_item where price=23;
  1. 查詢單價不等於8443的商品信息
select * from t_item where price!=8443;

and 和 or

  • and和java中的&&效果一樣
  • or和java中的||效果一樣
  1. 查詢不是10號部門並且工資小於3000的員工信息
select * from emp where deptno!=10 and sal<3000;
  1. 查詢部門編號是30或者上級領導爲7698的員工姓名,職位,上級領導編號和部門編號
select ename,job,mgr,deptno from emp where deptno=30 or mgr=7698;

in

  • 查詢工資等於5000,1500,3000的員工信息
select * from emp where sal=5000 or sal=1500 or sal=3000;
select * from emp where sal in (5000,1500,3000);

between x and y 查詢x和y之間的數值(包含x和y)

  • 查詢工資在2000和4000之間的員工信息
select * from emp where sal>=2000 and sal<=4000;
select * from emp where sal between 2000 and 4000;

like

  • like:用於模糊查詢
  • _: 代表單個未知字符
  • %:代表0個或多個未知字符
  • 舉例
  1. 包含字符a:%a%
  2. 以a開頭:a%
  3. 以a結尾:%a
  4. 第二個字符是a:_a%
  5. 倒數第三個字符是a:%a__
  6. 第二個字符是a 最後一個字符是b:_a%b

like案例

  • 查詢標題中出現筆記本的商品標題
select title from t_item where title like '%筆記本%';
  • 查詢單價在50到200之間的得力商品(title中出現得力)
select * from t_item where price between 50 and 200 and title like '%得力%';
  • 查詢有圖片的得力商品(image字段不爲null)
select * from t_item 
where image is not null and title like '%得力%';
  • 查詢標題中不包含得力的商品信息
select * from t_item
where title not like '%得力%';
  • 查詢有贈品的的商品信息(在sell_point字段中包含贈字)
select * from t_item
	where sell_point like '%贈%';

排序

  • order by寫在where的後面
  • order by後面寫排序的字段名,可以寫一個或多個
  • 默認排序規則爲升序,也可以指定規則: 升序(asc)降序(desc)
  • 舉例:select name,money from person where money>5000 order by money asc/desc;

分頁查詢:limit

  • limit x,y x代表跳過的條數 y代表查詢的條數(每頁的條數)

  • limit,寫在最後

  • 舉例1:查詢第一頁的10條數據limit 0,10

  • 舉例2:查詢第五頁的8條數據limit 32,8

  • 舉例3:查詢第三頁每頁3條數據limit (3-1)*3,3

  • 查詢所有商品的價格,價格升序,顯示第二頁,每頁7條數據

select price from t_item order by price limit 7,7;
  • 查詢工資前三名的員工信息
select * from emp order by sal desc limit 0,3;
  • 查詢20部門中工資最高的員工信息
select * from emp where deptno=20 order by sal desc limit 0,1;  
  • 查詢dell商品中價格最便宜的商品名稱和價格
select title,price from t_item where title like '%dell%' order by price limit 0,1;

日期相關函數

select 'helloworld';
  • 獲取當前日期+時間 now()
select now();
  • 獲取當前的日期
select curdate();
  • 獲取當前時間
select curtime();
  • 從年月日時分秒中提取年月日 和提取時分秒
select date(now());
select time(now());
  • 從年月日時分秒中提取年,月,日,時,分,秒
select extract(year from now());
select extract(month from now());
select extract(day from now());
select extract(hour from now());
select extract(minute from now());
select extract(second from now());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章