mysql數據庫基本學習

1.jdbc連接mysql數據庫


2.修改MySQL\MySQL Server 5.0\my.ini配置文件,修改字符集default-character-set=utf8,
修改存儲引擎default-storage-engine=INNODB(若配置過,就不用修改了)


3.自增長的字段必須是主鍵,外鍵的兩個屬性必須相似


4.insert語句,當所有字段都要插入的時候,可以省略,自增長的可以寫成null/default,into可以省略
多個插入values(),(),(),有的字段沒有錄入可以寫成default,另外insert還有insert set,insert select,
但不常用,insert select:INSERT other SELECT id,username FROM USER WHERE id>1(將查詢的結果寫進指定的表)


5.SELECT sex FROM user GROUP BY sex/1


6.having條件的字段必須出現在select中或者是聚合函數,SELECT sex FROM USER GROUP BY sex HAVING MAX(id)>1


7.order by,默認asc,SELECT * FROM USER ORDER BY age,id DESC


8.limit,兩種語法形式SELECT * FROM USER LIMIT 2;(多少條,從第一條開始),SELECT * FROM USER LIMIT 2,2;(從第幾條開始,0是起始項;多少條)


9.having只能和group by連用,having後面只能是聚合函數或者是select中出現的字段


10.SELECT ROUND(AVG(price),2) FROM goods:四捨五入,2位小數


子查詢(必須出現在小括號裏):
any/some,all...比較運算符:=,!=,>=,<=
1.SELECT name FROM goods WHERE price >= (SELECT ROUND(AVG(price),2) FROM goods):括起來


2.any/some,all用於子查詢any與some等價,SELECT name FROM goods WHERE price >= ANY(SELECT price FROM goods WHERE cate='筆記本')




not in.in
1.SELECT name FROM goods WHERE price NOT IN(SELECT price FROM goods WHERE cate = '筆記本')


exists/not exist
1.如果子查詢返回任何航,exists將返回true,否則爲false)(不多用)


多表更新
方式一:建表,UPDATE goods INNER JOIN goods_cates ON cate=goods_cates.name SET cate=goods_cates.id,參照別的表,更新本表


方式二:CREATE TABLE goods_brands(
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(40) NOT NULL
)
SELECT brand_name NAME FROM goods GROUP BY brand_name:建表,插入,更高效,select和create的字段名要一致


連接(外鍵的逆向操作)
內連接,僅顯示連接的記錄,SELECT goods_cates.id,goods_cates.name FROM goods_cates INNER JOIN goods ON goods_cates.id=goods.cate_id;
外連接
左外連接,顯示左邊的全部記錄及右表符合連接條件的記錄
SELECT goods_cates.id,goods_cates.name FROM goods_cates LEFT JOIN goods ON goods_cates.id=goods.cate_id;
右外連接,顯示右邊的全部記錄及右表符合連接條件的記錄
SELECT goods_cates.id,goods_cates.name FROM goods_cates RIGHT JOIN goods ON goods_cates.id=goods.cate_id;


多表查詢
SELECT g.id,g.name,gc.name,gb.name,price FROM goods g INNER JOIN goods_brands gb INNER JOIN goods_cates gc 


無限分類的數據表設計
SELECT s.id,s.name,COUNT(p.name) parent_name FROM goods_types s LEFT JOIN goods_types p ON s.parent_id=p.id GROUP BY s.name ORDER BY id


多表刪除
DELETE t1 FROM goods t1 LEFT JOIN (SELECT id,NAME FROM goods GROUP BY NAME HAVING COUNT(NAME)>1) t2 ON t1.name=t2.name WHERE t1.id>t2.id




運算符和函數
字符函數:
concat():SELECT CONCAT('guo','-','hao');字符連接
concat_ws():SELECT CONCAT_WS('-','a','b','c');使用指定的分隔符進行字符連接
format():SELECT FORMAT(1234560.75,1);數字格式化,小數點的位數
lower():小寫函數;
upper():大寫函數;
left():SELECT UPPER(LEFT('mysql',2))獲取左邊字符;
right():獲取右邊字符;
length():獲取字符串長度
ltrim():刪除前導空格
rtrim():刪除後導空格
trim():刪除前後導空格,SELECT TRIM(LEADING '?' FROM '??mysql??'):刪除前導'?',SELECT TRIM(TRAILING '?' FROM '??mysql??'),SELECT TRIM(BOTH '?' FROM '??mysql??')
replace():SELECT REPLACE('??my??sql???','?','')
substring():SELECT SUBSTRING('mysql',1,2),(pos,length),SELECT SUBSTRING('mysql',1),SELECT SUBSTRING('mysql',-1),倒着數
[not] like:SELECT 'mysql' LIKE 'm%',SELECT * FROM USER WHERE username LIKE '%1%%' ESCAPE '1',escape告訴1後面一個的不需要當成通配符了
數值運算符:
ceil():上取整
floor():下取整
div:整數除法 selecr 3 div 4
mod:取模,對證書和浮點數都行
power():冪運算,power(3,3)
round():四捨五入
truncate():數字截斷,truncate(125,89,1)=125.8
[not] between ... and
[not] in():select 13 in(5,10,15,20)
is [not] null


日期函數
now():當前日期和時間
curdate():當前日期
curtime():當前時間
date_add():SELECT DATE_ADD('2014-3-12',INTERVAL 365 DAY),SELECT DATE_ADD('2014-3-12',INTERVAL -365 DAY)
datediff():SELECT DATEDIFF('2013-3-12','2014-3-11'),日期相差天數
date_format():SELECT DATE_FORMAT('2014-3-12','%m/%d/%Y'),SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點:%i分:%s秒')


信息函數
connection_id():鏈接id
database():當前數據庫
last_insert_id():最後插入的主鍵、自增長的id值
user():當前用戶
version():mysql版本信息


聚合函數:只有一個返回值
avg()
count()
max()
min()
sum()


加密函數
md5():信息摘要算法,一般用這個
password():密碼算法,修改客戶端密碼時用


自定義函數,user-defined function  UDF,參數,返回值
不帶參數:
CREATE FUNCTION chinese_time() RETURNS VARCHAR(30)
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點:%i分:%s秒')
帶參數:
CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2


DELIMITER //
CREATE FUNCTION adduser(username VARCHAR(20))
RETURNS INT UNSIGNED
BEGIN
INSERT USER(username) VALUES(username);
RETURN LAST_INSERT_ID();
END


;是mysql默認分隔符,符合結構則使用begin...end語句


存儲過程:是SQL語句和控制語句的預編譯集合,以一個名稱存儲並作爲一個單元處理.
sql命令的執行過程:sql命令->mysql引擎 分析->語法正確->可識別命令  執行->執行結果  返回->客戶端
優點:增強sql語句的功能和靈活性,實現較快的執行速度,減少網絡流量
創建無參sp:CREATE PROCEDURE sp1() SELECT VERSION()
調用:CALL sp1
創建有參sp:DELIMITER //
CREATE PROCEDURE removeUserById(IN _id INT UNSIGNED)
BEGIN
DELETE FROM USER WHERE id=_id;
END
參數不能和字段名一樣.,若一樣數據庫將認爲都是字段名
調用:CALL removeUserById(3)
IN和OUT
DELIMITER //
CREATE PROCEDURE removeUserAndReturnUserNums(IN _id INT SIGNED,OUT userNums INT UNSIGNED)
BEGIN
DELETE FROM USER WHERE id=_id;
SELECT COUNT(id) FROM USER INTO userNums;
END


執行:CALL removeUserAndReturnUserNums(1,@nums),nums是用戶變量,只對當前用戶使用的客戶端生效,用戶變量
查看:SELECT @nums
UPDATE USER SET username=CONCAT(username,"--imooc") WHERE id<=2
//存儲過程,用age刪除記錄,並返回刪除的記錄數,還剩多少記錄
DELIMITER //
CREATE PROCEDURE removeUserByAgeAndReturnInfos(IN _age SMALLINT UNSIGNED,OUT delUsers SMALLINT UNSIGNED,OUT userCounts SMALLINT UNSIGNED)
BEGIN
DELETE FROM USER WHERE age=_age;
SELECT ROW_COUNT() INTO delUsers;ROW_COUNT()是上次更新的數目
SELECT COUNT(id) INTO userCounts;
END
執行;call removeUserByAgeAndReturnInfos(20,@delNums,@userNums)
     select @delNums
     select @userNums


存儲引擎
併發控制:當多個鏈接對記錄修改時保證數據的一致性和完整性
鎖:讀鎖:在同一時間段內,多個用戶可以讀取同一個資源,讀取過程中數據不會發生任何變化;寫鎖:在任何時候只能有一個用戶寫入資源,當進行寫鎖時會阻塞其他的讀鎖或者寫鎖操作
鎖顆粒:表所,是一種開銷最下的鎖策略,對錶鎖;行鎖,是一種開銷最大的鎖策略,對記錄鎖。
事務處理:保證數據庫的完整性
事物的特徵:原子性,一致性,隔離性,持久性
外鍵:是保證數據一致性的策略
索引:是對數據表中一列或多列的值進行排序的一種結構,普通索引,唯一索引,全文索引,btree索引,hash索引
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章