MySQL基礎(chǔ)SQL語句

一:SQL結(jié)構(gòu)化查詢語言分類

DDL:數(shù)據(jù)定義語言
DCL:數(shù)據(jù)控制語言
DML:數(shù)據(jù)操作語言
DQL:數(shù)據(jù)檢索語言

二:DDL數(shù)據(jù)定義語言

2.1 庫定義

2.1.1 創(chuàng)建庫

mysql> create database cxytest charset utf8mb4;

2.1.2 刪除數(shù)據(jù)庫(生產(chǎn)中禁止使用)

mysql> drop database cxytest;

2.1.3 修改字符集

mysql> alter database test charset utf8mb4;

2.1.4 查看創(chuàng)建的數(shù)據(jù)庫

mysql> show create database cxytest;
+----------+---------------------------------------------------------------------+
| Database | Create Database                                                     |
+----------+---------------------------------------------------------------------+
| cxytest  | CREATE DATABASE `cxytest` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

2.2 表定義

2.2.1 列屬性

數(shù)據(jù)類型

數(shù)字類型:
tinyint       1個字節(jié)        0-255                       3位數(shù)
int           3個字節(jié)        0-4294967295                10位數(shù)   

說明:手機號碼是無法存儲到int的,一般是使用char類型來存儲手機號

字符類型:
char(10)
      定長10位,存儲空間1次性分配,如果字符沒有寫滿10位,也分配10位,可以分配255個;char(255)

varchar(10)
      可變長10位,按需分配空間,寫幾位占幾位,可以分配65535個;char(65535)

enum('m','f') 枚舉類型
      比較適合于將來此列的值是固定范圍內(nèi)的特點,可以使用enum,可以很大程度的優(yōu)化我們的索引結(jié)構(gòu)
時間類型:
datetime  
      時間范圍從 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999
timestamp
      時間范圍從1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999

約束

primary key 主鍵:非空,唯一
unique key:唯一鍵;不重復(fù)
not null:非空
unsigned:無符號,數(shù)字類型的列,非負數(shù)

其他屬性

default 默認值
auto_increment 自增長
comment 注釋

2.2.2 表屬性

engine   引擎
charset  字符集
comment  注釋

2.3 表創(chuàng)建

2.3.1 創(chuàng)建語法

語法:create table 表名(
列1 屬性(數(shù)據(jù)類型,約束,其他屬性)
列2 屬性
列3 屬性
)

2.3.2 規(guī)范建表的例子

USE test;                                                                          """切換到要建表的數(shù)據(jù)庫下
CREATE TABLE stu(
id      INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '學(xué)號',                    """int整型;非空;主鍵;自增長;注釋"""
sname   VARCHAR(20) NOT NULL COMMENT '姓名',                                       """varchar字符串;非空;注釋"""
sage    TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年齡',                        """tinyint整型;unsigned:無符號,數(shù)字類型的列,非負數(shù);非空;有默認值為0;注釋"""
sgender ENUM('男','女','未知') NOT NULL DEFAULT '未知',                             """枚舉類型; 非空,有默認值'未知' """
sfz     CHAR(18)  NOT NULL UNIQUE COMMENT '身份證',                                """char字符串定長18位;非空;unique:唯一鍵不重復(fù);注釋"""
intime   TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '入學(xué)時間'                       """timestamp時間類型;非空;默認值為當前時間;注釋"""
)ENGINE=INNODB CHARSET=utf8mb4 COMMENT '學(xué)生表';                                   """表引擎innodb;字符集utf8mb4;注釋"""

建表規(guī)范:

  • 表名小寫
  • 不能是數(shù)字開頭
  • 注意字符集和存儲引擎
  • 選擇合適的數(shù)據(jù)類型
  • 每個列都要有注釋
  • 每個列設(shè)置為非空,無法保證非空的,用0來填充

2.3.3 刪表(生產(chǎn)中禁止使用此命令)

mysql > drop table stu;

2.3.4 修改表

在stu表中添加qq列

ALTER TABLE stu ADD qq VARCHAR(20) NOT NULL UNIQUE COMMENT 'qq號';

在sname后加微信列

ALTER TABLE stu ADD wechat VARCHAR(64) NOT NULL UNIQUE COMMENT '微信號' AFTER sname;

在id列前加一個新列num

ALTER TABLE stu ADD num INT NOT NULL COMMENT '數(shù)字' FIRST;

刪除剛才添加的列(危險)

ALTER TABLE stu DROP num;

修改sname數(shù)據(jù)類型的屬性

ALTER TABLE stu MODIFY sname VARCHAR(128) NOT NULL;

修改sgender改為列名sg char(3) not null default '未知'

ALTER TABLE stu CHANGE sgender sg CHAR(3) NOT NULL DEFAULT '未知'

2.3.5 查看表屬性

查看表中有哪些列以及其屬性

mysql> desc stu;
+--------+---------------------+------+-----+-------------------+----------------+
| Field  | Type                | Null | Key | Default           | Extra          |
+--------+---------------------+------+-----+-------------------+----------------+
| id     | int(11)             | NO   | PRI | NULL              | auto_increment |
| sname  | varchar(128)        | NO   |     | NULL              |                |
| wechat | varchar(64)         | NO   | UNI | NULL              |                |
| sage   | tinyint(3) unsigned | NO   |     | 0                 |                |
| sg     | char(3)             | NO   |     | 未知              |                |
| sfz    | char(18)            | NO   | UNI | NULL              |                |
| intime | timestamp           | NO   |     | CURRENT_TIMESTAMP |                |
| qq     | varchar(20)         | NO   | UNI | NULL              |                |
+--------+---------------------+------+-----+-------------------+----------------+
8 rows in set (0.00 sec)

查看數(shù)據(jù)庫里有哪些表

mysql> show tables;
+-------------------+
| Tables_in_cxytest |
+-------------------+
| stu               |
+-------------------+
1 row in set (0.00 sec)

查看創(chuàng)建表時的語句

mysql> show create table stu;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| stu   | CREATE TABLE `stu` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '學(xué)號',
  `sname` varchar(128) NOT NULL,
  `wechat` varchar(64) NOT NULL COMMENT '微信號',
  `sage` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年齡',
  `sg` char(3) NOT NULL DEFAULT '未知',
  `sfz` char(18) NOT NULL COMMENT '身份證',
  `intime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入學(xué)時間',
  `qq` varchar(20) NOT NULL COMMENT 'qq號',
  PRIMARY KEY (`id`),
  UNIQUE KEY `sfz` (`sfz`),
  UNIQUE KEY `qq` (`qq`),
  UNIQUE KEY `wechat` (`wechat`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='學(xué)生表'      

三:DCL數(shù)據(jù)控制語言

grant
revoke
在mysql基礎(chǔ)管理里有介紹

四:DML 對表中的數(shù)據(jù)進行增刪改

4.1 增 insert

最標準的insert語句

INSERT INTO stu(id,sname,sage,sgender,sfz,intime)
VALUES
(1,'張三',20,'男',1111134454,NOW());

省事的寫法

INSERT INTO stu
VALUES (2,'趙四',29,'女','8796554678',NOW());

針對性的錄入

INSERT INTO stu(sname,sfz)
VALUES ("王鐵柱",9808988332)

同時錄入多行數(shù)據(jù)

INSERT INTO stu(sname,sage,sg,sfz,intime)
VALUES
('田二妞',29,'女','6549890',NOW()),
('支付寶',76,'男',4321908,NOW()),
('王大富',33,'未知','23213434',NOW());

4.2 刪(謹慎使用)delete

DELETE FROM stu WHERE id=4;

4.3改update

修改表里的內(nèi)容,一定要跟where字句一起使用

UPDATE stu SET sname='張三豐' WHERE id=1;

五:DQL數(shù)據(jù)檢索語言(select)

5.1 單獨使用,查看系統(tǒng)參數(shù)

查看系統(tǒng)參數(shù)

SELECT @@port;
SELECT @@datadir;
SELECT @@basedir;
SELECT @@server_id;

5.2 select 函數(shù)()

SELECT DATABASE();                 ''''查看當前使用的哪個數(shù)據(jù)庫''''
SELECT NOW();                      ''''查看當前系統(tǒng)時間''''
SELECT USER();                     ''''查看當前登錄的用戶是誰''''

concat字符串的拼接

select concat(user,'@','host') from mysql.user;
image.png

group_concat:將列轉(zhuǎn)行,將幾列數(shù)據(jù)轉(zhuǎn)成一行顯示

SELECT GROUP_CONCAT(USER,'@','host') FROM mysql.user;
image.png

5.3 select-from 子句

語法

select 列1,列2,列3 from 表名;

查詢stu中所有的數(shù)據(jù)(不要對大表進行操作)

SELECT * FROM stu;

查詢stu表中,學(xué)生姓名和入學(xué)時間

SELECT sname,intime FROM stu;
image.png

5.4 where子句

查詢中國所有的城市信息

SELECT * FROM city WHERE COUNTRYCODE='CHN';

查詢北京市的信息

SELECT * FROM city WHERE NAME='peking'

查詢甘肅省所有城市的信息

SELECT * FROM city WHERE DISTRICT='GANSU'

查詢世界上人口小于100w的城市

SELECT * FROM city WHERE population<1000000;

查詢中國人口大于500w的城市

使用AND用法

SELECT * FROM city WHERE Countrycode='CHN' AND population>5000000

查詢中國或者美國的城市信息

使用or用法

SELECT * FROM city WHERE countrycode='CHN' OR COUNTRYCODE='USA';

使用in()用法

SELECT * FROM city WHERE countrycode IN('CHN','USA')

查詢世界上人口數(shù)量大于100w小于200w的城市信息

2種寫法

SELECT * FROM city WHERE population>1000000 AND population<2000000
SELECT * FROM city WHERE population BETWEEN 1000000 AND 2000000

模糊查詢

SELECT * FROM city WHERE district LIKE 'guang%'
'''''不要使用全模糊查詢,百分號不能放在字符最前面,這樣會影響數(shù)據(jù)庫速度'''

5.5 group by+聚合函數(shù)

  • 作用:將統(tǒng)計好的數(shù)據(jù),按照by后面的條件進行分組排列
max()                        最大值
min()                        最小值
avg()                        平均值
sum()                        總和
count()                      個數(shù)
group_councat()              列轉(zhuǎn)行

統(tǒng)計世界上每個國家的總?cè)丝跀?shù)sum()

SELECT countrycode,SUM(population) FROM city GROUP BY countrycode;

統(tǒng)計中國各個省的總?cè)丝跀?shù)量sum()

SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district;

統(tǒng)計世界上每個國家的城市個數(shù)count()

SELECT countrycode,COUNT(NAME) FROM city GROUP BY countrycode

統(tǒng)計中國每個省的城市列表group_concat

SELECT district,GROUP_CONCAT(NAME) FROM city WHERE countrycode='CHN' GROUP BY district;

5.6 having 子句

  • 作用:運行在group by后面,跟where的作用一樣,只是優(yōu)先級比where低

統(tǒng)計中國每個省的總?cè)丝跀?shù),只打印總?cè)丝跀?shù)小于100w的

SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district HAVING SUM(population)<1000000

5.7 order by +limit

  • 作用:排序,默認從小到大,從大到小需要加desc
    order by 條件 desc;
    limit 顯示數(shù)據(jù)中的某幾列
    limit 3:顯示前3行
    limit 3,7:跳過前3行之后,從第4行開始顯示到第7行

查看中國所有的城市,并按人口數(shù)進行排序(從大到小)

SELECT NAME,population  FROM city WHERE countrycode='CHN' ORDER BY population DESC;

統(tǒng)計中國各個省的總?cè)丝跀?shù)量,按照總?cè)丝趶拇蟮叫∨判?/h4>
SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district ORDER BY SUM(population) DESC;

統(tǒng)計中國每個省的總?cè)丝?找到總?cè)丝诖笥?00w的,并按總?cè)丝趶拇蟮叫∨判?只顯示前三名

SELECT district,SUM(population) FROM city WHERE countrycode='CHN' GROUP BY district HAVING SUM(population)>5000000 ORDER BY SUM(population) DESC LIMIT 3;

5.8 distinct 去重復(fù)查詢

SELECT countrycode FROM city ;
SELECT DISTINCT(countrycode) FROM city;

5.9 聯(lián)合查詢-union all

查詢中國或者美國城市信息

SELECT * FROM city WHERE countrycode='CHN'
UNION ALL
SELECT * FROM city WHERE COUNTRYCODE='USA'

6.0 子句的優(yōu)先級順序

select f1,f2......
from  表
where 過濾條件
group by 分組條件
having  過濾條件
order by 排序條件
limit 限制條件
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容