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 相同的情況,會有相似的處理方式,