sql:結構化查詢語句
rdbms:關係型數據庫管理系統
數據庫設計三大範式:
1:原子性。數據庫的字段都是具有單一屬性的,不可再分。
2:唯一性。每個非主屬性都完全函數依賴於鍵碼。記錄具有唯一標識。每列都跟主鍵有關係。(以一對多爲例)
3:消除傳遞依賴。每個非主屬性都不偉遞領帶於鍵碼。即任何字段不能由其他字段派生出來,它要求字段沒有冗餘。
沒有冗餘的數據庫設計可以做到。但是,沒有冗餘的數據庫未必是最好的數據庫,有時爲了提高運行效率,就必須降低範式標準,適當保留冗餘數據。具體做法是:在概念數據模型設計時遵守第三範式,降低範式標準的工作放到物理數據模型設計時考慮。降低範式就是增加字段,允許冗餘。
INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關係的記錄。LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。
root@host# mysql -u root -p password; Enter password:******* mysql> use RUNOOB; Database changed mysql> SELECT * FROM tcount_tbl; +-----------------+----------------+ | runoob_author | runoob_count | +-----------------+----------------+ | mahran | 20 | | mahnaz | NULL | | Jen | NULL | | Gill | 20 | | John Poul | 1 | | Sanjay | 1 | +-----------------+----------------+ 6 rows in set (0.01 sec) mysql> SELECT * from runoob_tbl; +-------------+----------------+-----------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 1 | Learn PHP | John Poul | 2007-05-24 | | 2 | Learn MySQL | Abdul S | 2007-05-24 | | 3 | JAVA Tutorial | Sanjay | 2007-05-06 | +-------------+----------------+-----------------+-----------------+ 3 rows in set (0.00 sec) mysql>接下來我們就使用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一樣)來連接以上兩張表來讀取runoob_tbl表中所有runoob_author字段在tcount_tbl表對應的runoob_count字段值:
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author; +-----------+---------------+--------------+ | runoob_id | runoob_author | runoob_count | +-----------+---------------+--------------+ | 1 | John Poul | 1 | | 3 | Sanjay | 1 | +-----------+---------------+--------------+ 2 rows in set (0.00 sec)等價於:
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author; +-------------+-----------------+----------------+ | runoob_id | runoob_author | runoob_count | +-------------+-----------------+----------------+ | 1 | John Poul | 1 | | 2 | Abdul S | NULL | | 3 | Sanjay | 1 | +-------------+-----------------+----------------+ 3 rows in set (0.02 sec)
mysql> SELECT b.runoob_id, b.runoob_author, a.runoob_count FROM tcount_tbl a RIGHT JOIN runoob_tbl b ON a.runoob_author = b.runoob_author; +-------------+-----------------+----------------+ | runoob_id | runoob_author | runoob_count | +-------------+-----------------+----------------+ | 1 | John Poul | 1 | | 2 | Abdul S | NULL | | 3 | Sanjay | 1 | +-------------+-----------------+----------------+ 3 rows in set (0.02 sec)
http://www.runoob.com/mysql/mysql-join.html
DML 部分:
SELECT - 從數據庫表中獲取數據
UPDATE - 更新數據庫表中的數據
DELETE - 從數據庫表中刪除數據
INSERT INTO - 向數據庫表中插入數據
DDL 語句:
CREATE DATABASE - 創建新數據庫
ALTER DATABASE - 修改數據庫
CREATE TABLE - 創建新表
ALTER TABLE - 變更(改變)數據庫表
DROP TABLE - 刪除表
CREATE INDEX - 創建索引(搜索鍵)
DROP INDEX - 刪除索引
更新重點句子:
alter table add column price int(10)
alter table drop name;
drop table cq_user;
select distinct name from cq_itemtype;
select * from cq_user where namein('haha2','haha1;);
select * from cq_user wherename='haha1' or name='haha2';
select * from cq_itemtype where namelike '%石%';
select * from cq_itemtype where namelike '50朵_ _玫瑰';(注意是兩個_,因爲白、紅是漢字)
select * from cq_itemtype where id like'111_ _ _';(111開頭的6位數的id)
select * from cq_action where paramlike '!%data%' escape '!';
select count(*) from usertype;
select max(level) from cq_user;
select * from cq_itemtype group byname;
select * from cq_itemtype order bydesc/asc;
update cq_itemtype set name='白色',level=10 where id=10;
update cq_user set level=level+1;
delete from cq_action where id=1;
類型屬性:
◦ZEROFILL
–適用於所有數值類型數據數據列
–作用:如果數值的寬度小於定義的顯示寬度,則在數值前填充0
◦UNSIGNED
–作用:不允許數據列中出現負數,無符號型
◦AUTO_INCREMENT 自增長
◦NULL/NOT NULL
–作用:控制數據列的值是否爲空
主要的數據類型:
整數數據類型:int 4個字節
浮點數據類型:float4個字節,double8個字節
日期時間類型:date(0000-00-00),datetime(0000-00-0000:00:00)
字符串類型:char(n),varchar(n)
創建表:
CREATE TABLE<表名>
( <列名> <數據列類型><列屬性> [{<約束>}],
<列名> <數據列類型><列屬性>[{<約束>}],
……
)
create table cq_action(
id int(4) not null primary key,
name int(4))
create table cq_action(
id int(4) not null,
name int(4),
primary key(id))
表的修改:
alter table <表名> add<列定義>|<列約束>
alter table cq_action add price int(4)
alter tabke cq_action alter priceint(10)
alter table cq_action drop name
刪除表“
drop table cq_name
SELECT命令的格式
select [all|distinct] 列名 [[as] 別名]
from 表名[[as]表別名]
[where <檢索條件>]
[group by <列名>[having<條件表達式>]]
[order by <列名>[asc|desc]]
[limit 行數]
select * from cq_action
select distinct name from cq_action(顯示錶cq_action中的name字段,去除重複)
select name as username from cq_action(查詢顯示的結果爲別名)
select a.id,b.name from cq_userasa,cq_subject as b where a.id=b.typeId
條件查詢:
=,>,<,>=,<=,!=,<>比較大小
and ,or,not多重條件
in確定集合
like/not like字符匹配
is null空值
between and(>= and <=)確定範圍
select * from user where money>0andlevel>100
select * from user where id between 1and 4
select * from itemType where name='彎刀' or name='菜刀'
MySql的like語句中的通配符:百分號、下劃線和escape
%代表任意多個字符
Sql代碼
select * from user where usernamelike'%huxiao';
select * from user where usernamelike'huxiao%';
select * from user where usernamelike'%huxiao%';
_代表一個字符
Sql代碼
select * from user where username like'_';
select * from user where usernamelike'huxia_';
select * from user where usernamelike'h_xiao';
如果我就真的要查%或者_,怎麼辦呢?使用escape,轉義字符後面的%或_就不作爲通配符了,注意前面沒有轉義字符的%和_仍然起通配符作用
Sql代碼
select username from gg_user whereusernamelike '%xiao/_%' escape '/';
select username from gg_user where usernamelike'%xiao/%%' escape '/';
select * from user limit 100;
常用庫函數:
count接列值計算個數,就是一共有幾行,不計算空值,但可以計算到0。
max,min,avg,sum
select count(*) from itemtype
select max(level) from user;
分組查詢:group by將查詢結果按屬性或屬性列組合在行的方向上進行分組
select * from itemtype group by name
order by id desc(降序) asc(升序)
數據查詢:當查詢的時候涉及到兩個以上的表就是連接查詢。兩種方式:1)表與表之間滿足一定條件的列和行進行連接,from子句指明進行連接的表名,where子句指明連接的列名及其連接條件;
2)用join進行連接,用join關鍵字的時候,from子句中應該有關鍵詞on與之對應(個人不是很習慣這種方式)
select * from cq_goods,cq_itemtype
where cq_goods.itemtype=cq_itemtype.id
數據更新:
插入數據:insert into <表名> [<列名1>,<列名2>…] values(<值>)
列名是可選的
列名的順序沒有要求,但是如果有指定列名的話values後面的值也要是相對應的
insert intocq_action(id,id_next,id_nextfail,type,data,param) values
(500,0,505,503, 10000,'')
insert into cq_action values
(500,0,505,503, 10000,'')
修改數據:
update <表名>
set <列名>=<表達式>[,<列名>=<表達式>…..]
[where<條件>]
update cq_user set level=lever+1
刪除數據:
delete from <表名>
[where<條件>]
delete from cq_user where id=1000
delete from cq_user
--------------分界線--------下面的東西初級的用得少
數值類型:
整型:
BIT[(M)]
位字段類型。M表示每個值的位數,範圍爲從1到64。如果M被省略, 默認爲1
TINYINT[(M)] [UNSIGNED][ZEROFILL]
很小的整數。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
小的整數。
MEDIUMINT[(M)] [UNSIGNED][ZEROFILL]
中等大小的整數。
INT[(M)] [UNSIGNED] [ZEROFILL]
普通大小的整數。
BIGINT[(M)] [UNSIGNED][ZEROFILL]
大整數。
浮點型:
FLOAT[(M,D)] [UNSIGNED][ZEROFILL]
小(單精度)浮點數。如果M和D沒有寫,那麼單精度浮點數精確到大約7位小數位
DOUBLE[(M,D)] [UNSIGNED][ZEROFILL]
普通大小(雙精度)浮點數。如果M和D沒有寫,那麼雙精度浮點數精確到大約15位小數位
日期和時間類型:
DATETIME類型
需要同時包含日期和時間信息的值時使用,以‘YYYY-MM-DDHH:MM:SS’格式檢索和顯示DATETIME值,支持的範圍爲'1000-01-0100:00:00'到'9999-12-31 23:59:59‘
DATE類型
只需要日期值而不需要時間部分,用'YYYY-MM-DD'格式檢索和顯示DATE值
TIMESTAMP[(M)]
時間戳。範圍是'1970-01-0100:00:00'到2037年
TIME類型
以'HH:MM:SS'格式顯示TIME值,但允許使用字符串或數字爲TIME列分配值。
YEAR[(2|4)]類型
兩位或四位格式的年。默認是四位格式。在四位格式中,允許的值是1901到2155和0000。在兩位格式中,允許的值是70到69,表示從1970年到2069年。
字符類型:
—CHAR
◦是固定長度的,每個值佔用相同的字節,不夠的位數MySQL會在它的右邊用空格字符補足。
—VARCHAR
◦是一種可變長度的類型,每個值佔用其剛好的字節數再加上一個用來記錄其長度的字節即L+1字節。
—BINARY
◦二進制字符串
—varbinary
◦可變長度的二進制字符串