SQL
1、 MySQL的語法規範和要求
(1)mysql的sql語法不區分大小寫,SQL語句關鍵字儘量大寫
MySQL的關鍵字和函數名等不區分大小寫,但是對於數據值是否區分大小寫,和字符集與校對規則有關。
show databases;
SHOW DATABASES;
ci(大小寫不敏感),cs(大小寫敏感),_bin(二元,即比較是基於字符編碼的值而與language無關,區分大小寫)
在sql語句中的值,除了數值類型(整數、小數),其他的類型都使用’'引起來。
例如:select * from t_employee where gender ='男';
如果在SQL中需要給字段取別名時,可以給別名加""。
如果別名中間沒有空格,"“可以省略,如果有空格,不能使用”"
select id as "編號", `name` as "姓名" from t_stu; #起別名時,as都可以省略
select id as 編號, `name` as 姓名 from t_stu; #如果字段別名中沒有空格,那麼可以省略""
select id as 編 號, `name` as 姓 名 from t_stu; #錯誤,如果字段別名中有空格,那麼不能省略""
上面的SQL使用``飄號,因爲name和系統關鍵字或系統函數名等預定義標識符重名了。
所有標點符號使用英文狀態下的半角輸入方式
必須保證所有(),單引號,雙引號是成對結束的
(2)命名時:儘量使用26個英文字母大小寫,數字0-9,下劃線,不要使用其他符號
(3)建議不要使用mysql的關鍵字等來作爲表名、字段名等,如果不小心使用,請在SQL語句中使用`(飄號)引起來
(4)數據庫和表名、字段名等對象名中間不要包含空格
(5)同一個mysql軟件中,數據庫不能同名,同一個庫中,表不能重名,同一個表中,字段不能重名
命名規範:
1、必須只能包含 A–Z, a–z, 0–9, _共63個字符
2、不能在對象名的字符間留空格
例如:create database xxx db; #錯誤的
一般 create database test;
創建test數據庫
3、避免重名
同一個DB數據庫中,表不能重名,
同一張表中,字段不能重名
同一個DBMS數據庫管理軟件中,數據庫不能重名
4、命名時不要使用關鍵字
create database database; #錯誤的
(6)標點符號:
必須成對
必須英文狀態下半角輸入方式
字符串和日期類型可以使用單引號’’
列的別名可以使用雙引號"",給表名取別名不要使用雙引號。取別名時as可以省略
如果列的別名沒有包含空格,可以省略雙引號,如果有空格雙引號不能省略。
(7)SQL腳本中如何加註釋
單行註釋:#註釋內容
單行註釋:–空格註釋內容 其中–後面的空格必須有
多行註釋:/* 註釋內容 */
#以下兩句是一樣的,不區分大小寫
show databases;
SHOW DATABASES;
#創建表格
#create table student info(...); #表名錯誤,因爲表名有空格
create table student_info(...);
#其中name使用``飄號,因爲name和系統關鍵字或系統函數名等預定義標識符重名了。
CREATE TABLE t_stu(
id INT,
`name` VARCHAR(20)
);
select id as "編號", `name` as "姓名" from t_stu; #起別名時,as都可以省略
select id as 編號, `name` as 姓名 from t_stu; #如果字段別名中沒有空格,那麼可以省略""
select id as 編 號, `name` as 姓 名 from t_stu; #錯誤,如果字段別名中有空格,那麼不能省略""
2、 SQL分類
SQL:
1、DDL:Data Define Language
數據定義語言,即定義數據的結構。
例如:create,drop,alter
2、DML:Data Manage Language
數據管理語言,對數據值的增、刪、改、查
例如:insert,delete,update,select
3、DCL:Data Control Language
數據控制語言,對權限、事務等的控制
例如:grant,revoke,commit,rollback等
DDL:數據定義語言,定義庫,表結構等,包括create,drop,alter等
數據定義語言,定義數據的結構
DML:數據操作語言,增刪改查數據,包括insert,delete,update,select等
數據管理語言 對數據的增刪改查 非常重要的。
DCL:數據控制語言,權限,事務等管理。
對權限、事務等的控制
3、 DDL 簡單的
DDL 數據定義語言 即定義數據的結構
create、drop、alter
1、查看所有數據庫
show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| blog |
| community |
| dianpingdb |
| eladmin |
| girls |
| gloryofkings |
| gmall |
| myblog |
| myemployees |
| mysql |
| performance_schema |
| renren_fast |
| safety |
| schooldb |
| sell |
| sm |
| student |
| sys |
| test |
+--------------------+
20 rows in set (0.01 sec)
mysql>
2、指定使用某個數據庫
use 數據庫名;
mysql> use test;
Database changed
mysql> desc test;
ERROR 1146 (42S02): Table 'test.test' doesn't exist
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| stu |
+----------------+
1 row in set (0.00 sec)
mysql>
3、創建數據庫
create database 數據庫名;
create database 數據庫名 charset 'utf8'; #在mysql中字符集名稱不要使用utf-8
create database 數據庫名 charset 'gbk';
mysql> create database liuawen;
Query OK, 1 row affected (0.00 sec)
mysql> create database liuawen charset `utf-8`;
ERROR 1115 (42000): Unknown character set: 'utf-8'
mysql> create database liuawen charset ‘utf-8’;
ERROR 1115 (42000): Unknown character set: '‘utf'
mysql> create database liuawen charset ‘utf8';
'> ;
'> ^C
mysql> create database liuawen charset 'utf8';
ERROR 1007 (HY000): Can't create database 'liuawen'; database exists
mysql> drop database liuawen;
Query OK, 0 rows affected (0.01 sec)
mysql> create database liuawen charset 'utf8';
Query OK, 1 row affected (0.00 sec)
mysql>
4、刪除數據庫
drop database 數據庫名;
mysql> create database liuawen charset 'utf8';
Query OK, 1 row affected (0.00 sec)
mysql> drop database liuawen;
Query OK, 0 rows affected (0.00 sec)
mysql>
5、查看某個庫下的所有表格
show tables ; #前提是前面有use 數據庫名;的語句
show tables from 數據庫名;
mysql> use myemployees;
Database changed
mysql> show tables;
+-----------------------+
| Tables_in_myemployees |
+-----------------------+
| departments |
| employees |
| jobs |
| locations |
+-----------------------+
4 rows in set (0.00 sec)
mysql> show tables from myemployees;
+-----------------------+
| Tables_in_myemployees |
+-----------------------+
| departments |
| employees |
| jobs |
| locations |
+-----------------------+
4 rows in set (0.00 sec)
mysql>
6、創建表格
create table 【數據名.】表名(
字段名1 數據類型,
字段名2 數據類型,
....
);
7、刪除表格
drop table 【數據庫名.]表名稱;
8、查看某個表結構
describe 【數據庫名.]表名稱;
desc 【數據庫名.]表名稱;
9、增加一列
alter table 【數據庫名.]表名稱 add 【column】 字段名 數據類型;
alter table 【數據庫名.]表名稱 add 【column】 字段名 數據類型 first;
alter table 【數據庫名.]表名稱 add 【column】 字段名 數據類型 after 另一個字段;
10、刪除一列
alter table 【數據庫名.]表名稱 drop 【column】 字段名;
11、修改列數據類型
alter table 【數據庫名.]表名稱 modify 【column】 字段名 新數據類型;
12、修改列名
alter table 【數據庫名.]表名稱 change【column】 舊字段名 新字段名 新數據類型;
13、修改列的位置
alter table 【數據庫名.]表名稱 modify 【column】字段名 數據類型 first;
alter table 【數據庫名.]表名稱 modify 【column】字段名 數據類型 after 另一個字段;
14、修改表名稱
alter table 舊錶名 rename 新表名;
rename table 舊錶名 to 新表名;
#一、DDL
#(一)操作database的SQL
#1、查看當前mysql數據庫管理軟件中的所有數據庫
show databases;
#2、使用某個數據庫
use 數據庫名;
#例如:use test;
#3、創建一個數據庫
create database 數據庫名;
#例如:
create database library;
#4、刪除一個數據庫
drop database 數據庫名;
#例如:
drop database 0513db;
#(二)操作表結構的SQL
1、查看某個數據庫下的所有表格
show tables;
mysql> show tables;
ERROR 1046 (3D000): No database selected
解決方案有兩種:
(1)先use,再操作表格
use 數據庫名;
show tables;
(2)show tables from 數據名;
2、創建某個表格
create table 【數據庫名.】表名稱(字段名1 數據類型,字段名2 數據類型,字段名3 數據類型);
create table 【數據庫名.】表名稱(
字段名1 數據類型,
字段名2 數據類型,
字段名3 數據類型
);
說明:如果前面有use語句,那麼【數據庫名.】可以省略
例如:
create table test.t_stu(
sid int,
sname varchar(20),
gender char,
birthday date,
score double
);
3、查看錶結構
desc 表名稱;
mysql> desc t_stu;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid | int(11) | YES | | NULL | |
| sname | varchar(20) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| score | double | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
類似於通過Class對象看類的信息。
4、修改表名稱
rename table 舊錶名 to 新表名;
alter table 舊錶名 rename 新表名;
例如:
rename table t_stu to student;
alter table student rename t_stu;
5、修改表結構
(1)增加一列,增加一個字段
alter table 表名稱 add 【column】 字段名 數據類型; #默認添加到最後
alter table 表名稱 add 【column】 字段名 數據類型 first;
alter table 表名稱 add 【column】 字段名 數據類型 after 另一個字段;
例如:增加一列,存儲電話號碼
alter table t_stu add tel char(11);
增加一列,存儲地址,添加到第一列的位置
alter table t_stu add address varchar(50) first;
增加一列,年齡,添加到sname的後面
alter table t_stu add age int after sname;
(2)修改,字段的數據類型或位置 modify 僅僅是修改字段數據類型 modify
alter table 表名稱 modify 【column】 字段名 新的數據類型;
alter table 表名稱 modify 【column】 字段名 數據類型 first;
alter table 表名稱 modify 【column】 字段名 數據類型 after 另一個字段;
例如:修改gender的數據類型爲char(2)
alter table t_stu modify gender char(2);
例如:修改address的位置到最後一列
alter table t_stu modify address varchar(50) after tel;
(3)修改,列的名稱
alter table 表名稱 change 【column】 舊字段名 新的字段名 數據類型;
例如:修改列的名稱tel爲phone
alter table t_stu change tel phone char(11);
(4)刪除一列
alter table 表名稱 drop 【column】 字段名;
例如:刪除地址列
alter table t_stu drop address;
6、刪除整張表
drop table 表名稱;
例如:drop table t_stu;
4、 DML 簡單的
DML:操縱數據的 增刪改查呢
1、添加數據
insert into 【數據庫名.]表名稱 values(值列表);
#要求值列表的順序、個數、類型,要與表格中的字段的順序、個數、類型一一匹配
insert into 【數據庫名.]表名稱(部分字段列表) values(值列表);
#要求列表的順序、個數、類型,要與前面的(部分字段列表)的順序、個數、類型一一匹配
insert into 【數據庫名.]表名稱 values(值列表1),(值列表2)。。。;
insert into 【數據庫名.]表名稱(部分字段列表) values(值列表1),(值列表2)。。。;
2、修改數據
update 【數據庫名.]表名稱 set 字段名1 = 值1, 字段名2 = 值2 。。。 【where 條件】;
如果沒有加where條件,表示修改所有行,這個字段的值
3、刪除數據
delete from 【數據庫名.]表名稱 【where 條件】;
如果沒有where條件,表示刪除整張表的數據;
truncate 【數據庫名.]表名稱;#刪除整張表的數據,還可以使用這個語句,效率更高,但是它不能回滾
用delete刪除整張表和用truncate刪除整張表的數據的區別?
(1)truncate速度快
(2)truncate無法回滾
truncate因爲底層是把表drop掉,然後新建了一張空表。
delete因爲底層是一行一行刪數據。
4、簡單查詢數據
select * from 【數據庫名.]表名稱; #查詢整張表的所有數據
select 字段列表 from 【數據庫名.]表名稱; #查詢部分列表
select * from 【數據庫名.]表名稱 【where 條件】;
select 字段列表 from 【數據庫名.]表名稱 【where 條件】;
使用distinct可以對查詢結果進行去重
#二、DML:增刪改查 對於程序員來說,DML的重要性要比你掌握DDL還要重要。
1、添加數據,往表中插入數據
(1)insert into 【數據庫名.】表名稱 values(值列表);
要求爲所有列賦值,(值列表)的類型、數量與表結構中列的類型、數量一致
(2)insert into 【數據庫名.】表名稱(字段列表) values(值列表);
爲(字段列表)指定的列賦值,(值列表)的數量與(字段列表)的類型、數量對應
(3)insert into 【數據庫名.】表名稱 values(值列表1),(值列表2)。。。;
(4)insert into 【數據庫名.】表名稱(字段列表) values(值列表1),(值列表2)。。。;
mysql> desc t_stu;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| sid | int(11) | YES | | NULL | |
| sname | varchar(20) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| score | double | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
例如:
insert into t_stu values(1,'張三','男','1995-05-09',89.5);
mysql> insert into t_stu values(2,'李四',60);
ERROR 1136 (21S01): Column count doesn't match value count at row 1'
insert into t_stu(sid,sname,score) values(2,'李四',60);
insert into t_stu values
(3,'王五','男','1993-05-09',80.5),
(4,'趙六','女','1992-05-09',82.5),
(5,'錢七','男','1991-05-09',82.5);
insert into t_stu(sid,sname,score) values
(6,'李六',60),
(7,'李七',70);
2、修改
update 【數據庫名.】表名稱
set 字段名1 = 新值,
字段名2 = 新值,
字段名3 = 新值
。。。
【where 條件】;
說明:如果沒有where條件,說明修改所有行的這幾個字段的值
例如:修改所有人的成績爲80分
update t_stu set score = 80;
例如:修改李四的成績爲40分
update t_stu set score = 40 where sname = '李四';
例如:把沒有填寫性別的學生的性別都設置爲'男'
update t_stu set gender = '男' where gender <=> null;
update t_stu set gender = '男' where gender is null;
<=> 安全等於
例如:修改所有人的成績都加10分
update t_stu set score = score + 10;
3、刪除數據
delete from 表名稱 【where 條件】;
例如:刪除所有數據,表結構還在
delete from t_stu;
例如:刪除成績是82.5的學生
delete from t_stu where score = 82.5;
4、查詢數據
(1)select * from 表名稱;
(2)select * from 表名稱 【where 條件】;
(3)select 字段列表 from 表名稱 【where 條件】;
例如:查詢全部
select * from t_stu;
例如:查詢哪些學生沒有填寫性別
select * from t_stu where gender is null;
例如:查詢沒有填寫性別的學生的姓名
select sname from t_stu where gender is null;
例如:查詢沒有填寫性別的學生的姓名和成績
select sname,score from t_stu where gender is null;
5、查詢時給字段取別名
字段名 as "別名"
其中:
(1)如果""中的別名沒有空格,可以省略""
(2)這個as可以省略
例如:查詢沒有填寫性別的學生的姓名和成績,查詢結果sname顯示姓名,score顯示成績
select sname as "姓名",score as "成績" from t_stu where gender is null;
select sname 姓名,score 成績 from t_stu where gender is null;
5、參考資料
記錄 - 搞定Java核心技術