1. 程式人生 > 實用技巧 >資料庫sql語句

資料庫sql語句

資料庫分類

早期: 層次式資料庫、網路型資料庫
現在:關係型資料庫、非關係型資料庫

什麼是關係型資料庫?

底層以二維表的形式儲存資料的庫就是關係型資料庫

連線mysql伺服器

mysql -uroot -p密碼

資料庫及表操作

SHOW DATABASES; 檢視當前資料庫伺服器中的所有庫

CREATE DATABASE mydb1; – 建立mydb1庫

use mysql;-- 進入mysql資料庫 總共四個庫

shows tables;-- 檢視當前庫所有表

create database mydbl charset utf8;-- 建立mydb1庫 ,指定編碼為utf8

create database if not exists mydb1 charset utf8; 如果不存在則建立庫

show create database mydb1; 檢視簡歷庫的語句

drop table if exists stu;-- 如果存在stu表 刪除stu表

– 如果存在,則刪除stu表
drop table if exists stu;-- 如果存在stu表 刪除stu表
– 建立stu學生表
create table stu(
id int primary key auto_increment,-- 給id新增主鍵約束 並設定自增
name varchar(50),
gender varchar(10) not null,-- 給gender新增非空約束
brithday date,
score double

);
desc stu;-- 查看錶

插入記錄
insert into stu values(null,‘join’,‘male’,‘2012-5-5’,89.5);

修改語法
update stu set score=score+10;

update stu set score=100 where id=1;

查詢語句
select name,sal,bonus from emp; *為萬用字元查詢所有資訊

distinct為剔除重複的資料
select distinct dept,job from emp;

重新命名前面有as 可以省略
select name,sal+bonus 總薪資 from emp;-- 求所有員工總薪資

判斷指定的列是否包含null值,如果有null值,用第二個值替換null值,null 值和任何值相加的值都為null;
select name,sal+ifnull(bonus,0) 總薪資 from emp where sal+ifnull(bonus,0)>3500;

between在什麼之間
select name,sal from emp where sal between 3000 and 4500;-- 包括3000和4500
select name,sal from emp where sal>=3000 and sal<=4500;

查詢emp表中【薪資為 1400、1600、1800】的員工,顯示員工姓名和薪資
select name ,sal from emp where sal=1400 or sal=1600 or sal=1800;
select name,sal from emp where sal in(1400,1600,1800);

與上相反
select name ,sal from emp where not(sal=1400 or sal=1600 or sal=1800);-- not表示取反
select name,sal from emp where sal not in(1400,1600,1800);

查詢沒有部門的員工(即部門列為null值)
select name from emp where dept is null; 此處不能用dept=null;

模糊查詢
可以和萬用字元(%、_)配合使用,其中"%"表示0或多個任意的字元,"_"表示一個任意的字元
語法SELECT 列 | * FROM 表名 WHERE 列名 LIKE 值
select name from emp where name like ‘劉%’;

多行函式查詢
在這裡插入圖片描述

在這裡插入圖片描述
分組查詢
在這裡插入圖片描述

排序中心
在這裡插入圖片描述

分頁查詢
在這裡插入圖片描述
其他函式
在這裡插入圖片描述
在這裡插入圖片描述
mysql資料型別

tinyint:佔用1個位元組,相對於java中的byte
smallint:佔用2個位元組,相對於java中的short
int:佔用4個位元組,相對於java中的int 常用
bigint:佔用8個位元組,相對於java中的long
其次是浮點型別即:float和double型別
float:4位元組單精度浮點型別,相對於java中的float
double:8位元組雙精度浮點型別,相對於java中的double 常用

char(n)定長字串,最長255個字元。n表示字元數,用於儲存固定長度的資料
建立user表,指定使用者名稱為char型別,字元長度不超過10
create table user(
username char(10),

);

2、varchar(n)變長字串,最長不超過65535個位元組,n表示字元數,一般超過255個字元,會使用text型別,例如:
建立user表,指定使用者名稱為varchar型別,長度不超過10
create table user(
username varchar(10)
);

3、大文字(長文字)型別
最長65535個位元組,一般超過255個字元列的會使用text。
– 建立user表:
create table user(
resume text
);
擴充套件內容3:(面試題)char(n)、varchar(n)、text都可以表示字串型別,其區別在於:
(1)char(n)在儲存資料時,如果存入的字串長度小於指定的長度n,後面會用空格補全,因此可能會造成空間浪費,但是char型別的儲存速度較varchar和text快。
因此char型別適合儲存長度固定的資料,這樣就不會有空間浪費,儲存效率比後兩者還快!
(2)varchar(n)儲存資料時,按資料的真實長度儲存,剩餘的空間可以留給別的資料用,因此varchar不會浪費空間。
因此varchar適合儲存長度不固定的資料,這樣不會有空間的浪費。
(3)text是大文字型別,一般文字長度超過255個字元,就會使用text型別儲存。

日期型別
date:年月日
time:時分秒
datetime:年月日 時分秒
timestamp:時間戳(實際儲存的是一個時間毫秒值),與datetime儲存日期格式相同。兩者的區別是:

  • timestamp最大表示1970-2038年,而datetime範圍是1000~9999
  • timestamp在插入資料、修改資料時,可以自動更新成系統當前時間(後面用到時再做講解)
  • 2008-5-1-12:00:00

mysql的欄位約束
主鍵約束
主鍵約束:如果為一個列添加了主鍵約束,那麼這個列就是主鍵,主鍵的特點是(不能重複),唯一且不能為空
主鍵的作用: 作為一個唯一標識,唯一的表示一條表記錄(作用類似於人的身份證號,可以唯一的表示一個人一樣。)
新增主鍵約束,例如將id設定為主鍵:
create table stu(
id int primary key auto_increment,

);
非空約束
create table user(
password varchar(50) not null,

);

唯一約束
唯一約束:如果為一個列添加了唯一約束,那麼這個列的值就必須是唯一的(即不能重複),但可以為空。
create table user(
username varchar(50) unique not null,

);

外來鍵約束
在  這裡插入圖片描述
(2)如果將dept_id列設定為外來鍵,等同於通知資料庫,部門表和員工表之間存在對應關係,dept_id列中的資料要參考部門的主鍵,資料庫一旦知道部門和員工表之間存在關係,就會幫我們維護這層關係。
思考:如果在建立表時沒有指定外來鍵,那麼後期該如何指定外來鍵?以及如何刪除外來鍵?

表關係

常見的表關係分為以下三種:

一對多(多對一)、一對一、多對多
在這裡插入圖片描述
在這裡插入圖片描述
連線查詢
查詢部門和部門對應的員工資訊
select * from dept,emp;

select * from dept,emp where dept.id=emp.dept_id;

select * from dept inner join emp
on emp.dept_id=dept.id;-- 內連線查詢,和上面的查詢結果一樣.

左外連線查詢
在這裡插入圖片描述
右外連線查詢
在這裡插入圖片描述
在這裡插入圖片描述
子查詢練習
在這裡插入圖片描述
多表練習查詢
在這裡插入圖片描述
在這裡插入圖片描述

JDBC概述

JDBC(Java DataBase Connectivity) Java資料庫連線
其實就是利用Java語言/程式連線並訪問資料庫的一門技術
之前我們可以通過CMD或者navicat等工具連線資料庫
但在企業開發中,更多的是通過程式(Java程式)連線並訪問資料庫,通過Java程式訪問資料庫,就需要用到JDBC這門技術。
在這裡插入圖片描述
單元測試補充
單元測試:不用建立新的類,也不用提供main函式,也不用建立類的例項,就可以直接執行一個方法
加了@Test註解的方法,可以通過單元測試(junit)框架測試該方法。底層會建立該方法所在類的例項,通過例項呼叫該方法。

SQL注入攻擊

通過上面的案例,我們發現在執行時,不輸入密碼只輸入使用者名稱也可以登陸成功。這就是SQL注入攻擊。
SQL注入攻擊產生的原因: 由於後臺執行的SQL語句是拼接而來的:
select * from user where username=’"+user+"’ and password=’"+pwd+"’
其中的引數是使用者提交過來的,如果使用者在提交引數時,在引數中摻雜了一些SQL關鍵字(比如or)或者特殊符號(#、-- 、’ 等),就可能會導致SQL語句語義的變化,從而執行一些意外的操作(使用者名稱或密碼不正確也能登入成功)!
在這裡插入圖片描述
防止SQL注入攻擊

如何防止SQL注入攻擊?
(1)使用正則表示式對使用者提交的引數進行校驗。如果引數中有(# – ’ or等)這些符號就直接結束程式,通知使用者輸入的引數不合法
(2)使用PreparedStatement物件來替代Statement物件。

資料庫連線池

池:指記憶體中的一片空間(容器,比如陣列、集合)
連線池:就是將連線存放在容器中,供整個程式共享,可以實現連線的複用,減少連線建立和關閉的次數,從而提高程式執行的效率!

在傳統方式中,每次使用者需要連線訪問資料庫時,都是建立一個連線物件,基於這個連線物件訪問資料庫,用完連線後,會將連線關閉(conn.close)。
在這裡插入圖片描述

可以在程式一啟動時,就建立一批連線放在一個連線池中(容器),當用戶需要連線時,就從連線池中獲取一個連線物件,用完連線後,不要關閉,而是將連線再還回連線池中,這樣一來,用來用去都是池中的這一批連線,實現了連線的複用,減少了連線建立和關閉的次數,從而提高了程式執行的效率!
在這裡插入圖片描述

HTML、CSS

HTML: 用於開發網頁的一門技術
CSS: 用於修飾、渲染網頁的一門技術
HTML+CSS可以開發一個非常美觀、非常漂亮的網頁
開發網頁 蓋房子
HTML標籤搭建網頁的結構 磚塊(搭建房子的結構)
CSS屬性 石灰、油漆等塗料

HTML是什麼

HTML(Hyper Text Markup Language): 超文字標記語言

(1)使用HTML開發的網頁檔案通常以 .htm或 .html 為字尾!
(2)使用HTML開發的網頁檔案由瀏覽器負責解析並顯示(瀏覽器就是一個html解析器)
(3)HTML是文件的一種(txt/word/ppt/pdf等)
總結: HTML就是用於開發網頁的一門語言!!

html註釋
格式: <!-- 註釋內容 -->
可以使用 <br/> 標籤做換行
可以使用&nbsp;&emsp;做空格

href 屬性用於指定點選超連結後將要跳轉到的URL地址
target屬性用於指定以何種方式開啟超連結
_self:預設值, 表示在當前視窗中開啟超連結
_blank:表示在新的視窗中開啟超連結

表單標籤
在這裡插入圖片描述
表單項標籤
在這裡插入圖片描述

什麼是伺服器?

(1) 伺服器硬體:是指在網際網路上具有獨立IP地址的計算機,比如我們自己用的計算機也可以作為伺服器使用。
(2) 伺服器軟體:就是一個計算機程式,比如MySQL伺服器軟體,tomcat伺服器軟體。伺服器軟體分為很多型別,比如:ftp伺服器,資料庫伺服器,web伺服器軟體,郵件伺服器等。

Web伺服器?

(1) web伺服器是指駐留在網際網路上的某種型別的計算機程式。當瀏覽器訪問伺服器,請求伺服器上的檔案時,伺服器將會處理該請求,並將請求的檔案響應給瀏覽器,並會附帶一些資訊告訴瀏覽器如何檢視該檔案(即檔案的型別)
在這裡插入圖片描述
在這裡插入圖片描述
2、啟動tomcat伺服器
啟動、關閉tomcat伺服器:
通過 [tomcat根目錄]/bin/startup.bat 可以啟動tomcat伺服器;
通過 [tomcat根目錄]/bin/shutdown.bat 可以關閉tomcat伺服器;

在這裡插入圖片描述
什麼是HTTP協議?
HTTP協議是用於規定瀏覽器和伺服器之間的通訊方式/規則
主要規定了瀏覽器給伺服器傳送的請求資訊的格式
以及規定了伺服器給瀏覽器傳送響應資訊的格式

2、問題2:GET提交和POST提交有什麼區別?
主要區別體現在請求引數傳輸過程的不相同
GET提交:

  • 將資料通過問號拼接在位址列URL地址的後面,相對非常不安全。
  • 將資料拼接在位址列URL地址的後面,資料量是有限制的,通常不能超過1KB或者4KB。
    POST提交:(form)
  • POST提交是通過請求實體將資料提交給伺服器,不會顯示在位址列上,因此相對更加安全。
  • POST提交通過請求實體提交資料,資料量理論上是沒有限制的。
    3、總結:
  • 如果只是單純做一個跳轉,請求中沒有資料,儘量使用GET提交。
  • 如果在請求中有資料,但資料量不大,並且資料沒有隱私性,也儘量使用GET提交。
  • 如果在請求中有資料,資料量比較大或者資料較為隱私,此時推薦使用POST提交。

什麼是Servlet?

Servlet是由SUN公司提供的一門動態Web資源開發技術
靜態Web資源:不同的人,在不同的條件下訪問後看到的是相同的效果,這樣的資源叫做靜態Web資源(html、css、js等)
動態Web資源:在不同的訪問條件下看到的是不同的效果,這樣的資源叫做動態Web資源
(Servlet、jsp、.NET、PHP等)
Servlet本質上是一段Java程式,和之前的Java程式不同的是,Servlet程式無法獨立執行,需要將Servlet程式放在伺服器中(比如tomcat伺服器),由伺服器呼叫才可以執行。
Servlet: 伺服器端的Java程式.
Servlet是執行在伺服器端的Java程式,其作用是什麼?
其作用是對伺服器接收過來的請求進行處理(作用為處理請求)

在這裡插入圖片描述