MySQL數據庫CRUD語句快速入門
SQL語句
sql語句,一種用於操作數據庫的語言
數據庫, 簡單地理解為硬盤上的文件, 可以存放數據
sql 語句大致可以分類兩大類
進入數據庫的方法: www.2cto.com
1. 命令行代碼:
進入數據庫C:\mysql -hlocalhost -P3306 -uroot -p123456
啟動數據庫 net start mysql
停止數據庫net stop mysql
一、針對數據庫database和表table的操作
1、database和table的常見操作
創建create
查看show
修改alter
刪除drop
// 創建一個數據庫
create database mydb;
// 查看所有的數據庫庫
show databases;
// 刪除 mydb
drop database mydb;
// 刪除 user 表
drop table user;
針對表中的記錄的操作 www.2cto.com
增 insert
刪 delete
改 update
查 select
2 操作數據庫
創建一個名稱為mydb1的數據庫
create database mydb1;
創建一個使用utf-8字符集的mydb2數據庫。
create database mydb2 character set utf8;
創建一個使用utf-8字符集,並帶校對規則的mydb3數據庫。
create database mydb3 character set utf8 collate utf8_general_ci;
查看當前數據庫服務器中的所有數據庫
show databases;
查看前面創建的mydb2數據庫的定義信息,字符信息
show create database mydb2;
刪除前面創建的mydb3數據庫
drop database mydb3;
將mydb2的字符集修改為gbk
alter database mydb2 character set gbk;
// 備份數據庫
use mydb2;
create table a
(
name varchar(20)
);
// 插入數據 www.2cto.com
insert into a (name) values("zhangsan");
insert into a (name) values("wangwu");
// 備份數據庫
mysqldump -uroot -proot mydb1 > d:\a.sql
這條命令跟mysql是一個級別的,所以不能在mysql下面使用。
// 刪除 mydb2
drop database mydb2;
// 恢復數據庫
create database mydb22;
source d:\a.sql
// source 命令
指定一個sql腳本
關閉報錯聲音
Mysql –uroot –p123456 -b
3、操作表
1. 創建表
創建員工表
Id 整形
name 字符型
sex 字符型或bit型
brithday 日期型
Entry_date 日期型
job 字符型
Salary 小數型
resume 大文本型
創建表:
create table employee
(
id int,
name varchar(20),
gender varchar(6),
brithday date,
entry_date date,
job varchar(20),
salary double,
reshme text
);
2. 修改表 www.2cto.com
在上面員工表的基礎上增加一個image列
alter table employee add image blob;
修改job列,使其長度為60
alter table employee modify job varchar(60);
刪除sex列。
alter table employee drop sex;
表名改為users。
rename table employee to user;
修改表的字符集為utf-8
alter table user character set utf8;
列名name修改為username
alter table user change column name username varchar(20);
查看所有表
show tables;
查看表的創建語句
show create table user;
查看表結構
desc user;
刪除 user 表
drop table user;
4、針對表中數據的增刪改查
針對表中的數據操作無外乎四個:增刪改查 crud create
1. insert語句 www.2cto.com
employee.sql
create table employee
(
id int,
name varchar(20),
sex varchar(10),
birthday date,
salary float,
entry_date date,
resume text
);
// 向員工表插入三條記錄
Insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(1,'zhangsan','male','1987-11-23',1500,'2010-2-18','good boy');
insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(2,'wangwu','male','1988-11-23',1200,'2010-2-18','good boy');
insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(3,'xiaohong','female','1983-11-23',1800,'2010-2-18','good girl');
insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(4,'趙楠','男','1986-11-23',3800,'2011-2-18','絕種好男人');
// 查看表的所有記錄
select * from employee;
// 查看數據使用的所有編碼
show variables like 'character%';
// 修改客戶端的編碼 為 gbk
set character_set_client=gbk;
// 修改結果集的編碼為gbk
set character_set_results=gbk;
// insert 語句的其他寫法
create table a
(
username varchar(20),
password varchar(20)
);
insert into a values('zs','111');
insert into a values('wangwu','2222'),('lisi','3333');
insert a values('aaa','bbb');
insert a (username) values('aaa');
2. update語句 www.2cto.com
將所有員工薪水修改為5000元
update employee set salary=5000;
將姓名為’zhangsan’的員工薪水修改為3000元。
update employee set salary=3000 where name='zhangsan';
將姓名為’lisi’的員工薪水修改為4000元,sex改為female。
update employee set salary=4000,sex='female' where name='wangwu';
將xiaohong的薪水在原有基礎上增加1000元
update employee set salary=salary+1000 where name='xiaohong';
3. delete語句
刪除表中name為’趙楠’的記錄。
delete from employee where name='趙楠';
刪除表中所有記錄。Delete是一條條的刪,如果條目很多的話,會效率很低
delete from employee;
使用truncate刪除表中記錄。 摧毀表再創建表 盡量用這個
truncate employee;
4. select語句
student.sql
create table student(
id int,
name varchar(20),
chinese float,
english float,
math float
);
insert into student(id,name,chinese,english,math) values(1,'張小明',89,78,90);
insert into student(id,name,chinese,english,math) values(2,'李進',67,53,95);
insert into student(id,name,chinese,english,math) values(3,'王五',87,78,77);
insert into student(id,name,chinese,english,math) values(4,'李一',88,98,92);
insert into student(id,name,chinese,english,math) values(5,'李來財',82,84,67);
insert into student(id,name,chinese,english,math) values(6,'張進寶',55,85,45);
insert into student(id,name,chinese,english,math) values(7,'黃蓉',75,65,30);
查詢表中所有學生的信息。
select * from student;
查詢表中所有學生的姓名和對應的英語成績。
select name,english from student;
過濾表中重復數據。
select distinct english from student;
在所有學生分數上加10分特長分。
select name,english+10,chinese+10,math+10 from student;
統計每個學生的總分。
select name,english+chinese+math as sum from student;
使用別名表示學生分數。
where 子句
查詢姓名為李一的學生成績
select * from student where name='李一';
查詢英語成績大於90分的同學
select * from student where english>90;
查詢總分大於200分的所有同學
select name,english+chinese+math sum from student where english+chinese+math>200;
此處可以不用as
運算符 www.2cto.com
查詢英語分數在 80-90之間的同學。
select * from student where english between 65 and 85;
查詢數學分數為89,90,91的同學。
select name,math from student where math in(89,90,91);
查詢所有姓李的學生成績。
select * from student where name like '李%';
// 查詢姓李的兩個字的學生
select * from student where name like '李_';
查詢數學分>80,語文分>80的同學。
select * from student where math>80 and chinese>80;
查詢英語>80或者總分>200的同學
select *,chinese+math+english from student where english>80 or chinese+english+math>200;
order by 子句
對數學成績排序後輸出。
select * from student order by math;
對總分排序後輸出,然後再按從高到低的順序輸出
select *,chinese+math+english from student order by chinese+math+english desc;
對姓李的學生成績排序輸出 order從句是需要放在where從句的後面
select *,chinese+math+english from student where name like '李%' order by chinese+math+english;
合計函數
count
統計一個班級共有多少學生?
select count(*) from student;
統計數學成績大於90的學生有多少個?
select count(*) from student where math>90;
統計總分大於230的人數有多少?
select count(*) from student where chinese+math+english>230;
sum
統計一個班級數學總成績?
select sum(math) from student;
統計一個班級語文、英語、數學各科的總成績
select sum(math),sum(chinese),sum(english) from student;
統計一個班級語文、英語、數學的成績總和
select sum(math+chinese+english) from student;
統計一個班級語文成績平均分
select sum(chinese)/count(*) from student;
缺考的不參與計算
select sum(chinese)/count(chinese) from student;
avg
語文平均分
select avg(chinese) from student;
max/min
語文最 高分
select max(chinese) from student;
select語句(6)
group by
訂單表
create table orders(
id int,
product varchar(20),
price float
);
insert into orders(id,product,price) values(1,'電視',900);
insert into orders(id,product,price) values(2,'洗衣機',100);
insert into orders(id,product,price) values(3,'洗衣粉',90);
insert into orders(id,product,price) values(4,'桔子',9);
insert into orders(id,product,price) values(5,'洗衣粉',90);
將商品歸類
select * from orders group by product;
顯示單類商品總結
select *,sum(price) from orders group by product;
商品分類 顯示單類商品總價大於100的
select *,sum(price) from orders group by product having sum(price)>100;
// 將單價大於20 的商品進行歸類顯示 按照價格排序
select * from orders where price>20 group by product order by price;
5、表的約束
表的約束就是在定義表時,我們可以在創建表的同時為字段增加約束,對將來插入的數據做一些限定
www.2cto.com
一、表的約束
表的約束就是在定義表時,為表中的字段加一些約束條件,對將來插入的數據做一些限定
1. 唯一約束 unique
create table a
(
id int,
username varchar(20) unique,
password varchar(20)
);
insert into a (id,username,password) values(1,'zhangsan','1111');
insert into a (id,username,password) values(2,'wangwu','1111');
2. 非空約束 not null
create table b
(
id int not null,
name varchar(20)
);
insert into b (id,name) values (1,'aaaa');
insert into b (id,name) values (1,'bbbb');
3. 主鍵約束 相當於 唯一約束+非空約束
數據庫中的每張表都應該至少有一個主鍵,通常是id
create table c
(
id int primary key,
name varchar(20)
);
insert into c(id,name) values (1,'aaaa');
insert into c(id,name) values (2,'bbbb');
create table d
(
firstname varchar(20),
lastname varchar(20),
primary key(firstname, lastname)
);
insert into d (firstname, lastname) values ('tom', 'cat');
insert into d (firstname, lastname) values ('tom', 'hks');
create table e
(
id int ,
name varchar(20)
);
insert into e (id,name) values(1,'aaa');
為表加上主鍵約束
alter table e add primary key(id);
此處修改的命令:
修改job列,使其長度為60。
alter table employee modify job varchar(60);
刪除主鍵約束
alter table e drop primary key;
www.2cto.com
4. 定義主鍵自動增長
這個的作用就是讓id鍵隨著條目的增加,自動往上增長。
注意主鍵類型必須是int,只有int類型的才可以自增
create table f
(
id int primary key auto_increment,
name varchar(20)
);
insert into f(name) values ('aaa');
insert into f(id,name) values (11,'bbb');
mysql> select * from f;
+----+------+
| id | name |
+----+------+
| 1 | aaa |
| 2 | aaa |
| 3 | aaa |
| 4 | aaa |
| 11 | bbb |
| 12 | aaa |
| 13 | aaa |
| 14 | aaa |
| 15 | aaa |
| 16 | aaa |
+----+------+
外鍵約束
約束力: 插入的外鍵值必須為被參照列存在的值
被參照表中被參照的數據不允許刪除
注意:外鍵約束並沒有非空和唯一的約束力
創建丈夫表和妻子表
create table husband
(
id int primary key auto_increment,
name varchar(20)
);
create table wife
(
id int primary key auto_increment,
name varchar(20),
husbandid int,
constraint husbandid_FK foreign key(husbandid) references husband(id)
);
www.2cto.com
外界約束:Constraint是定義外鍵約束的,foreign key是外鍵的名稱 參照某張表的主鍵
分別添加兩條記錄
insert into husband(name) values ('laobi');
insert into husband(name) values ('laoyu');
insert into wife(name,husbandid) values ('fengjie',2);
insert into wife(name,husbandid) values ('furongjie',1);
fengjie 找老公
select * from husband where id=(select husbandid from wife where name='fengjie');
delete from husband where name='laoyu';
6 表的關系
1 多對一
創建部門表
create table department
(
id int primary key auto_increment,
name varchar(20)
);
添加三個部門信息
insert into department(name) values('開發部');
insert into department(name) values('銷售部');
insert into department(name) values('人事部');
創建員工表
create table employee
(
id int primary key auto_increment,
name varchar(20),
departmentid int,
constraint departmentid_FK foreign key(departmentid) references department(id)
);
添加六個員工信息
insert into employee(name,departmentid) values ('張三',1);
insert into employee(name,departmentid) values ('李四',1);
insert into employee(name,departmentid) values ('王五',2);
insert into employee(name,departmentid) values ('趙六',3);
insert into employee(name,departmentid) values ('田七',3);
insert into employee(name,departmentid) values ('周八',null);
多表的查詢
查出1號部門所有的員工
select * from employee where departmentid=1;
查出開發部所有的員工
select * from employee where departmentid=(select id from department where name='開發部');
查出趙六在那個部門
select * from department where id=(select departmentid from employee where name='趙六');
--------------------------------------
www.2cto.com
聯合查詢
查出開發部所有的員工
select * from department,employee;
+----+--------+----+------+--------------+
| id | name | id | name | departmentid |
+----+--------+----+------+--------------+
| 1 | 開發部 | 1 | 張三 | 1 |
| 2 | 銷售部 | 1 | 張三 | 1 |
| 3 | 人事部 | 1 | 張三 | 1 |
| 1 | 開發部 | 2 | 李四 | 1 |
| 2 | 銷售部 | 2 | 李四 | 1 |
| 3 | 人事部 | 2 | 李四 | 1 |
| 1 | 開發部 | 3 | 王五 | 2 |
| 2 | 銷售部 | 3 | 王五 | 2 |
| 3 | 人事部 | 3 | 王五 | 2 |
| 1 | 開發部 | 4 | 趙六 | 3 |
| 2 | 銷售部 | 4 | 趙六 | 3 |
| 3 | 人事部 | 4 | 趙六 | 3 |
| 1 | 開發部 | 5 | 田七 | 3 |
| 2 | 銷售部 | 5 | 田七 | 3 |
| 3 | 人事部 | 5 | 田七 | 3 |
| 1 | 開發部 | 6 | 周八 | NULL |
| 2 | 銷售部 | 6 | 周八 | NULL |
| 3 | 人事部 | 6 | 周八 | NULL |
+----+--------+----+------+--------------+
笛卡爾集 多張表的所有記錄的排列組合
笛卡爾集當中有很多部匹配的數據(參照表外鍵列的值和被參照表主鍵的值不一致) 為了方便 以下稱為廢數據
www.2cto.com
加條件去掉廢數據
select * from department,employee where employee.departmentid=department.id;
加條件做查詢
select * from department,employee where employee.departmentid=department.id and department.name='開發部';
優化 給表加別名 只保留需要的數據
select e.* from department d,employee e where e.departmentid=d.id and d.name='開發部';
查出趙六在那個部門
select d.* from department d,employee e where e.departmentid=d.id and e.name='趙六';
2. 多對多
創建老師表
create table teacher
(
id int primary key auto_increment,
name varchar(20)
);
添加三個老師
insert into teacher(name) values ('老方'),('老余'),('老畢');
create table student
(
id int primary key auto_increment,
name varchar(20)
);
添加三個學生
insert into student(name) values('大毛'),('二毛'),('三毛'),('四毛'),('五毛'),('六毛'),('七毛'),('八毛'),('小毛');
www.2cto.com
創建中間表描述關系
create table tea_stu
(
teaid int,
stuid int,
primary key(teaid,stuid),
constraint teaid_FK foreign key(teaid) references teacher(id),
constraint stuid_FK foreign key(stuid) references student(id)
);
添加數據
insert into tea_stu (teaid,stuid) values (1,1),(1,2),(1,4),(1,5),(1,6),(1,8),(2,1),(2,3),(2,5),(2,7),(2,9),(3,2),(3,3),(3,4),
(3,5),(3,6),(3,7),(3,8);
查詢2號老師教過的學生
select s.* from student s,tea_stu ts where ts.stuid=s.id and ts.teaid=2;
查詢老余教過的所有的學生
select s.* from student s,tea_stu ts,teacher t where ts.stuid=s.id and ts.teaid=t.id and t.name='老余';
多表聯合查詢
查詢的結果為笛卡爾集
www.2cto.com
n張表聯合查需要n-1個條件來去掉廢數據
去掉廢數據的條件 參照表的外鍵列=被參照表的主鍵列
再加上查詢條件即可得到結果
3. 一對一
create table person
(
id int primary key auto_increment,
name varchar(20)
);
create table idcard
(
id int primary key,
location varchar(20),
constraint personid_FK foreign key(id) references person(id)
);
www.2cto.com
insert into person (name) values('zhangsan');
insert into person (name) values('lisi');
insert into idcard (id,location) values(2,'天津');
insert into idcard (id,location) values(1,'上海');
查李四的身份證
select idcard.* from person,idcard where idcard.id=person.id and person.name='lisi';