sql -1-基礎

SELECT COUNT(birthdate) FROM people; birthdate 非空的個數

SELECT COUNT(dinstict birthdate) FROM people;  birthdate 非空且不重複的個數

mysql 萬能命名規則:標識符由字母、數字或下劃線(_)組成, 且第一個字符必須是字母或下劃線。

mysql 的關鍵字最好是實用大寫書寫,這樣可以和其他的查詢字區別開。

mysql三大數據類型:

  • 數字類型
    • 整數: tinyint、smallint、mediumint、int、bigint
    • 浮點數: float、double、real、decimal
  • 日期和時間: date、time、datetime、timestamp、year
  • 字符串類型
    • 字符串: char、varchar
    • 文本: tinytext、text、mediumtext、longtext
    • 二進制(可用來存儲圖片、音樂等): tinyblob、blob、mediumblob、longblob

類型的詳細說明

創建數據庫:

create database 數據庫名 [其他選項];
create database samp_db character set gbk; 
character set gbk: 便於在命令提示符下顯示中文

創建表:

create table 表名稱(列聲明);

以創建 students 表爲例, 表中將存放 學號(id)、姓名(name)、性別(sex)、年齡(age)、聯繫電話(tel) 這些內容:

create table students(
		id int unsigned not null auto_increment primary key,
		name char(8) not null,
		sex char(4) not null,
		age tinyint unsigned not null,
		tel char(13) null default "-"
	);

插入數據到表中:

insert [into] 表名 [(列名1, 列名2, 列名3, ...)] values (值1, 值2, 值3, ...);

insert into students values(NULL, "王剛", "男", 20, "13811371377");

有時我們只需要插入部分數據, 或者不按照列的順序進行插入, 可以使用這樣的形式進行插入:

insert into students (name, sex, age) values("孫麗華", "女", 21);

查詢條件:

Where 的一些用法:

=   相同

<> 不相同

<  小於

>  大於

<=   >=

Where 的使用必須是在 from 之後

select title, release_year from films where 

(release_year>=1990 and release_year<2000) 

and (language = 'French' or language='Spanish')

and (gross > 2000000);

每一個條件必須要指定特定的column

SELECT title

FROM films

WHERE release_year

BETWEEN 1994 AND 2000;

BETWEEN 關鍵字包括 1994年和2000年

SELECT name

FROM kids

WHERE age IN (2, 4, 6, 8, 10);

In 關鍵字可以防止你寫更多更大的or語句

Like 模式匹配,   not like 匹配不是和模式匹配的情況

% 匹配0個1個或者多個字符

_ 匹配1個字符

select name from people where name LIKE '_r%';

選擇人名字的第二個字符是r 的人名字

一些集合函數可以在sql中使用

SELECT MAX(budget) FROM films;

還有的函數有:sum, avg 等

select avg(gross) from films where title like 'A%';

集合函數和where 配合使用

使用別名(臨時名稱)

SELECT MAX(budget), MAX(duration) FROM films;

以上的並不會給帶來多少便利,這樣的結果是 max 1222, max 222

如果這種計算很多,你並不知道哪個是哪個的結果,

SELECT MAX(budget) AS max_budget, MAX(duration) AS max_duration FROM films;

如果使用這種寫法,那麼輸出會是 

max_budget:1222, max_duration  222

SQL assumes that if you divide an integer by an integer, you want to get an integer back.

排序:

ORDER BY  默認的是 升序(asc),如果要降序(desc)

SELECT title FROM films ORDER BY release_year DESC;

## Get the title of films released in 2000 or 2012, in the order they were released

select title from films where release_year = 2000 or release_year = 2012 order by release_year

多個條件的排序,第一個爲準,當第一個多個相同大小的時候,第二個排序,依次… 

SELECT birthdate, name FROM people ORDER BY birthdate, name;

更新表中的數據:

update 表名稱 set 列名稱=新值 where 更新條件;
update students set tel=default where id=5;
update students set age=age+1;
update students set name="張偉鵬", age=19 where tel="13288097888";

刪除表中的數據:

delete from 表名稱 where 刪除條件;
delete from students where id=2;
delete from students where age<20;
delete from students; 刪除表中所有數據

對於創建後標的修改(開發中數據庫的migration 實用的較多)

alter table 語句用於創建後對錶的修改 ,

添加列:

alter table 表名 add column 列名 列數據類型 [after 插入位置];
在表的最後追加列:
address: alter table students add column address char(60);

修改列屬性:

alter table 表名 change 列名稱 列新名稱 新數據類型;
alter table `students ` modify column `tel` varchar(255) default null;

刪除列:

alter table 表名 drop column 列名稱;
alter table students drop column birthday;

重命名:

alter table 表名 change 新表名;
alter table `students ` change `task_status` `status` varchar(255);

刪除整張表/數據庫:

drop database 數據庫名;
drop table workmates;

聚類

GROUP BY

SELECT sex, count(*) FROM employees GROUP BY sex; count(*) 統計每一個group 中的sex的個數

select release_year, max(budget) from films group by release_year order by release_year 

select country, sum(budget) from films group by country;
select country,release_year,min(gross) from films group by country,release_year order by country, release_year

GROUP BY 聚合函數和 WHERE 不能同時使用(groupby 之後不能在使用where),如果在order by 之後需要使用過濾的一些操作,

那麼你需要使用 HAVING , HAVING 和where 有相同的功能,HAVING後面跟着的是 條件

-- 返回1990年後的每一年的平均 budge, gross, 且平均budge 大於60 million 刀

select release_year, avg(budget) as avg_budget, avg(gross) as avg_gross from films where release_year > 1990 group by release_year having avg(budget) > 60000000 order by avg(gross) desc

select country, avg(budget) as avg_budget,avg(gross) as avg_gross from films group by country having count(films) > 10 order by country limit 5

Join

以上目前接觸到的都是對於單張表的操作,但是有時候會遇到多個表的操作,需要將多個表結合,

第一張表:

第二張表:

films表的id 對應這reviews 表的film_id 根據這個字段可以將兩張表join

SELECT title, imdb_score FROM films JOIN reviews ON films.id = reviews.film_id;

Inner join :以共同存在的鍵爲基礎,取出這些共同存在鍵的內容將其合併,不存在共同鍵的行不在結果表中,合併會產生新的

select * from cities inner join countries on cities.country_code = countries.code

On 的意思是指定鍵去join

select countries.name as country, cities.name as city, countries.region from cities

inner join countries

on cities.country_code = countries.code

不僅在columns 中使用 別名,在表中也可以使用別名

SELECT c.code AS country_code, c.name, e.year, e.inflation_rate

FROM countries AS c

inner JOIN economies as e

ON c.code = e.code;inn

多個條件,多張表join

select c.code, c.name, c.region, e.year, p.fertility_rate, e.unemployment_rate from countries as c

inner join populations as p

on c.code = p.country_code

INNER JOIN economies AS e

on c.code = e.code and p.year = e.year

使用using(id) 代替 on c.code = e.code and p.year = e.year 合併表

SELECT c.name AS country, continent, l.name AS language, l.official

FROM countries AS c inner JOIN languages AS l using(code);

自我join,自己和自己join

SELECT p1.country AS country1, p2.country AS country2, p1.continent

FROM prime_ministers AS p1

INNER JOIN prime_ministers AS p2

ON p1.continent = p2.continent AND p1.country <> p2.country

LIMIT 13;

使用 when else 語句,(if else 語句)

SELECT name, continent, indep_year,

    CASE WHEN indep_year < 1900 THEN 'before 1900'

         WHEN indep_year <= 1930 THEN 'between 1900 and 1930'

         ELSE 'after 1930' END

         AS indep_year_group

FROM states

ORDER BY indep_year_group;

在使用上面所談到的self join 的時候,當共同條件有多個的時候, 假如有以下情況,那麼在join 的時候

id = 1, year = 2019

id = 1,    year  = 2018

那麼在 self join 的時候就會出現4條記錄

id = 1, year_1 = 2019,   year_2  = 2018

id = 1,    year_1  = 2019 , year_1  = 2019

id = 1,  year_1 = 2018,   year_2  = 2018

id = 1,    year_2  = 2018,  year_1  = 2019

這個時候就需要多添加一條語句,選出你需要的這兩列的關係的那些數據

SELECT p1.country_code, 

       p1.size AS size2010,

       p2.size AS size2015

FROM populations AS p1

inner JOIN populations AS p2

ON  p1.country_code = p2.country_code

    and p1.year = p2.year - 5

使用 CASE 和 WHEN, THEN, ELSE, 及 END 定義新字段

SELECT name, continent, code, surface_area,
        -- first case
    CASE WHEN surface_area > 2000000 THEN 'large'
        -- second case
        WHEN surface_area > 350000 THEN 'medium'
        -- else clause + end
        ELSE 'small' END
        AS geosize_group
FROM countries;

產生一個新值,且這個值在不同條件下設置不同的值

into 關鍵字,設置select 的字段,存在into 指定的表名中

SELECT country_code, size,
    CASE WHEN size > 50000000 THEN 'large'
        WHEN size > 1000000 THEN 'medium'
        ELSE 'small' END
        AS popsize_group
        
into pop_plus
FROM populations
WHERE year = 2015;

select * from pop_plus
這裏就可以將之前存儲的字段都去出來

LEFT join RIGHT Join, FULL join 這三個都稱之爲是 OUTER join

LEFT join:會有幾種特殊情況

RIGHT Join 和 LEFT Join 相同的情況,會有相似的處理方式,

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章