mysql语法
一、基本概念
SQL--Structured Query Language, 結構化查詢語言,是關系型數據庫通用的操作語言。是一種非過程性語言。
?
二、操作數據庫
1.創建數據庫:
CREATE??DATABASE??[IF NOT EXISTS]??db_name??[create_specification [, create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name? | ?[DEFAULT] COLLATE collation_name
其中charset_name是為數據庫指定的默認字符集
Collate是為數據庫指定的默認校對規則
校對規則是在字符集內用于比較字符的一套規則,可以控制select查詢時where條件大小寫是否敏感的規則。
2.查看數據庫:
? SHOW DATABASES
? SHOW CREATE DATABASE db_name
3.修改數據庫:
ALTER?DATABASE?[IF NOT EXISTS] db_name??[alter_specification [, alter_specification] ...]
4.刪除數據庫
DROP DATABASE ?[IF EXISTS] ?db_name
5.選擇數據庫
use db_name;
?
三、操作表
1.sql中常見的數據類型:
1)字符串型:varchar、char
2)大數據類型:blob、text
3)數值型:tinyint(占1個字節)、smallint(占2個字節)、int(占4個字節)、bigint(占8個字節)、float(占4個字節)、double(占8個字節)
4)邏輯型:bit,位類型,可以存儲指定位的值,可以指定位的個數,如果不指定則默認值為1位,即只能保存0或1,對應到java中可以是boolean型
5)日期型:date、time、datetime、timestamp
**DATETIME和TIMESTAMP的區別?
* DATETIME和TIMESTAMP顯示的結果是一樣的,都是固定的"YYYY-MM-DD HH:MM:SS"的格式
* DATETIME支持的范圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。TIMESTAMP的顯示范圍是'1970-01-01 00:00:00'到2037年,且其實際的存儲值為1970年到當前時間的毫秒數。
* 在建表時,列為TIMESTAMP的日期類型可以設置一個默認值,而DATETIME不行。
* 在更新表時,可以設置TIMESTAMP類型的列自動更新時間為當前時間。
2.字段約束
1)定義主鍵約束:通常每張表都會有一個字段或多個字段聯合起來唯一標識表記錄,這樣的字段稱為這張表的主鍵。我們可以為這樣的字段增加主鍵約束。主鍵約束要求字段必須不能為空且值必須唯一。
增加主鍵約束:PRIMARY KEY
2)定義唯一約束:如果需要指定某個字段的值不能重復,可以為該字段指定唯一約束
增加唯一約束:unique
3)定義非空約束:如果需要指定某個字段的值不能為空,可以為該字段指定非空約束
增加非空約束:not null
4)外鍵約束:
3.操作表語句:
1)新增表:
CREATE TABLE table_name( field1 ?datatype, field2 ?datatype, field3 ?datatype)[character set 字符集]?[collate 校對規則]field:指定列名 datatype:指定列類型
注意:創建表時,要根據需保存的數據創建相應的列,并根據數據的類型定義相應的列類型。
2)查看表:
查看表結構:desc tabName
查看當前所有表:show tables
3)修改表
增加列:
ALTER TABLE tabname?ADD (column datatype [DEFAULT expr][, column datatype]...);
修改列:
ALTER TABLE tabname?MODIFY (column datatype [DEFAULT expr][, column datatype]...);
刪除列:
ALTER TABLE tabname?DROP (column);
修改表名:
ALTER TABLE old_tabname RENAME TO new_tabname;
或
RENAME TABLE old_tabname TO new_tabname;
修改列名稱:
ALTER TABLE tabname?CHANGE?[column] old_col_name?new_col_name?datatype
?
四、操作表記錄
1.insert:
INSERT INTO?tabname?[(column [, column...])]?VALUES?(value [, value...]);
注意:
插入的數據應與字段的數據類型相同
數據的大小應在列的規定范圍內
在values中列出的數據位置必須與被加入的列的排列位置相對應
字符串和日期格式的數據要用單引號引起來
如果要插入所有字段可以省寫列列表,直接按表中字段順序寫值列表
2.update
UPDATE?tab_name?SET?col_name1=expr1 [, col_name2=expr2 ...]??[WHERE where_definition]??
UPDATE語法可以用新值更新原有表行中的各列。
SET子句指示要修改哪些列和要給予哪些值。
WHERE子句指定應更新哪些行。如沒有WHERE子句,則更新所有的行。
3.delete
delete from tab_name?[WHERE where_definition]
where用來篩選要刪除的記錄,如果不使用where子句,將刪除表中所有數據。
delete語句不能刪除某一列的值(可使用update)
delete語句僅刪除記錄,不刪除表本身。如要刪除表,使用drop table語句。
TRUNCATE TABLE tab_name語句也可以刪除表中數據,它和delete有所不同。delete是一條條刪除記錄,truncate是摧毀整表再重建相同結構的表,truncate效率更高。
4.select
1)基本查詢
SELECT [DISTINCT] *|{column1, column2. column3..}?FROM table;
select 指定查詢哪些列的數據。
column指定列名。
*號代表查詢所有列。
from指定查詢哪張表。
DISTINCT可選,指顯示結果時,是否剔除重復數據
2)使用where字句查詢
Select *|列名 from tablename?[WHERE where_definition]
3)排序查詢
SELECT column1, column2. column3..?FROM?table?order by column asc|desc;
4)聚合函數
SQL提供的聚合函數有計數函數COUNT()、求和函數SUM()、平均值函數AVG()、最大值函數MAX()、最小值函數MIN()等
5)分組查詢
SELECT column1, column2. column3.. FROM table?group by column having ...
?
五、外鍵約束
1.外鍵概念:兩個表存在一對多關系時,可以通過外鍵明確的通知數據庫維系這種關系
2.建表時增加外鍵:foreign key(ordersid) references orders(id)
3.修改方式增加外鍵:
alter table book add [constraint FK_BOOK] foreign key(pubid) references pub_com(id) [on delete restrict] [on update restrict];
4.刪除外鍵:alter table 表名 drop foreign key 外鍵名
?
六、多表查詢設計
1.內連接查詢:
只查詢左邊表有且右邊表也有的數據,本質上是依據外鍵關系,在笛卡爾積查詢的基礎上過濾出正確的數據。通過觀察結果,我們發現結果中只有兩邊都有對應數據的數據才能被查出來。
select * from dept ,emp where dept.id = emp.dept_id;
select * from dept inner join emp on dept.id = emp.dept_id;
2.外連接查詢:
(1)左外連接查詢:在內連接的基礎上增加上左邊表有而有邊表沒有的記錄
select * from dept left join emp on dept.id = emp.dept_id;
(2)右外連接查詢:在內連接的基礎上增加上右邊表有而左邊表沒有的記錄
select * from dept right join emp on dept.id = emp.dept_id;
(3)全外連接查詢:在內連接的基礎上增加左邊表有而右邊表沒有的記錄和右邊表有而左邊表沒有的記錄
#mysql 不支持全外連接,但是其他的數據庫支持,比如SQL Server
select * from dept full join emp on dept.id = emp.dept_id;
#我們可以在mysql中使用union關鍵字模擬全外連接
select * from dept left join emp on dept.id = emp.dept_id
union
select * from dept right join emp on dept.id = emp.dept_id;
?
七、亂碼問題解決
查看當前數據庫中字符集配置:
show variables like'character%';
其中:
client是客戶端使用的字符集。
connection是連接數據庫的字符集設置類型,如果程序沒有指明連接數據庫使用的字符集類型就按照服務器端默認的字符集設置。
database是數據庫服務器中某個庫使用的字符集設定,如果建庫時沒有指明,將使用服務器安裝時指定的字符集設置。 ???
results是數據庫給客戶端返回時使用的字符集設定,如果沒有指明,使用服務器默認的字符集。 ??????
server是服務器安裝時指定的默認字符集設定。 ??????
system是數據庫系統使用的字符集設定。(utf-8不可修改)
set names xxx; 命令是客戶端通知服務器和當前客戶端交互時使用什么編碼,但是這種方式每次新開客戶端都需要通知服務器 很麻煩????
我們可以修改mysql/my.ini,將default-character-set=gbk,這是修改服務器默認認為的客戶端的字符集編碼
這樣一來,大部分人都是gbk的客戶端,不需要設置任何東西,連進來就沒亂碼.如果有個別的人客戶端不是gbk,也可以通過set names xxx;的方式聲明自己的編碼集,也沒有亂碼.
?
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/kkyl/p/9535611.html
總結
- 上一篇: 09_Java面向对象_第9天(类、封装
- 下一篇: 子宫内膜厚做试管婴儿会怎样