SQL數據庫操作(CURD)


 對數據倉庫的操作(CURD)

 新增

create database db_test;

新增的時候設置編碼:

create database da_test_1 character set utf-8;

 

刪除:

drop database da_test_1;

 

修改:

修改數據倉庫的字符編碼集:

 alter database db_test character set 'gbk';

查看:

獲取所有的數據倉庫:

 show databases;

查看數據倉庫的編碼:

show create database db_test;

選擇數據倉庫:

use db_test;

查看當前選擇的是哪個數據倉庫:

select database();

對數據表的操作(CURD):

新增:

create table emp(

id int primary key auto_increment,

name varchar(50) not null,

workid varchar(32) unique not null,

salary double

);

查看:

查看表結構:

desc emp;

查看該數據倉庫中的所有表:

show tables;

查看表的字符編碼:

 show create table person;

修改:

增加一列字段:

alter table emp add telephone varchar(20);

修改現有列的 數據類型和約束:

alter table emp modify telephone varchar(30) not null;

修改現有列的名稱:

 alter table emp change telephone phone varchar(11);

刪除存在的列:

 alter table emp drop phone;

修改表的名字:

rename table emp to person; 

修改表的字符編碼:

alter table person character set utf8;

刪除:

drop table person;

對表中記錄的操作(CUD):

新增:

insert into (id,name,workid) values (null,'xiaoshitou','P001');

插入數據時的注意事項:

1、值與列一一對應。並且有多少個列,需要寫多個值。如果某一個列沒有值。可以使用null。表示插入空。

2、值的數據類型,與列被定義的數據類型要相匹配。並且值得長度。不能夠超多定義的列的長度。

3、字符串類型:插入字符類型的數據,必須英文的單引號括起來。在mysql中。

4date 時間類型:也必須用英文的單引號括起來,如 ‘yyyyMMdd,yyyy-MM-dd,yyyy/MM/dd’ 。

5、在插入數據的時候,如果某些列可以為null,或者是自動增長的列,或者有默認值的,在插入的時候可以省略。

6、如果給表中的所有列插入數據,這時可以省略表名后面的列名,直接寫values

 

修改:

 

update emp set salary = 15000 where id = 1;

刪除:

 delete from emp where id=1;

刪除表中所有的記錄:

truncate table emp;

delete from emp; truncate table emp;的區別?

前者是一條一條記錄刪除,

后者是先刪除表,然后重新建一張表

對表中記錄的查詢操作(R):

准備工作(創建表和添加數據):

 

create database day02;

use day02;

create table student(
    id int primary key auto_increment,
    name varchar(32) not null,
    age int ,
    gender varchar(10) not null,
    score double not null,
    birthday date
);

insert into student (id,name,age,gender,score,birthday) values(null,'zhangsan',23,'male',98.99,'1990-09-09');
insert into student (id,name,age,gender,score,birthday) values(null,'lisi',23,'',56.99,'1990-02-09');
insert into student (id,name,age,gender,score,birthday) values(null,'王五',24,'',75.99,'1988-01-01');
insert into student (id,name,age,gender,score,birthday) values(null,'趙六',25,'',80.99,'1980-11-12');
insert into student (id,name,age,gender,score,birthday) values(null,'王思聰',null,'',84,null);

數據表中記錄查詢:

查詢表中所有的記錄:

 select * from student;

查詢表中指定列的數據:

 select name,age,score from student;

 

按條件來查詢:

查詢分數大於80的所有學生信息: select * from student where score >80;

過濾重復數據:

獲取學生表中所有的年齡,不能重復

select distinct age from student;

對查詢的結果進行排序:

用學生的age進行降序排序

select * from student order by age desc;

先按照age進行降序排列,年齡相同時,利用分數升序排列:

select * from student order by age desc,score asc;

給列起別名:

可以用as,也可以不用

 select id as 'GongHao',name 'XingMing' from student;

聚合函數:

count函數:

統計個數,統計一共有多少學生:

count的注意點:count在根據指定的列統計的時候,如果這一列中有null 不會被統計在其中。

sum函數:

求和方法:統計該班級所有學生的分數:

select sum(score) from student;

sum的注意點:

1、如果使用sum 多列進行求和的時候,如果某一列中的有null,這一列所在的行中的其他數據不會被加到總和。

2、可以使用mysql 數據庫提供的函數 ifnull(列名,)

3、在數據庫中定義double類型數據,是一個近似值,需要確定准確的位數,這時可以把這一列設計成numeric類型。numeric(數據的總列數,小數位數)

 

avg 函數:

求平均值,求班級的平均年齡

select avg(age) from student;

max, min函數:

求最大值和最小值:求班級的最高分,最低分

select max(score) as '最高分',min(score) '最低分' from student;

group by 分組函數:

准備工作:

create table student(
    name varchar(30),
    sex char(10),
    course varchar(30),
    score int
);

insert into student values('張三', '', '語文', 93);
insert into student values('張三', '','數學', 96);
insert into student values('張三', '', '英語', 99);

insert into student values('李四', '', '語文', 90);
insert into student values('李四', '','數學', 85);

insert into student values('王五', '', '語文', 80);
insert into student values('王五', '','數學', 75);
insert into student values('王五', '', '英語', 70);

表中的數據為:

 

求:每個學生的總成績?

分析:要求每個人的總成績,首先需要按學生姓名來分組,然后對分組的成績求和,就可以完成。

 

求平均分大於80的學生?

select name,avg(score) from student group by name having avg(score) > 80;

select語句執行的順序:

1、from :確定數據源

2、Where : 指定條件對記錄進行篩選

3、Group by : 對記錄進行分組

4、聚合函數:如sumcountavg...

5、Having :對分組的數據,進行篩選

6、計算所有的表達式

7、使用order by 對結果進行排序

8、Select對數據的顯示

數據庫的備份和恢復:

備份:

mysqldump -u root -p mytestdb > e:t/est.sql

恢復:

注意:恢復的時候,首先應該自己創建一個數據庫

create database dbtest;

執行:mysql -u root -p db_test < e:/test.sql

數據庫的多表設計:

多對多的關系:

一個A可以對應多個B,一個B可以對應多個A;比如說兩張表:學生和課程表,一個學生可以選擇多門課程;一門課程也可以被不同的學生選擇。

設計方式:

創建一個中間表C,增加兩列,引入AB表中主鍵,作為外鍵。

外鍵的增加方式:

1、已經創建好的表中,添加外鍵:

alter table C add foreign key(A_id) references A(id);

alter table C add foreign key(B_id) references B(id);

2、在定義表的時候增加外鍵

create table C(

A_id int,

B_id int,

foreign key(A_id) references A(id),

foreign key(B_id) references B(id)

);

一對多的關系:

一個A對應多個B,而多個B只能對應一個A

設計方式:

在多的一張表中增加一列,引入一表中主鍵作為外鍵。

一對一的關系:

一個A只能對應一個B,一個B也只能對應一個A

設計方式:

在任意一張表增加一列,引入另一張表的主鍵作為自己的外鍵。

表設計案例:

需求:設計學生成績管理系統數據表

1、每個教師可以教多門課程

2、每個課程由一個老師負責

3、每門課程可以由多個學生選修

4、每個學生可以選修多門課程

5、學生選修課程要有成績

分析:

教師和課程是一對多的關系,得在課程表中增加一列,引入教師表的主鍵,作為自己的外鍵;

課程和學生是多對多的關系,得創建一張中間表,增加兩列,引入課程和學生的主鍵,作為自己的外鍵;

學生選修課需要成績,所以得在學生和課程的中間表增加一列,存放成績

Sql語句:

創建教師表:

create table teacher(

id int primary key auto_increment,

name varchar(50)

);

創建課程表:

create table course(

id int primary key auto_increment,

name varchar(50),

teacher_id int,

foreign key(teacher_id) references teacher(id)

);

創建學生表:

create table student(

id int primary key auto_increment,

name varchar(50)

);

創建學生課程中間表:

create table studentcourse(

student_id int,

course_id int,

score double,

foreign key(student_id) references student(id),

foreign key(course_id) references course(id)

);

多表查詢:

准備工作:

create table A(
  A_ID int primary key auto_increment,
  A_NAME varchar(20) not null
);
insert into A values(1,'蘋果');
insert into A values(2,'橘子');
insert into A values(3,'香蕉');

create table B( 
   A_ID int primary key auto_increment,
   B_PRICE double
);
insert into B values(1,2.30);
insert into B values(2,3.50);
insert into B values(4,null);

內鏈接:

查詢兩張表中公共的部分:

查詢出每種水果的價格:

方式一:

select a.A_ID,a.A_NAME,B_PRICE from a,b where a.A_ID = b.A_ID;

方式二:

select a.A_ID,a.A_NAME,B_PRICE from a inner join b on a.A_ID = b.A_ID;

 

左外連接:

以左邊的表為基礎去右邊的表查詢,如果有關聯的記錄,就顯示出來,如果沒有對應的記錄就顯示null

select * from a left join b on a.A_ID = B.A_ID;

全連接:

就是左連接和右連接之后,去掉重復數據,就用union,不需要去重就用union all

select a.*,b.* from a left join b on a.A_ID = B.A_ID

UNION

select a.*,b.* from b left join a on a.A_ID = B.A_ID;

不去重:

select a.*,b.* from a left join b on a.A_ID = B.A_ID

UNION ALL

select a.*,b.* from b left join a on a.A_ID = B.A_ID;

事務:

事務就是:在處理一件完整的事情,要么全部成功,要么全部失敗;在數據庫中,執行一組sql語句,要么全部成功,要么全部失敗

 

開啟事務:start transaction;

提交事務:commit;

回滾事務:rollback;

事務的特性(ACID:

 

A:原子性,一件事務不可分割,要么發生,要么全不發生

C:一致性, 事務執行前后一致性,成功則提交,失敗回滾

I:隔離性,一個用戶的事務,不能被其他用戶的事務影響

D:持久性,事務一旦提交,對數據庫的改變就是永久性的

 

如果不考慮事務的隔離性,事務的並發會出現:

臟讀:讀取其他事務未提交的數據

不可重復讀:在一個事務內,多次讀取表中的數據,結果不一致(與臟讀的區別是:讀取的是已經提交的),主要是針對記錄的值(update操作)

虛讀:在一個事務內,多次查詢的表的數據不一致,主要是針對記錄的個數(insertdelete

SQL查詢強化案例:

學生選課信息查詢案例:

准備工作:

CREATE TABLE teacher (
  id int(11) NOT NULL primary key auto_increment,
  name varchar(20) not null unique
 );
CREATE TABLE student (
  id int(11) NOT NULL primary key auto_increment,
  name varchar(20) NOT NULL unique,
  city varchar(40) NOT NULL,
  age int 
) ;
CREATE TABLE course(
  id int(11) NOT NULL primary key auto_increment,
  name varchar(20) NOT NULL unique,
  teacher_id int(11) NOT NULL,
  FOREIGN KEY (teacher_id) REFERENCES teacher (id)
);

CREATE TABLE studentcourse (
   student_id int NOT NULL,
   course_id int NOT NULL,
   score double NOT NULL,
   FOREIGN KEY (student_id) REFERENCES student (id),
   FOREIGN KEY (course_id) REFERENCES course (id)
);

insert into teacher values(null,'關羽');
insert into teacher values(null,'張飛');
insert into teacher values(null,'趙雲');

insert into student values(null,'小王','北京',20);
insert into student values(null,'小李','上海',18);
insert into student values(null,'小周','北京',22);
insert into student values(null,'小劉','北京',21);
insert into student values(null,'小張','上海',22);
insert into student values(null,'小趙','北京',17);
insert into student values(null,'小蔣','上海',23);
insert into student values(null,'小韓','北京',25);
insert into student values(null,'小魏','上海',18);
insert into student values(null,'小明','廣州',20);

insert into course values(null,'語文',1);
insert into course values(null,'數學',1);
insert into course values(null,'生物',2);
insert into course values(null,'化學',2);
insert into course values(null,'物理',2);
insert into course values(null,'英語',3);

insert into studentcourse values(1,1,80);
insert into studentcourse values(1,2,90);
insert into studentcourse values(1,3,85);
insert into studentcourse values(1,4,78);
insert into studentcourse values(2,2,53);
insert into studentcourse values(2,3,77);
insert into studentcourse values(2,5,80);
insert into studentcourse values(3,1,71);
insert into studentcourse values(3,2,70);
insert into studentcourse values(3,4,80);
insert into studentcourse values(3,5,65);
insert into studentcourse values(3,6,75);
insert into studentcourse values(4,2,90);
insert into studentcourse values(4,3,80);
insert into studentcourse values(4,4,70);
insert into studentcourse values(4,6,95);
insert into studentcourse values(5,1,60);
insert into studentcourse values(5,2,70);
insert into studentcourse values(5,5,80);
insert into studentcourse values(5,6,69);
insert into studentcourse values(6,1,76);
insert into studentcourse values(6,2,88);
insert into studentcourse values(6,3,87);
insert into studentcourse values(7,4,80);
insert into studentcourse values(8,2,71);
insert into studentcourse values(8,3,58);
insert into studentcourse values(8,5,68);
insert into studentcourse values(9,2,88);
insert into studentcourse values(10,1,77);
insert into studentcourse values(10,2,76);
insert into studentcourse values(10,3,80);
insert into studentcourse values(10,4,85);
insert into studentcourse values(10,5,83);

-- 1、查詢平均成績大於70分的同學的學號和平均成績

select student_id,FORMAT(avg(score),2) as '平均成績' from studentcourse group by student_id having avg(score) > 70;

-- 2、查詢所有同學的學號、姓名、選課數、總成績

select student.id,student.name,t.countCourse,t.sumScore from student,(

select student_id,count(*) as 'countCourse',sum(score) as 'sumScore' from studentcourse group by student_id

) as t where student.id = t.student_id;

-- 3、查詢學過趙雲老師所教課的同學的學號、姓名

select id,name from student where id in (

select student_id from studentcourse where course_id in(

select id from course where teacher_id = (

select id from teacher where name='趙雲')));

 

-- 4、查詢沒學過關羽老師課的同學的學號、姓名

select id,name from student where id not in (

select student_id from studentcourse where course_id in(

select id from course where teacher_id = (

select id from teacher where name='關羽')));

-- 5、查詢沒有學三門課以上的同學的學號、姓名

select id,name from student where id in (

select student_id from studentcourse group by student_id having count(*) <= 3);

-- 6、查詢各科成績最高和最低的分

select course_id,max(score),min(score) from studentcourse group by course_id;

-- 7、查詢學生信息和平均成績

select student.*,format(t.avgScore,2) '平均分' from student,(

select student_id,avg(score) as 'avgScore' from studentcourse group by student_id) as t

where student.id = t.student_id;

-- 8、查詢上海和北京學生數量

select city,count(*) from student group by city having city in ('北京','上海');

-- 9、查詢不及格的學生信息和課程信息

select student.*,course.* from student,course,(

select student_id,course_id from studentcourse where score < 60) as t

where student.id = t.student_id and course.id = t.course_id;

-- 10、統計每門課程的學生選修人數(超過四人的進行統計)

select course_id,count(*) from studentcourse group by course_id having count(*) > 4;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM